Home | History | Annotate | Line # | Download | only in sh
syntax.c revision 1.1.22.1
      1       1.1   dsl /*	$NetBSD: syntax.c,v 1.1.22.1 2008/01/09 01:20:03 matt Exp $	*/
      2       1.1   dsl 
      3  1.1.22.1  matt #include <sys/cdefs.h>
      4  1.1.22.1  matt __RCSID("$NetBSD: syntax.c,v 1.1.22.1 2008/01/09 01:20:03 matt Exp $");
      5  1.1.22.1  matt 
      6       1.1   dsl #include "shell.h"
      7       1.1   dsl #include "syntax.h"
      8       1.1   dsl #include "parser.h"
      9       1.1   dsl 
     10       1.1   dsl #if CWORD != 0
     11       1.1   dsl #error initialisation assumes 'CWORD' is zero
     12       1.1   dsl #endif
     13       1.1   dsl 
     14       1.1   dsl #define ndx(ch) (ch + 1 - CHAR_MIN)
     15       1.1   dsl #define set(ch, val) [ndx(ch)] = val,
     16       1.1   dsl #define set_range(s, e, val) [ndx(s) ... ndx(e)] = val,
     17       1.1   dsl 
     18       1.1   dsl /* syntax table used when not in quotes */
     19       1.1   dsl const char basesyntax[257] = { CEOF,
     20       1.1   dsl     set_range(CTL_FIRST, CTL_LAST, CCTL)
     21       1.1   dsl     set('\n', CNL)
     22       1.1   dsl     set('\\', CBACK)
     23       1.1   dsl     set('\'', CSQUOTE)
     24       1.1   dsl     set('"', CDQUOTE)
     25       1.1   dsl     set('`', CBQUOTE)
     26       1.1   dsl     set('$', CVAR)
     27       1.1   dsl     set('}', CENDVAR)
     28       1.1   dsl     set('<', CSPCL)
     29       1.1   dsl     set('>', CSPCL)
     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('\t', CSPCL)
     37       1.1   dsl };
     38       1.1   dsl 
     39       1.1   dsl /* syntax table used when in double quotes */
     40       1.1   dsl const char dqsyntax[257] = { CEOF,
     41       1.1   dsl     set_range(CTL_FIRST, CTL_LAST, CCTL)
     42       1.1   dsl     set('\n', CNL)
     43       1.1   dsl     set('\\', CBACK)
     44       1.1   dsl     set('"', CDQUOTE)
     45       1.1   dsl     set('`', CBQUOTE)
     46       1.1   dsl     set('$', CVAR)
     47       1.1   dsl     set('}', CENDVAR)
     48       1.1   dsl     /* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */
     49       1.1   dsl     set('!', CCTL)
     50       1.1   dsl     set('*', CCTL)
     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 };
     59       1.1   dsl 
     60       1.1   dsl /* syntax table used when in single quotes */
     61       1.1   dsl const char sqsyntax[257] = { CEOF,
     62       1.1   dsl     set_range(CTL_FIRST, CTL_LAST, CCTL)
     63       1.1   dsl     set('\n', CNL)
     64       1.1   dsl     set('\'', CSQUOTE)
     65       1.1   dsl     /* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */
     66       1.1   dsl     set('!', CCTL)
     67       1.1   dsl     set('*', CCTL)
     68       1.1   dsl     set('?', CCTL)
     69       1.1   dsl     set('[', CCTL)
     70       1.1   dsl     set('=', CCTL)
     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 };
     76       1.1   dsl 
     77       1.1   dsl /* syntax table used when in arithmetic */
     78       1.1   dsl const char arisyntax[257] = { CEOF,
     79       1.1   dsl     set_range(CTL_FIRST, CTL_LAST, CCTL)
     80       1.1   dsl     set('\n', CNL)
     81       1.1   dsl     set('\\', CBACK)
     82       1.1   dsl     set('`', CBQUOTE)
     83       1.1   dsl     set('\'', CSQUOTE)
     84       1.1   dsl     set('"', CDQUOTE)
     85       1.1   dsl     set('$', CVAR)
     86       1.1   dsl     set('}', CENDVAR)
     87       1.1   dsl     set('(', CLP)
     88       1.1   dsl     set(')', CRP)
     89       1.1   dsl };
     90       1.1   dsl 
     91       1.1   dsl /* character classification table */
     92       1.1   dsl const char is_type[257] = { 0,
     93       1.1   dsl     set_range('0', '9', ISDIGIT)
     94       1.1   dsl     set_range('a', 'z', ISLOWER)
     95       1.1   dsl     set_range('A', 'Z', ISUPPER)
     96       1.1   dsl     set('_', ISUNDER)
     97       1.1   dsl     set('#', ISSPECL)
     98       1.1   dsl     set('?', ISSPECL)
     99       1.1   dsl     set('$', ISSPECL)
    100       1.1   dsl     set('!', ISSPECL)
    101       1.1   dsl     set('-', ISSPECL)
    102       1.1   dsl     set('*', ISSPECL)
    103       1.1   dsl     set('@', ISSPECL)
    104       1.1   dsl };
    105