summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'sh/syntax.c')
-rw-r--r--sh/syntax.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/sh/syntax.c b/sh/syntax.c
new file mode 100644
index 000000000..094f6745d
--- /dev/null
+++ b/sh/syntax.c
@@ -0,0 +1,102 @@
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 <limits.h>
7
8#if CWORD != 0
9#error initialisation assumes 'CWORD' is zero
10#endif
11
12#define ndx(ch) (ch + 1 - CHAR_MIN)
13#define set(ch, val) [ndx(ch)] = val,
14#define set_range(s, e, val) [ndx(s) ... ndx(e)] = val,
15
16/* syntax table used when not in quotes */
17const char basesyntax[257] = { CEOF,
18 set_range(CTL_FIRST, CTL_LAST, CCTL)
19 set('\n', CNL)
20 set('\\', CBACK)
21 set('\'', CSQUOTE)
22 set('"', CDQUOTE)
23 set('`', CBQUOTE)
24 set('$', CVAR)
25 set('}', CENDVAR)
26 set('<', CSPCL)
27 set('>', CSPCL)
28 set('(', CSPCL)
29 set(')', CSPCL)
30 set(';', CSPCL)
31 set('&', CSPCL)
32 set('|', CSPCL)
33 set(' ', CSPCL)
34 set('\t', CSPCL)
35};
36
37/* syntax table used when in double quotes */
38const char dqsyntax[257] = { CEOF,
39 set_range(CTL_FIRST, CTL_LAST, CCTL)
40 set('\n', CNL)
41 set('\\', CBACK)
42 set('"', CDQUOTE)
43 set('`', CBQUOTE)
44 set('$', CVAR)
45 set('}', CENDVAR)
46 /* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */
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 set('-', CCTL)
56};
57
58/* syntax table used when in single quotes */
59const char sqsyntax[257] = { CEOF,
60 set_range(CTL_FIRST, CTL_LAST, CCTL)
61 set('\n', CNL)
62 set('\'', CSQUOTE)
63 /* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */
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 set('-', CCTL)
73};
74
75/* syntax table used when in arithmetic */
76const char arisyntax[257] = { CEOF,
77 set_range(CTL_FIRST, CTL_LAST, CCTL)
78 set('\n', CNL)
79 set('\\', CBACK)
80 set('`', CBQUOTE)
81 set('\'', CSQUOTE)
82 set('"', CDQUOTE)
83 set('$', CVAR)
84 set('}', CENDVAR)
85 set('(', CLP)
86 set(')', CRP)
87};
88
89/* character classification table */
90const char is_type[257] = { 0,
91 set_range('0', '9', ISDIGIT)
92 set_range('a', 'z', ISLOWER)
93 set_range('A', 'Z', ISUPPER)
94 set('_', ISUNDER)
95 set('#', ISSPECL)
96 set('?', ISSPECL)
97 set('$', ISSPECL)
98 set('!', ISSPECL)
99 set('-', ISSPECL)
100 set('*', ISSPECL)
101 set('@', ISSPECL)
102};