syntax.c revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
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}; 103