Home | History | Annotate | Line # | Download | only in sh
syntax.c revision 1.3.26.2
      1  1.3.26.2    martin /*	$NetBSD: syntax.c,v 1.3.26.2 2018/09/10 15:45:11 martin Exp $	*/
      2       1.2     lukem 
      3       1.2     lukem #include <sys/cdefs.h>
      4  1.3.26.2    martin __RCSID("$NetBSD: syntax.c,v 1.3.26.2 2018/09/10 15:45:11 martin Exp $");
      5       1.1       dsl 
      6       1.3  christos #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.3.26.2    martin     /* ':/' 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.3.26.2    martin     set(']', CCTL)
     60       1.1       dsl };
     61       1.1       dsl 
     62       1.1       dsl /* syntax table used when in single quotes */
     63       1.1       dsl const char sqsyntax[257] = { CEOF,
     64       1.1       dsl     set_range(CTL_FIRST, CTL_LAST, CCTL)
     65       1.1       dsl     set('\n', CNL)
     66       1.1       dsl     set('\'', CSQUOTE)
     67  1.3.26.2    martin     set('\\', CSBACK)
     68  1.3.26.2    martin     /* ':/' for tilde expansion, '-]' for [a\-x] pattern ranges */
     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     set('/', CCTL)
     77       1.1       dsl     set('-', CCTL)
     78  1.3.26.2    martin     set(']', CCTL)
     79       1.1       dsl };
     80       1.1       dsl 
     81       1.1       dsl /* syntax table used when in arithmetic */
     82       1.1       dsl const char arisyntax[257] = { CEOF,
     83       1.1       dsl     set_range(CTL_FIRST, CTL_LAST, CCTL)
     84       1.1       dsl     set('\n', CNL)
     85       1.1       dsl     set('\\', CBACK)
     86       1.1       dsl     set('`', CBQUOTE)
     87       1.1       dsl     set('\'', CSQUOTE)
     88       1.1       dsl     set('"', CDQUOTE)
     89       1.1       dsl     set('$', CVAR)
     90       1.1       dsl     set('}', CENDVAR)
     91       1.1       dsl     set('(', CLP)
     92       1.1       dsl     set(')', CRP)
     93       1.1       dsl };
     94       1.1       dsl 
     95       1.1       dsl /* character classification table */
     96       1.1       dsl const char is_type[257] = { 0,
     97       1.1       dsl     set_range('0', '9', ISDIGIT)
     98       1.1       dsl     set_range('a', 'z', ISLOWER)
     99       1.1       dsl     set_range('A', 'Z', ISUPPER)
    100       1.1       dsl     set('_', ISUNDER)
    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     set('-', ISSPECL)
    106       1.1       dsl     set('*', ISSPECL)
    107       1.1       dsl     set('@', ISSPECL)
    108  1.3.26.1       snj     set(' ', ISSPACE)
    109  1.3.26.1       snj     set('\t', ISSPACE)
    110  1.3.26.1       snj     set('\n', ISSPACE)
    111       1.1       dsl };
    112