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