14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1982-2010 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 78462SApril.Chin@Sun.COM * by AT&T Intellectual Property * 84887Schin * * 94887Schin * A copy of the License is available at * 104887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 124887Schin * * 134887Schin * Information and Software Systems Research * 144887Schin * AT&T Research * 154887Schin * Florham Park NJ * 164887Schin * * 174887Schin * David Korn <dgk@research.att.com> * 184887Schin * * 194887Schin ***********************************************************************/ 204887Schin #pragma prototyped 214887Schin #ifndef S_BREAK 224887Schin #define S_BREAK 1 /* end of token */ 234887Schin #define S_EOF 2 /* end of buffer */ 244887Schin #define S_NL 3 /* new-line when not a token */ 254887Schin #define S_RES 4 /* first character of reserved word */ 264887Schin #define S_NAME 5 /* other identifier characters */ 274887Schin #define S_REG 6 /* non-special characters */ 284887Schin #define S_TILDE 7 /* first char is tilde */ 294887Schin #define S_PUSH 8 304887Schin #define S_POP 9 314887Schin #define S_BRACT 10 324887Schin #define S_LIT 11 /* literal quote character */ 334887Schin #define S_NLTOK 12 /* new-line token */ 344887Schin #define S_OP 13 /* operator character */ 354887Schin #define S_PAT 14 /* pattern characters * and ? */ 364887Schin #define S_EPAT 15 /* pattern char when followed by ( */ 374887Schin #define S_EQ 16 /* assignment character */ 384887Schin #define S_COM 17 /* comment character */ 394887Schin #define S_MOD1 18 /* ${...} modifier character - old quoting */ 404887Schin #define S_MOD2 19 /* ${...} modifier character - new quoting */ 414887Schin #define S_ERR 20 /* invalid character in ${...} */ 424887Schin #define S_SPC1 21 /* special prefix characters after $ */ 434887Schin #define S_SPC2 22 /* special characters after $ */ 444887Schin #define S_DIG 23 /* digit character after $*/ 454887Schin #define S_ALP 24 /* alpahbetic character after $ */ 464887Schin #define S_LBRA 25 /* left brace after $ */ 474887Schin #define S_RBRA 26 /* right brace after $ */ 484887Schin #define S_PAR 27 /* set for $( */ 494887Schin #define S_ENDCH 28 /* macro expansion terminator */ 504887Schin #define S_SLASH 29 /* / character terminates ~ expansion */ 514887Schin #define S_COLON 30 /* for character : */ 524887Schin #define S_LABEL 31 /* for goto label */ 534887Schin #define S_EDOL 32 /* ends $identifier */ 544887Schin #define S_BRACE 33 /* left brace */ 554887Schin #define S_DOT 34 /* . char */ 564887Schin #define S_META 35 /* | & ; < > inside ${...} reserved for future use */ 574887Schin #define S_SPACE S_BREAK /* IFS space characters */ 584887Schin #define S_DELIM S_RES /* IFS delimter characters */ 594887Schin #define S_MBYTE S_NAME /* IFS first byte of multi-byte char */ 604887Schin #define S_BLNK 36 /* space or tab */ 614887Schin /* The following must be the highest numbered states */ 624887Schin #define S_QUOTE 37 /* double quote character */ 634887Schin #define S_GRAVE 38 /* old comsub character */ 644887Schin #define S_ESC 39 /* escape character */ 654887Schin #define S_DOL 40 /* $ subsitution character */ 664887Schin #define S_ESC2 41 /* escape character inside '...' */ 674887Schin 684887Schin /* These are the lexical state table names */ 694887Schin #define ST_BEGIN 0 704887Schin #define ST_NAME 1 714887Schin #define ST_NORM 2 724887Schin #define ST_LIT 3 734887Schin #define ST_QUOTE 4 744887Schin #define ST_NESTED 5 754887Schin #define ST_DOL 6 764887Schin #define ST_BRACE 7 774887Schin #define ST_DOLNAME 8 784887Schin #define ST_MACRO 9 794887Schin #define ST_QNEST 10 804887Schin #define ST_NONE 11 814887Schin 824887Schin #include "FEATURE/locale" 834887Schin 844887Schin #if _hdr_wchar 854887Schin # include <wchar.h> 864887Schin # if _hdr_wctype 874887Schin # include <wctype.h> 884887Schin # undef isalpha 894887Schin # define isalpha(x) iswalpha(x) 904887Schin # if defined(iswblank) || _lib_iswblank 914887Schin # undef isblank 924887Schin # define isblank(x) iswblank(x) 934887Schin # else 944887Schin # if _lib_wctype && _lib_iswctype 954887Schin # define _lib_iswblank -1 964887Schin # undef isblank 974887Schin # define isblank(x) local_iswblank(x) 984887Schin extern int local_iswblank(wchar_t); 994887Schin # endif 1004887Schin # endif 1014887Schin # endif 1024887Schin #endif 1034887Schin #ifndef isblank 1044887Schin # define isblank(x) ((x)==' '||(x)=='\t') 1054887Schin #endif 1064887Schin 1074887Schin #undef LEN 1084887Schin #if SHOPT_MULTIBYTE 1094887Schin static int NXT, LEN; 1104887Schin # define isaname(c) ((c)>0xff?isalpha(c): sh_lexstates[ST_NAME][(c)]==0) 1114887Schin # define isaletter(c) ((c)>0xff?isalpha(c): sh_lexstates[ST_DOL][(c)]==S_ALP && (c)!='.') 1124887Schin #else 1134887Schin # undef mbwide 1144887Schin # define mbwide() (0) 1154887Schin # define LEN 1 1164887Schin # define isaname(c) (sh_lexstates[ST_NAME][c]==0) 1174887Schin # define isaletter(c) (sh_lexstates[ST_DOL][c]==S_ALP && (c)!='.') 1184887Schin #endif 1194887Schin #define STATE(s,c) (mbwide()?(c=fcmbstate(s,&NXT,&LEN),NXT):s[c=fcget()]) 1204887Schin #define isadigit(c) (sh_lexstates[ST_DOL][c]==S_DIG) 1214887Schin #define isastchar(c) ((c)=='@' || (c)=='*') 1224887Schin #define isexp(c) (sh_lexstates[ST_MACRO][c]==S_PAT||(c)=='$'||(c)=='`') 1234887Schin #define ismeta(c) (sh_lexstates[ST_NAME][c]==S_BREAK) 1244887Schin 1254887Schin extern char *sh_lexstates[ST_NONE]; 1264887Schin extern const char *sh_lexrstates[ST_NONE]; 1274887Schin extern const char e_lexversion[]; 1284887Schin extern const char e_lexspace[]; 1294887Schin extern const char e_lexslash[]; 1304887Schin extern const char e_lexlabignore[]; 1314887Schin extern const char e_lexlabunknown[]; 1324887Schin extern const char e_lexsyntax1[]; 1334887Schin extern const char e_lexsyntax2[]; 1344887Schin extern const char e_lexsyntax3[]; 1354887Schin extern const char e_lexobsolete1[]; 1364887Schin extern const char e_lexobsolete2[]; 1374887Schin extern const char e_lexobsolete3[]; 1384887Schin extern const char e_lexobsolete4[]; 1394887Schin extern const char e_lexobsolete5[]; 1404887Schin extern const char e_lexobsolete6[]; 14110898Sroland.mainz@nrubsig.org extern const char e_lexnonstandard[]; 1424887Schin extern const char e_lexusebrace[]; 1434887Schin extern const char e_lexusequote[]; 1444887Schin extern const char e_lexescape[]; 1454887Schin extern const char e_lexquote[]; 1464887Schin extern const char e_lexnested[]; 1474887Schin extern const char e_lexbadchar[]; 1484887Schin extern const char e_lexlongquote[]; 1494887Schin extern const char e_lexfuture[]; 1504887Schin extern const char e_lexzerobyte[]; 1514887Schin extern const char e_lexemptyfor[]; 1528462SApril.Chin@Sun.COM extern const char e_lextypeset[]; 1534887Schin #endif 154