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