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