1 /* $NetBSD: syntax.c,v 1.6 2018/07/20 22:47:26 kre Exp $ */ 2 3 #include <sys/cdefs.h> 4 __RCSID("$NetBSD: syntax.c,v 1.6 2018/07/20 22:47:26 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 set(']', CCTL) 60 }; 61 62 /* syntax table used when in single quotes */ 63 const char sqsyntax[257] = { CEOF, 64 set_range(CTL_FIRST, CTL_LAST, CCTL) 65 set('\n', CNL) 66 set('\'', CSQUOTE) 67 set('\\', CSBACK) 68 /* ':/' for tilde expansion, '-]' for [a\-x] pattern ranges */ 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 set('-', CCTL) 78 set(']', CCTL) 79 }; 80 81 /* syntax table used when in arithmetic */ 82 const char arisyntax[257] = { CEOF, 83 set_range(CTL_FIRST, CTL_LAST, CCTL) 84 set('\n', CNL) 85 set('\\', CBACK) 86 set('`', CBQUOTE) 87 set('\'', CSQUOTE) 88 set('"', CDQUOTE) 89 set('$', CVAR) 90 set('}', CENDVAR) 91 set('(', CLP) 92 set(')', CRP) 93 }; 94 95 /* character classification table */ 96 const char is_type[257] = { 0, 97 set_range('0', '9', ISDIGIT) 98 set_range('a', 'z', ISLOWER) 99 set_range('A', 'Z', ISUPPER) 100 set('_', ISUNDER) 101 set('#', ISSPECL) 102 set('?', ISSPECL) 103 set('$', ISSPECL) 104 set('!', ISSPECL) 105 set('-', ISSPECL) 106 set('*', ISSPECL) 107 set('@', ISSPECL) 108 set(' ', ISSPACE) 109 set('\t', ISSPACE) 110 set('\n', ISSPACE) 111 }; 112