1da2e3ebdSchin /*********************************************************************** 2da2e3ebdSchin * * 3da2e3ebdSchin * This software is part of the ast package * 4*3e14f97fSRoger A. Faulkner * Copyright (c) 1982-2010 AT&T Intellectual Property * 5da2e3ebdSchin * and is licensed under the * 6da2e3ebdSchin * Common Public License, Version 1.0 * 77c2fbfb3SApril Chin * by AT&T Intellectual Property * 8da2e3ebdSchin * * 9da2e3ebdSchin * A copy of the License is available at * 10da2e3ebdSchin * http://www.opensource.org/licenses/cpl1.0.txt * 11da2e3ebdSchin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 12da2e3ebdSchin * * 13da2e3ebdSchin * Information and Software Systems Research * 14da2e3ebdSchin * AT&T Research * 15da2e3ebdSchin * Florham Park NJ * 16da2e3ebdSchin * * 17da2e3ebdSchin * David Korn <dgk@research.att.com> * 18da2e3ebdSchin * * 19da2e3ebdSchin ***********************************************************************/ 20da2e3ebdSchin #pragma prototyped 21da2e3ebdSchin #ifndef S_BREAK 22da2e3ebdSchin #define S_BREAK 1 /* end of token */ 23da2e3ebdSchin #define S_EOF 2 /* end of buffer */ 24da2e3ebdSchin #define S_NL 3 /* new-line when not a token */ 25da2e3ebdSchin #define S_RES 4 /* first character of reserved word */ 26da2e3ebdSchin #define S_NAME 5 /* other identifier characters */ 27da2e3ebdSchin #define S_REG 6 /* non-special characters */ 28da2e3ebdSchin #define S_TILDE 7 /* first char is tilde */ 29da2e3ebdSchin #define S_PUSH 8 30da2e3ebdSchin #define S_POP 9 31da2e3ebdSchin #define S_BRACT 10 32da2e3ebdSchin #define S_LIT 11 /* literal quote character */ 33da2e3ebdSchin #define S_NLTOK 12 /* new-line token */ 34da2e3ebdSchin #define S_OP 13 /* operator character */ 35da2e3ebdSchin #define S_PAT 14 /* pattern characters * and ? */ 36da2e3ebdSchin #define S_EPAT 15 /* pattern char when followed by ( */ 37da2e3ebdSchin #define S_EQ 16 /* assignment character */ 38da2e3ebdSchin #define S_COM 17 /* comment character */ 39da2e3ebdSchin #define S_MOD1 18 /* ${...} modifier character - old quoting */ 40da2e3ebdSchin #define S_MOD2 19 /* ${...} modifier character - new quoting */ 41da2e3ebdSchin #define S_ERR 20 /* invalid character in ${...} */ 42da2e3ebdSchin #define S_SPC1 21 /* special prefix characters after $ */ 43da2e3ebdSchin #define S_SPC2 22 /* special characters after $ */ 44da2e3ebdSchin #define S_DIG 23 /* digit character after $*/ 45da2e3ebdSchin #define S_ALP 24 /* alpahbetic character after $ */ 46da2e3ebdSchin #define S_LBRA 25 /* left brace after $ */ 47da2e3ebdSchin #define S_RBRA 26 /* right brace after $ */ 48da2e3ebdSchin #define S_PAR 27 /* set for $( */ 49da2e3ebdSchin #define S_ENDCH 28 /* macro expansion terminator */ 50da2e3ebdSchin #define S_SLASH 29 /* / character terminates ~ expansion */ 51da2e3ebdSchin #define S_COLON 30 /* for character : */ 52da2e3ebdSchin #define S_LABEL 31 /* for goto label */ 53da2e3ebdSchin #define S_EDOL 32 /* ends $identifier */ 54da2e3ebdSchin #define S_BRACE 33 /* left brace */ 55da2e3ebdSchin #define S_DOT 34 /* . char */ 56da2e3ebdSchin #define S_META 35 /* | & ; < > inside ${...} reserved for future use */ 57da2e3ebdSchin #define S_SPACE S_BREAK /* IFS space characters */ 58da2e3ebdSchin #define S_DELIM S_RES /* IFS delimter characters */ 59da2e3ebdSchin #define S_MBYTE S_NAME /* IFS first byte of multi-byte char */ 60da2e3ebdSchin #define S_BLNK 36 /* space or tab */ 61da2e3ebdSchin /* The following must be the highest numbered states */ 62da2e3ebdSchin #define S_QUOTE 37 /* double quote character */ 63da2e3ebdSchin #define S_GRAVE 38 /* old comsub character */ 64da2e3ebdSchin #define S_ESC 39 /* escape character */ 65da2e3ebdSchin #define S_DOL 40 /* $ subsitution character */ 66da2e3ebdSchin #define S_ESC2 41 /* escape character inside '...' */ 67da2e3ebdSchin 68da2e3ebdSchin /* These are the lexical state table names */ 69da2e3ebdSchin #define ST_BEGIN 0 70da2e3ebdSchin #define ST_NAME 1 71da2e3ebdSchin #define ST_NORM 2 72da2e3ebdSchin #define ST_LIT 3 73da2e3ebdSchin #define ST_QUOTE 4 74da2e3ebdSchin #define ST_NESTED 5 75da2e3ebdSchin #define ST_DOL 6 76da2e3ebdSchin #define ST_BRACE 7 77da2e3ebdSchin #define ST_DOLNAME 8 78da2e3ebdSchin #define ST_MACRO 9 79da2e3ebdSchin #define ST_QNEST 10 80da2e3ebdSchin #define ST_NONE 11 81da2e3ebdSchin 82da2e3ebdSchin #include "FEATURE/locale" 83da2e3ebdSchin 84da2e3ebdSchin #if _hdr_wchar 85da2e3ebdSchin # include <wchar.h> 86da2e3ebdSchin # if _hdr_wctype 87da2e3ebdSchin # include <wctype.h> 88da2e3ebdSchin # undef isalpha 89da2e3ebdSchin # define isalpha(x) iswalpha(x) 90da2e3ebdSchin # if defined(iswblank) || _lib_iswblank 91da2e3ebdSchin # undef isblank 92da2e3ebdSchin # define isblank(x) iswblank(x) 93da2e3ebdSchin # else 94da2e3ebdSchin # if _lib_wctype && _lib_iswctype 95da2e3ebdSchin # define _lib_iswblank -1 96da2e3ebdSchin # undef isblank 97da2e3ebdSchin # define isblank(x) local_iswblank(x) 98da2e3ebdSchin extern int local_iswblank(wchar_t); 99da2e3ebdSchin # endif 100da2e3ebdSchin # endif 101da2e3ebdSchin # endif 102da2e3ebdSchin #endif 103da2e3ebdSchin #ifndef isblank 104da2e3ebdSchin # define isblank(x) ((x)==' '||(x)=='\t') 105da2e3ebdSchin #endif 106da2e3ebdSchin 107da2e3ebdSchin #undef LEN 108da2e3ebdSchin #if SHOPT_MULTIBYTE 109da2e3ebdSchin static int NXT, LEN; 110da2e3ebdSchin # define isaname(c) ((c)>0xff?isalpha(c): sh_lexstates[ST_NAME][(c)]==0) 111da2e3ebdSchin # define isaletter(c) ((c)>0xff?isalpha(c): sh_lexstates[ST_DOL][(c)]==S_ALP && (c)!='.') 112da2e3ebdSchin #else 113da2e3ebdSchin # undef mbwide 114da2e3ebdSchin # define mbwide() (0) 115da2e3ebdSchin # define LEN 1 116da2e3ebdSchin # define isaname(c) (sh_lexstates[ST_NAME][c]==0) 117da2e3ebdSchin # define isaletter(c) (sh_lexstates[ST_DOL][c]==S_ALP && (c)!='.') 118da2e3ebdSchin #endif 119da2e3ebdSchin #define STATE(s,c) (mbwide()?(c=fcmbstate(s,&NXT,&LEN),NXT):s[c=fcget()]) 120da2e3ebdSchin #define isadigit(c) (sh_lexstates[ST_DOL][c]==S_DIG) 121da2e3ebdSchin #define isastchar(c) ((c)=='@' || (c)=='*') 122da2e3ebdSchin #define isexp(c) (sh_lexstates[ST_MACRO][c]==S_PAT||(c)=='$'||(c)=='`') 123da2e3ebdSchin #define ismeta(c) (sh_lexstates[ST_NAME][c]==S_BREAK) 124da2e3ebdSchin 125da2e3ebdSchin extern char *sh_lexstates[ST_NONE]; 126da2e3ebdSchin extern const char *sh_lexrstates[ST_NONE]; 127da2e3ebdSchin extern const char e_lexversion[]; 128da2e3ebdSchin extern const char e_lexspace[]; 129da2e3ebdSchin extern const char e_lexslash[]; 130da2e3ebdSchin extern const char e_lexlabignore[]; 131da2e3ebdSchin extern const char e_lexlabunknown[]; 132da2e3ebdSchin extern const char e_lexsyntax1[]; 133da2e3ebdSchin extern const char e_lexsyntax2[]; 134da2e3ebdSchin extern const char e_lexsyntax3[]; 135da2e3ebdSchin extern const char e_lexobsolete1[]; 136da2e3ebdSchin extern const char e_lexobsolete2[]; 137da2e3ebdSchin extern const char e_lexobsolete3[]; 138da2e3ebdSchin extern const char e_lexobsolete4[]; 139da2e3ebdSchin extern const char e_lexobsolete5[]; 140da2e3ebdSchin extern const char e_lexobsolete6[]; 14134f9b3eeSRoland Mainz extern const char e_lexnonstandard[]; 142da2e3ebdSchin extern const char e_lexusebrace[]; 143da2e3ebdSchin extern const char e_lexusequote[]; 144da2e3ebdSchin extern const char e_lexescape[]; 145da2e3ebdSchin extern const char e_lexquote[]; 146da2e3ebdSchin extern const char e_lexnested[]; 147da2e3ebdSchin extern const char e_lexbadchar[]; 148da2e3ebdSchin extern const char e_lexlongquote[]; 149da2e3ebdSchin extern const char e_lexfuture[]; 150da2e3ebdSchin extern const char e_lexzerobyte[]; 151da2e3ebdSchin extern const char e_lexemptyfor[]; 1527c2fbfb3SApril Chin extern const char e_lextypeset[]; 153da2e3ebdSchin #endif 154