| /* $NetBSD: syntax.c,v 1.1 2004/01/17 17:38:12 dsl Exp $ */ |
| |
| #include "shell.h" |
| #include "syntax.h" |
| #include "parser.h" |
| #include <limits.h> |
| |
| #if CWORD != 0 |
| #error initialisation assumes 'CWORD' is zero |
| #endif |
| |
| #define ndx(ch) (ch + 1 - CHAR_MIN) |
| #define set(ch, val) [ndx(ch)] = val, |
| #define set_range(s, e, val) [ndx(s) ... ndx(e)] = val, |
| |
| /* syntax table used when not in quotes */ |
| const char basesyntax[257] = { CEOF, |
| set_range(CTL_FIRST, CTL_LAST, CCTL) |
| set('\n', CNL) |
| set('\\', CBACK) |
| set('\'', CSQUOTE) |
| set('"', CDQUOTE) |
| set('`', CBQUOTE) |
| set('$', CVAR) |
| set('}', CENDVAR) |
| set('<', CSPCL) |
| set('>', CSPCL) |
| set('(', CSPCL) |
| set(')', CSPCL) |
| set(';', CSPCL) |
| set('&', CSPCL) |
| set('|', CSPCL) |
| set(' ', CSPCL) |
| set('\t', CSPCL) |
| }; |
| |
| /* syntax table used when in double quotes */ |
| const char dqsyntax[257] = { CEOF, |
| set_range(CTL_FIRST, CTL_LAST, CCTL) |
| set('\n', CNL) |
| set('\\', CBACK) |
| set('"', CDQUOTE) |
| set('`', CBQUOTE) |
| set('$', CVAR) |
| set('}', CENDVAR) |
| /* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */ |
| set('!', CCTL) |
| set('*', CCTL) |
| set('?', CCTL) |
| set('[', CCTL) |
| set('=', CCTL) |
| set('~', CCTL) |
| set(':', CCTL) |
| set('/', CCTL) |
| set('-', CCTL) |
| }; |
| |
| /* syntax table used when in single quotes */ |
| const char sqsyntax[257] = { CEOF, |
| set_range(CTL_FIRST, CTL_LAST, CCTL) |
| set('\n', CNL) |
| set('\'', CSQUOTE) |
| /* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */ |
| set('!', CCTL) |
| set('*', CCTL) |
| set('?', CCTL) |
| set('[', CCTL) |
| set('=', CCTL) |
| set('~', CCTL) |
| set(':', CCTL) |
| set('/', CCTL) |
| set('-', CCTL) |
| }; |
| |
| /* syntax table used when in arithmetic */ |
| const char arisyntax[257] = { CEOF, |
| set_range(CTL_FIRST, CTL_LAST, CCTL) |
| set('\n', CNL) |
| set('\\', CBACK) |
| set('`', CBQUOTE) |
| set('\'', CSQUOTE) |
| set('"', CDQUOTE) |
| set('$', CVAR) |
| set('}', CENDVAR) |
| set('(', CLP) |
| set(')', CRP) |
| }; |
| |
| /* character classification table */ |
| const char is_type[257] = { 0, |
| set_range('0', '9', ISDIGIT) |
| set_range('a', 'z', ISLOWER) |
| set_range('A', 'Z', ISUPPER) |
| set('_', ISUNDER) |
| set('#', ISSPECL) |
| set('?', ISSPECL) |
| set('$', ISSPECL) |
| set('!', ISSPECL) |
| set('-', ISSPECL) |
| set('*', ISSPECL) |
| set('@', ISSPECL) |
| }; |