xref: /minix3/bin/sh/syntax.c (revision d90bee97498b3043241050f61aed100786c59df4)
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