xref: /onnv-gate/usr/src/lib/libshell/common/include/lexstates.h (revision 12068:08a39a083754)
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