1 /*	$NetBSD: syntax.c,v 1.1 2004/01/17 17:38:12 dsl Exp $	*/
2 
3 #include "shell.h"
4 #include "syntax.h"
5 #include "parser.h"
6 #include "shinstance.h"
7 
8 #ifdef _MSC_VER /* doesn't implement the fancy initializers I think... */
9 
10 char basesyntax[257] = {CSHEOF};
11 char dqsyntax[257] = {CSHEOF};
12 char sqsyntax[257] = {CSHEOF};
13 char arisyntax[257] = {CSHEOF};
14 char is_type[257] = {0};
15 
init_syntax(void)16 void init_syntax(void)
17 {
18     char *tab;
19     int i;
20 
21 #define ndx(ch) (ch + 1 - CHAR_MIN)
22 #define set(ch, val) tab[ndx(ch)] = val
23 #define set_range(s, e, val) for (i = ndx(s); i <= ndx(e); i++) tab[i] = val
24 
25     /*basesyntax*/
26     tab = basesyntax;
27     set_range(CTL_FIRST, CTL_LAST, CCTL);
28     set('\n', CNL);
29     set('\\', CBACK);
30     set('\'', CSQUOTE);
31     set('"', CDQUOTE);
32     set('`', CBQUOTE);
33     set('$', CVAR);
34     set('}', CENDVAR);
35     set('<', CSPCL);
36     set('>', CSPCL);
37     set('(', CSPCL);
38     set(')', CSPCL);
39     set(';', CSPCL);
40     set('&', CSPCL);
41     set('|', CSPCL);
42     set(' ', CSPCL);
43     set('\t', CSPCL);
44 
45     tab = dqsyntax;
46     set_range(CTL_FIRST, CTL_LAST, CCTL);
47     set('\n', CNL);
48     set('\\', CBACK);
49     set('"', CDQUOTE);
50     set('`', CBQUOTE);
51     set('$', CVAR);
52     set('}', CENDVAR);
53     /* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */
54     set('!', CCTL);
55     set('*', CCTL);
56     set('?', CCTL);
57     set('[', CCTL);
58     set('=', CCTL);
59     set('~', CCTL);
60     set(':', CCTL);
61     set('/', CCTL);
62     set('-', CCTL);
63 
64     tab = sqsyntax;
65     set_range(CTL_FIRST, CTL_LAST, CCTL);
66     set('\n', CNL);
67     set('\'', CSQUOTE);
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 
79     tab = arisyntax;
80     set_range(CTL_FIRST, CTL_LAST, CCTL);
81     set('\n', CNL);
82     set('\\', CBACK);
83     set('`', CBQUOTE);
84     set('\'', CSQUOTE);
85     set('"', CDQUOTE);
86     set('$', CVAR);
87     set('}', CENDVAR);
88     set('(', CLP);
89     set(')', CRP);
90 
91     tab = is_type;
92     set_range('0', '9', ISDIGIT);
93     set_range('a', 'z', ISLOWER);
94     set_range('A', 'Z', ISUPPER);
95     set('_', ISUNDER);
96     set('#', ISSPECL);
97     set('?', ISSPECL);
98     set('$', ISSPECL);
99     set('!', ISSPECL);
100     set('-', ISSPECL);
101     set('*', ISSPECL);
102     set('@', ISSPECL);
103 }
104 
105 #else /* !_MSC_VER */
106 
107 #if CWORD != 0
108 #error initialisation assumes 'CWORD' is zero
109 #endif
110 
111 #define ndx(ch) (ch + 1 - CHAR_MIN)
112 #define set(ch, val) [ndx(ch)] = val,
113 #define set_range(s, e, val) [ndx(s) ... ndx(e)] = val,
114 
115 /* syntax table used when not in quotes */
116 const char basesyntax[257] = { CSHEOF,
117     set_range(CTL_FIRST, CTL_LAST, CCTL)
118     set('\n', CNL)
119     set('\\', CBACK)
120     set('\'', CSQUOTE)
121     set('"', CDQUOTE)
122     set('`', CBQUOTE)
123     set('$', CVAR)
124     set('}', CENDVAR)
125     set('<', CSPCL)
126     set('>', CSPCL)
127     set('(', CSPCL)
128     set(')', CSPCL)
129     set(';', CSPCL)
130     set('&', CSPCL)
131     set('|', CSPCL)
132     set(' ', CSPCL)
133     set('\t', CSPCL)
134 };
135 
136 /* syntax table used when in double quotes */
137 const char dqsyntax[257] = { CSHEOF,
138     set_range(CTL_FIRST, CTL_LAST, CCTL)
139     set('\n', CNL)
140     set('\\', CBACK)
141     set('"', CDQUOTE)
142     set('`', CBQUOTE)
143     set('$', CVAR)
144     set('}', CENDVAR)
145     /* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */
146     set('!', CCTL)
147     set('*', CCTL)
148     set('?', CCTL)
149     set('[', CCTL)
150     set('=', CCTL)
151     set('~', CCTL)
152     set(':', CCTL)
153     set('/', CCTL)
154     set('-', CCTL)
155 };
156 
157 /* syntax table used when in single quotes */
158 const char sqsyntax[257] = { CSHEOF,
159     set_range(CTL_FIRST, CTL_LAST, CCTL)
160     set('\n', CNL)
161     set('\'', CSQUOTE)
162     /* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */
163     set('!', CCTL)
164     set('*', CCTL)
165     set('?', CCTL)
166     set('[', CCTL)
167     set('=', CCTL)
168     set('~', CCTL)
169     set(':', CCTL)
170     set('/', CCTL)
171     set('-', CCTL)
172 };
173 
174 /* syntax table used when in arithmetic */
175 const char arisyntax[257] = { CSHEOF,
176     set_range(CTL_FIRST, CTL_LAST, CCTL)
177     set('\n', CNL)
178     set('\\', CBACK)
179     set('`', CBQUOTE)
180     set('\'', CSQUOTE)
181     set('"', CDQUOTE)
182     set('$', CVAR)
183     set('}', CENDVAR)
184     set('(', CLP)
185     set(')', CRP)
186 };
187 
188 /* character classification table */
189 const char is_type[257] = { 0,
190     set_range('0', '9', ISDIGIT)
191     set_range('a', 'z', ISLOWER)
192     set_range('A', 'Z', ISUPPER)
193     set('_', ISUNDER)
194     set('#', ISSPECL)
195     set('?', ISSPECL)
196     set('$', ISSPECL)
197     set('!', ISSPECL)
198     set('-', ISSPECL)
199     set('*', ISSPECL)
200     set('@', ISSPECL)
201 };
202 #endif /* !_MSC_VER */
203