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