1 /* $NetBSD: syntax.c,v 1.5 2017/08/21 13:20:49 kre Exp $ */ 2 3 #include <sys/cdefs.h> 4 __RCSID("$NetBSD: syntax.c,v 1.5 2017/08/21 13:20:49 kre Exp $"); 5 6 #include <limits.h> 7 #include "shell.h" 8 #include "syntax.h" 9 #include "parser.h" 10 11 #if CWORD != 0 12 #error initialisation assumes 'CWORD' is zero 13 #endif 14 15 #define ndx(ch) (ch + 1 - CHAR_MIN) 16 #define set(ch, val) [ndx(ch)] = val, 17 #define set_range(s, e, val) [ndx(s) ... ndx(e)] = val, 18 19 /* syntax table used when not in quotes */ 20 const char basesyntax[257] = { CEOF, 21 set_range(CTL_FIRST, CTL_LAST, CCTL) 22 set('\n', CNL) 23 set('\\', CBACK) 24 set('\'', CSQUOTE) 25 set('"', CDQUOTE) 26 set('`', CBQUOTE) 27 set('$', CVAR) 28 set('}', CENDVAR) 29 set('<', CSPCL) 30 set('>', CSPCL) 31 set('(', CSPCL) 32 set(')', CSPCL) 33 set(';', CSPCL) 34 set('&', CSPCL) 35 set('|', CSPCL) 36 set(' ', CSPCL) 37 set('\t', CSPCL) 38 }; 39 40 /* syntax table used when in double quotes */ 41 const char dqsyntax[257] = { CEOF, 42 set_range(CTL_FIRST, CTL_LAST, CCTL) 43 set('\n', CNL) 44 set('\\', CBACK) 45 set('"', CDQUOTE) 46 set('`', CBQUOTE) 47 set('$', CVAR) 48 set('}', CENDVAR) 49 /* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */ 50 set('!', CCTL) 51 set('*', CCTL) 52 set('?', CCTL) 53 set('[', CCTL) 54 set('=', CCTL) 55 set('~', CCTL) 56 set(':', CCTL) 57 set('/', CCTL) 58 set('-', CCTL) 59 }; 60 61 /* syntax table used when in single quotes */ 62 const char sqsyntax[257] = { CEOF, 63 set_range(CTL_FIRST, CTL_LAST, CCTL) 64 set('\n', CNL) 65 set('\'', CSQUOTE) 66 set('\\', CSBACK) 67 /* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */ 68 set('!', CCTL) 69 set('*', CCTL) 70 set('?', CCTL) 71 set('[', CCTL) 72 set('=', CCTL) 73 set('~', CCTL) 74 set(':', CCTL) 75 set('/', CCTL) 76 set('-', CCTL) 77 }; 78 79 /* syntax table used when in arithmetic */ 80 const char arisyntax[257] = { CEOF, 81 set_range(CTL_FIRST, CTL_LAST, CCTL) 82 set('\n', CNL) 83 set('\\', CBACK) 84 set('`', CBQUOTE) 85 set('\'', CSQUOTE) 86 set('"', CDQUOTE) 87 set('$', CVAR) 88 set('}', CENDVAR) 89 set('(', CLP) 90 set(')', CRP) 91 }; 92 93 /* character classification table */ 94 const char is_type[257] = { 0, 95 set_range('0', '9', ISDIGIT) 96 set_range('a', 'z', ISLOWER) 97 set_range('A', 'Z', ISUPPER) 98 set('_', ISUNDER) 99 set('#', ISSPECL) 100 set('?', ISSPECL) 101 set('$', ISSPECL) 102 set('!', ISSPECL) 103 set('-', ISSPECL) 104 set('*', ISSPECL) 105 set('@', ISSPECL) 106 set(' ', ISSPACE) 107 set('\t', ISSPACE) 108 set('\n', ISSPACE) 109 }; 110