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