xref: /titanic_51/usr/src/lib/libshell/common/include/shlex.h (revision 3e14f97f673e8a630f076077de35afdd43dc1587)
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 NOTSYM
22da2e3ebdSchin /*
23da2e3ebdSchin  *	UNIX shell
24da2e3ebdSchin  *	Written by David Korn
25da2e3ebdSchin  *	These are the definitions for the lexical analyzer
26da2e3ebdSchin  */
27da2e3ebdSchin 
28da2e3ebdSchin #include	<cdt.h>
29da2e3ebdSchin #include	"FEATURE/options"
30da2e3ebdSchin #include	"shnodes.h"
31da2e3ebdSchin #include	"shtable.h"
32da2e3ebdSchin #include	"lexstates.h"
33da2e3ebdSchin 
347c2fbfb3SApril Chin 
357c2fbfb3SApril Chin typedef struct  _shlex_
36da2e3ebdSchin {
37da2e3ebdSchin 	Shell_t		*sh;		/* pointer to the interpreter */
38da2e3ebdSchin 	struct argnod	*arg;		/* current word */
39da2e3ebdSchin 	struct ionod	*heredoc;	/* pending here document list */
40da2e3ebdSchin 	int		token;		/* current token number */
41da2e3ebdSchin 	int		lastline;	/* last line number */
42da2e3ebdSchin 	int		lasttok;	/* previous token number */
43da2e3ebdSchin 	int		digits;		/* numerical value with word token */
4434f9b3eeSRoland Mainz 	int		nonstandard;	/* nonstandard construct in profile */
45da2e3ebdSchin 	char		aliasok;	/* on when alias is legal */
46da2e3ebdSchin 	char		assignok;	/* on when name=value is legal */
477c2fbfb3SApril Chin 	char		inexec;		/* on when processing exec */
487c2fbfb3SApril Chin 	char		intypeset;	/* on when processing typeset */
497c2fbfb3SApril Chin 	char		comp_assign;	/* in compound assignment */
507c2fbfb3SApril Chin 	char		comsub;		/* parsing command substitution */
51da2e3ebdSchin 	int		inlineno;	/* saved value of sh.inlineno */
52da2e3ebdSchin 	int		firstline;	/* saved value of sh.st.firstline */
53da2e3ebdSchin #if SHOPT_KIA
54da2e3ebdSchin 	Sfio_t		*kiafile;	/* kia output file */
55da2e3ebdSchin 	Sfio_t		*kiatmp;	/* kia reference file */
56da2e3ebdSchin 	unsigned long	script;		/* script entity number */
57da2e3ebdSchin 	unsigned long	fscript;	/* script file entity number */
58da2e3ebdSchin 	unsigned long	current;	/* current entity number */
59da2e3ebdSchin 	unsigned long	unknown;	/* <unknown> entity number */
60da2e3ebdSchin 	off_t		kiabegin;	/* offset of first entry */
61da2e3ebdSchin 	char		*scriptname;	/* name of script file */
62da2e3ebdSchin 	Dt_t		*entity_tree;	/* for entity ids */
63da2e3ebdSchin #endif /* SHOPT_KIA */
647c2fbfb3SApril Chin #ifdef  _SHLEX_PRIVATE
657c2fbfb3SApril Chin 	_SHLEX_PRIVATE
667c2fbfb3SApril Chin #endif
677c2fbfb3SApril Chin } Lex_t;
68da2e3ebdSchin 
69da2e3ebdSchin /* symbols for parsing */
70da2e3ebdSchin #define NL		'\n'
71da2e3ebdSchin #define NOTSYM		'!'
72da2e3ebdSchin #define SYMRES		0400		/* reserved word symbols */
73da2e3ebdSchin #define DOSYM		(SYMRES|01)
74da2e3ebdSchin #define FISYM		(SYMRES|02)
75da2e3ebdSchin #define ELIFSYM		(SYMRES|03)
76da2e3ebdSchin #define ELSESYM		(SYMRES|04)
77da2e3ebdSchin #define INSYM		(SYMRES|05)
78da2e3ebdSchin #define THENSYM		(SYMRES|06)
79da2e3ebdSchin #define DONESYM		(SYMRES|07)
80da2e3ebdSchin #define ESACSYM		(SYMRES|010)
81da2e3ebdSchin #define IFSYM		(SYMRES|011)
82da2e3ebdSchin #define FORSYM		(SYMRES|012)
83da2e3ebdSchin #define WHILESYM	(SYMRES|013)
84da2e3ebdSchin #define UNTILSYM	(SYMRES|014)
85da2e3ebdSchin #define CASESYM		(SYMRES|015)
86da2e3ebdSchin #define FUNCTSYM	(SYMRES|016)
87da2e3ebdSchin #define SELECTSYM	(SYMRES|017)
88da2e3ebdSchin #define TIMESYM		(SYMRES|020)
89da2e3ebdSchin #define NSPACESYM	(SYMRES|021)
90da2e3ebdSchin 
91da2e3ebdSchin #define SYMREP		01000		/* symbols for doubled characters */
92da2e3ebdSchin #define BREAKCASESYM	(SYMREP|';')
93da2e3ebdSchin #define ANDFSYM		(SYMREP|'&')
94da2e3ebdSchin #define ORFSYM		(SYMREP|'|')
95da2e3ebdSchin #define IOAPPSYM	(SYMREP|'>')
96da2e3ebdSchin #define IODOCSYM	(SYMREP|'<')
97da2e3ebdSchin #define EXPRSYM		(SYMREP|'(')
98da2e3ebdSchin #define BTESTSYM 	(SYMREP|'[')
99da2e3ebdSchin #define ETESTSYM	(SYMREP|']')
100da2e3ebdSchin 
101da2e3ebdSchin #define SYMMASK		0170000
102da2e3ebdSchin #define SYMPIPE		010000	/* trailing '|' */
103da2e3ebdSchin #define SYMLPAR		020000	/* trailing LPAREN */
104da2e3ebdSchin #define SYMAMP		040000	/* trailing '&' */
105da2e3ebdSchin #define SYMGT		0100000	/* trailing '>' */
106da2e3ebdSchin #define SYMSEMI		0110000	/* trailing ';' */
107da2e3ebdSchin #define SYMSHARP	0120000	/* trailing '#' */
108da2e3ebdSchin #define IOSEEKSYM	(SYMSHARP|'<')
109da2e3ebdSchin #define IOMOV0SYM	(SYMAMP|'<')
110da2e3ebdSchin #define IOMOV1SYM	(SYMAMP|'>')
111da2e3ebdSchin #define FALLTHRUSYM	(SYMAMP|';')
112da2e3ebdSchin #define COOPSYM		(SYMAMP|'|')
113da2e3ebdSchin #define IORDWRSYM	(SYMGT|'<')
11434f9b3eeSRoland Mainz #define IORDWRSYMT	(SYMSEMI|'<')
115da2e3ebdSchin #define IOCLOBSYM	(SYMPIPE|'>')
116da2e3ebdSchin #define IPROCSYM	(SYMLPAR|'<')
117da2e3ebdSchin #define OPROCSYM	(SYMLPAR|'>')
118da2e3ebdSchin #define EOFSYM		04000	/* end-of-file */
119da2e3ebdSchin #define TESTUNOP	04001
120da2e3ebdSchin #define TESTBINOP	04002
121da2e3ebdSchin #define LABLSYM		04003
122da2e3ebdSchin #define IOVNAME		04004
123da2e3ebdSchin 
124da2e3ebdSchin /* additional parser flag, others in <shell.h> */
125da2e3ebdSchin #define SH_EMPTY	04
126da2e3ebdSchin #define SH_NOIO		010
127da2e3ebdSchin #define	SH_ASSIGN	020
128da2e3ebdSchin #define	SH_FUNDEF	040
129da2e3ebdSchin #define SH_ARRAY	0100
130da2e3ebdSchin #define SH_SEMI		0200	/* semi-colon after NL ok */
131da2e3ebdSchin 
132da2e3ebdSchin #define SH_COMPASSIGN	010	/* allow compound assignments only */
133da2e3ebdSchin 
1347c2fbfb3SApril Chin #if 0
135da2e3ebdSchin typedef struct  _shlex_
136da2e3ebdSchin {
137da2e3ebdSchin 	struct shlex_t		_shlex;
138da2e3ebdSchin #ifdef  _SHLEX_PRIVATE
139da2e3ebdSchin 	_SHLEX_PRIVATE
140da2e3ebdSchin #endif
141da2e3ebdSchin } Lex_t;
142da2e3ebdSchin 
143da2e3ebdSchin #define	shlex			(((Lex_t*)(sh.lex_context))->_shlex)
1447c2fbfb3SApril Chin #endif
145da2e3ebdSchin extern const char		e_unexpected[];
146da2e3ebdSchin extern const char		e_unmatched[];
147da2e3ebdSchin extern const char		e_endoffile[];
148da2e3ebdSchin extern const char		e_newline[];
149da2e3ebdSchin 
150da2e3ebdSchin /* odd chars */
151da2e3ebdSchin #define LBRACE	'{'
152da2e3ebdSchin #define RBRACE	'}'
153da2e3ebdSchin #define LPAREN	'('
154da2e3ebdSchin #define RPAREN	')'
155da2e3ebdSchin #define LBRACT	'['
156da2e3ebdSchin #define RBRACT	']'
157da2e3ebdSchin 
1587c2fbfb3SApril Chin extern int		sh_lex(Lex_t*);
1597c2fbfb3SApril Chin extern Shnode_t		*sh_dolparen(Lex_t*);
160da2e3ebdSchin extern Lex_t		*sh_lexopen(Lex_t*, Shell_t*, int);
1617c2fbfb3SApril Chin extern void 		sh_lexskip(Lex_t*,int,int,int);
1627c2fbfb3SApril Chin extern void 		sh_syntax(Lex_t*);
1637c2fbfb3SApril Chin #if SHOPT_KIA
1647c2fbfb3SApril Chin     extern int                  kiaclose(Lex_t *);
1657c2fbfb3SApril Chin     extern unsigned long        kiaentity(Lex_t*, const char*,int,int,int,int,unsigned long,int,int,const char*);
1667c2fbfb3SApril Chin #endif /* SHOPT_KIA */
1677c2fbfb3SApril Chin 
168da2e3ebdSchin 
169da2e3ebdSchin #endif /* !NOTSYM */
170