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