xref: /titanic_44/usr/src/lib/libshell/common/include/defs.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 /*
22da2e3ebdSchin  * David Korn
23da2e3ebdSchin  * AT&T Labs
24da2e3ebdSchin  *
25da2e3ebdSchin  * Shell interface private definitions
26da2e3ebdSchin  *
27da2e3ebdSchin  */
287c2fbfb3SApril Chin #ifndef defs_h_defined
297c2fbfb3SApril Chin #define defs_h_defined
30da2e3ebdSchin 
31da2e3ebdSchin #include	<ast.h>
32da2e3ebdSchin #include	<sfio.h>
33da2e3ebdSchin #include	<error.h>
34*3e14f97fSRoger A. Faulkner #include	"FEATURE/externs"
35da2e3ebdSchin #include	"FEATURE/options"
36da2e3ebdSchin #include	<cdt.h>
37da2e3ebdSchin #include	<history.h>
38da2e3ebdSchin #include	"fault.h"
39da2e3ebdSchin #include	"argnod.h"
407c2fbfb3SApril Chin #include	"name.h"
4134f9b3eeSRoland Mainz #include	<ctype.h>
427c2fbfb3SApril Chin #define _SH_PRIVATE
437c2fbfb3SApril Chin #include	<shcmd.h>
447c2fbfb3SApril Chin #undef _SH_PRIVATE
45da2e3ebdSchin 
46da2e3ebdSchin #ifndef pointerof
47da2e3ebdSchin #define pointerof(x)		((void*)((char*)0+(x)))
48da2e3ebdSchin #endif
49da2e3ebdSchin 
507c2fbfb3SApril Chin #define Empty			((char*)(e_sptbnl+3))
517c2fbfb3SApril Chin 
52da2e3ebdSchin #define	env_change()		(++ast.env_serial)
53da2e3ebdSchin #if SHOPT_ENV
54da2e3ebdSchin #   include	<env.h>
55da2e3ebdSchin #else
56da2e3ebdSchin #   define Env_t		void
57da2e3ebdSchin #   define sh_envput(e,p)	env_change()
58da2e3ebdSchin #   define env_delete(e,p)	env_change()
59da2e3ebdSchin #endif
60da2e3ebdSchin 
61*3e14f97fSRoger A. Faulkner extern char*	sh_getenv(const char*);
62*3e14f97fSRoger A. Faulkner extern char*	sh_setenviron(const char*);
63*3e14f97fSRoger A. Faulkner 
64da2e3ebdSchin /*
65da2e3ebdSchin  * note that the first few fields have to be the same as for
66da2e3ebdSchin  * Shscoped_t in <shell.h>
67da2e3ebdSchin  */
687c2fbfb3SApril Chin 
697c2fbfb3SApril Chin 
70da2e3ebdSchin struct sh_scoped
71da2e3ebdSchin {
72da2e3ebdSchin 	struct sh_scoped *prevst;	/* pointer to previous state */
73da2e3ebdSchin 	int		dolc;
74da2e3ebdSchin 	char		**dolv;
75da2e3ebdSchin 	char		*cmdname;
76da2e3ebdSchin 	char		*filename;
777c2fbfb3SApril Chin 	char		*funname;
78da2e3ebdSchin 	int		lineno;
79da2e3ebdSchin 	Dt_t		*save_tree;	/* var_tree for calling function */
80da2e3ebdSchin 	struct sh_scoped *self;		/* pointer to copy of this scope*/
81da2e3ebdSchin 	Dt_t		*var_local;	/* local level variables for name() */
82da2e3ebdSchin 	struct slnod	*staklist;	/* link list of function stacks */
83da2e3ebdSchin 	int		states;
84da2e3ebdSchin 	int		breakcnt;
85da2e3ebdSchin 	int		execbrk;
86da2e3ebdSchin 	int		loopcnt;
87da2e3ebdSchin 	int		firstline;
88da2e3ebdSchin 	int32_t		optindex;
89da2e3ebdSchin 	int32_t		optnum;
90da2e3ebdSchin 	int32_t		tmout;		/* value for TMOUT */
91da2e3ebdSchin 	short		optchar;
92da2e3ebdSchin 	short		opterror;
93da2e3ebdSchin 	int		ioset;
94da2e3ebdSchin 	unsigned short	trapmax;
95da2e3ebdSchin 	char		*trap[SH_DEBUGTRAP+1];
96da2e3ebdSchin 	char		**trapcom;
97da2e3ebdSchin 	char		**otrapcom;
98da2e3ebdSchin 	void		*timetrap;
997c2fbfb3SApril Chin 	struct Ufunction *real_fun;	/* current 'function name' function */
100da2e3ebdSchin };
101da2e3ebdSchin 
102da2e3ebdSchin struct limits
103da2e3ebdSchin {
104da2e3ebdSchin 	long		arg_max;	/* max arg+env exec() size */
105da2e3ebdSchin 	int		open_max;	/* maximum number of file descriptors */
106da2e3ebdSchin 	int		clk_tck;	/* number of ticks per second */
107da2e3ebdSchin 	int		child_max;	/* maxumum number of children */
108da2e3ebdSchin 	int		ngroups_max;	/* maximum number of process groups */
109da2e3ebdSchin 	unsigned char	posix_version;	/* posix version number */
110da2e3ebdSchin 	unsigned char	posix_jobcontrol;/* non-zero for job control systems */
111da2e3ebdSchin 	unsigned char	fs3d;		/* non-zero for 3-d file system */
112da2e3ebdSchin };
113da2e3ebdSchin 
114da2e3ebdSchin #define _SH_PRIVATE \
115da2e3ebdSchin 	struct sh_scoped st;		/* scoped information */ \
116da2e3ebdSchin 	struct limits	lim;		/* run time limits */ \
1177c2fbfb3SApril Chin 	Stk_t		*stk;		/* stack poiter */ \
118da2e3ebdSchin 	Sfio_t		*heredocs;	/* current here-doc temp file */ \
119da2e3ebdSchin 	Sfio_t		*funlog;	/* for logging function definitions */ \
120da2e3ebdSchin 	int		**fdptrs;	/* pointer to file numbers */ \
121da2e3ebdSchin 	int		savexit; \
122da2e3ebdSchin 	char		*lastarg; \
123da2e3ebdSchin 	char		*lastpath;	/* last alsolute path found */ \
124da2e3ebdSchin 	int		path_err;	/* last error on path search */ \
125da2e3ebdSchin 	Dt_t		*track_tree;	/* for tracked aliases*/ \
126da2e3ebdSchin 	Dt_t		*var_base;	/* global level variables */ \
127da2e3ebdSchin 	Namval_t	*namespace;	/* current active namespace*/ \
128da2e3ebdSchin 	Namval_t	*last_table;	/* last table used in last nv_open  */ \
1297c2fbfb3SApril Chin 	Namval_t	*prev_table;	/* previous table used in nv_open  */ \
130da2e3ebdSchin 	Sfio_t		*outpool;	/* ouput stream pool */ \
131da2e3ebdSchin 	long		timeout;	/* read timeout */ \
132da2e3ebdSchin 	short		curenv;		/* current subshell number */ \
133da2e3ebdSchin 	short		jobenv;		/* subshell number for jobs */ \
1347c2fbfb3SApril Chin 	int		infd;		/* input file descriptor */ \
135da2e3ebdSchin 	int		nextprompt;	/* next prompt is PS<nextprompt> */ \
1367c2fbfb3SApril Chin 	int		bltin_nnodes;	/* number of bltins nodes */ \
1377c2fbfb3SApril Chin 	Namval_t	*bltin_nodes;	/* pointer to built-in variables */ \
138da2e3ebdSchin 	Namval_t	*bltin_cmds;	/* pointer to built-in commands */ \
139da2e3ebdSchin 	Namval_t	*posix_fun;	/* points to last name() function */ \
140da2e3ebdSchin 	char		*outbuff;	/* pointer to output buffer */ \
141da2e3ebdSchin 	char		*errbuff;	/* pointer to stderr buffer */ \
142da2e3ebdSchin 	char		*prompt;	/* pointer to prompt string */ \
143da2e3ebdSchin 	char		*shname;	/* shell name */ \
144da2e3ebdSchin 	char		*shpath;	/* path name of shell */ \
145da2e3ebdSchin 	char		*user;		/* name of real user for pfsh */ \
146da2e3ebdSchin 	char		*comdiv;	/* points to sh -c argument */ \
147da2e3ebdSchin 	char		*prefix;	/* prefix for compound assignment */ \
148da2e3ebdSchin 	sigjmp_buf	*jmplist;	/* longjmp return stack */ \
149da2e3ebdSchin 	char		**sigmsg;	/* points to signal messages */ \
150da2e3ebdSchin 	int		oldexit; \
151da2e3ebdSchin 	uid_t 		userid,euserid;	/* real and effective user id */ \
152da2e3ebdSchin 	gid_t 		groupid,egroupid;/* real and effective group id */ \
153da2e3ebdSchin 	pid_t		pid;		/* process id of shell */ \
154da2e3ebdSchin 	pid_t		bckpid;		/* background process id */ \
155da2e3ebdSchin 	pid_t		cpid; \
1567c2fbfb3SApril Chin 	pid_t		spid; 		/* subshell process id */ \
15734f9b3eeSRoland Mainz 	pid_t		pipepid; \
158da2e3ebdSchin 	int32_t		ppid;		/* parent process id of shell */ \
159da2e3ebdSchin 	int		topfd; \
160da2e3ebdSchin 	int		sigmax;		/* maximum number of signals */ \
161da2e3ebdSchin 	int		savesig; \
162da2e3ebdSchin 	unsigned char	*sigflag;	/* pointer to signal states */ \
163da2e3ebdSchin 	char		intrap; \
164da2e3ebdSchin 	char		login_sh; \
165da2e3ebdSchin 	char		lastbase; \
166da2e3ebdSchin 	char		forked;	\
167da2e3ebdSchin 	char		binscript; \
168da2e3ebdSchin 	char		deftype; \
1697c2fbfb3SApril Chin 	char		funload; \
170da2e3ebdSchin 	char		used_pos;	/* used postional parameter */\
1717c2fbfb3SApril Chin 	char		universe; \
1727c2fbfb3SApril Chin 	char		winch; \
1737c2fbfb3SApril Chin 	char		indebug; 	/* set when in debug trap */ \
174da2e3ebdSchin 	unsigned char	lastsig;	/* last signal received */ \
17581af778eSCasper H.S. Dik 	char		subshare;	/* set when in ${..} comsub */ \
17634f9b3eeSRoland Mainz 	char		toomany;	/* set when out of fd's */ \
177*3e14f97fSRoger A. Faulkner 	char		instance;	/* in set_instance */ \
178*3e14f97fSRoger A. Faulkner 	char		decomma;	/* decimal_point=',' */ \
179da2e3ebdSchin 	char		*readscript;	/* set before reading a script */ \
180da2e3ebdSchin 	int		*inpipe;	/* input pipe pointer */ \
181da2e3ebdSchin 	int		*outpipe;	/* output pipe pointer */ \
182da2e3ebdSchin 	int		cpipe[2]; \
183da2e3ebdSchin 	int		coutpipe; \
184da2e3ebdSchin 	int		inuse_bits; \
185da2e3ebdSchin 	struct argnod	*envlist; \
186da2e3ebdSchin 	struct dolnod	*arglist; \
187da2e3ebdSchin 	int		fn_depth; \
1887c2fbfb3SApril Chin 	int		fn_reset; \
189da2e3ebdSchin 	int		dot_depth; \
190da2e3ebdSchin 	int		hist_depth; \
191da2e3ebdSchin 	int		xargmin; \
192da2e3ebdSchin 	int		xargmax; \
193da2e3ebdSchin 	int		xargexit; \
1947c2fbfb3SApril Chin 	int		nenv; \
195da2e3ebdSchin 	mode_t		mask; \
196da2e3ebdSchin 	long		nforks; \
197da2e3ebdSchin 	Env_t		*env; \
198da2e3ebdSchin 	void		*init_context; \
199da2e3ebdSchin 	void		*mac_context; \
200da2e3ebdSchin 	void		*lex_context; \
201da2e3ebdSchin 	void		*arg_context; \
202da2e3ebdSchin 	void		*ed_context; \
203da2e3ebdSchin 	void		*job_context; \
204da2e3ebdSchin 	void		*pathlist; \
205da2e3ebdSchin 	void		*defpathlist; \
206da2e3ebdSchin 	void		*cdpathlist; \
207da2e3ebdSchin 	char		**argaddr; \
208da2e3ebdSchin 	void		*optlist; \
209da2e3ebdSchin 	struct sh_scoped global; \
210da2e3ebdSchin 	struct checkpt	checkbase; \
211da2e3ebdSchin 	Shinit_f	userinit; \
212da2e3ebdSchin 	Shbltin_f	bltinfun; \
2137c2fbfb3SApril Chin 	Shbltin_t	bltindata; \
214da2e3ebdSchin 	Shwait_f	waitevent; \
215da2e3ebdSchin 	char		*cur_line; \
216da2e3ebdSchin 	char		*rcfile; \
217da2e3ebdSchin 	char		**login_files; \
2187c2fbfb3SApril Chin 	int		offsets[10]; \
219da2e3ebdSchin 	Sfio_t		**sftable; \
220da2e3ebdSchin 	unsigned char	*fdstatus; \
221da2e3ebdSchin 	const char	*pwd; \
222da2e3ebdSchin 	History_t	*hist_ptr; \
223da2e3ebdSchin 	void		*jmpbuffer; \
224da2e3ebdSchin 	void		*mktype; \
225da2e3ebdSchin 	Sfio_t		*strbuf; \
2267c2fbfb3SApril Chin 	Sfio_t		*strbuf2; \
227da2e3ebdSchin 	Dt_t		*last_root; \
2287c2fbfb3SApril Chin 	Dt_t		*prev_root; \
2297c2fbfb3SApril Chin 	Dt_t		*fpathdict; \
2307c2fbfb3SApril Chin 	Dt_t		*typedict; \
231da2e3ebdSchin 	char		ifstable[256]; \
2327c2fbfb3SApril Chin 	unsigned char	sigruntime[2]; \
2337c2fbfb3SApril Chin 	unsigned long	test; \
2347c2fbfb3SApril Chin 	Shopt_t		offoptions; \
2357c2fbfb3SApril Chin 	Shopt_t		glob_options; \
2367c2fbfb3SApril Chin 	Namval_t	*typeinit; \
2377c2fbfb3SApril Chin 	int		*stats; \
23834f9b3eeSRoland Mainz 	Namfun_t	nvfun; \
23934f9b3eeSRoland Mainz 	struct Regress_s*regress;
240da2e3ebdSchin 
241da2e3ebdSchin #include	<shell.h>
242da2e3ebdSchin 
24334f9b3eeSRoland Mainz #include	"regress.h"
244da2e3ebdSchin 
245da2e3ebdSchin /* error exits from various parts of shell */
246da2e3ebdSchin #define	NIL(type)	((type)0)
247da2e3ebdSchin 
248da2e3ebdSchin #define new_of(type,x)	((type*)malloc((unsigned)sizeof(type)+(x)))
249da2e3ebdSchin 
250da2e3ebdSchin #define exitset()	(sh.savexit=sh.exitval)
251da2e3ebdSchin 
252da2e3ebdSchin #ifndef SH_DICT
253da2e3ebdSchin #define SH_DICT		(void*)e_dict
254da2e3ebdSchin #endif
255da2e3ebdSchin 
256da2e3ebdSchin #ifndef SH_CMDLIB_DIR
257da2e3ebdSchin #define SH_CMDLIB_DIR	"/opt/ast/bin"
258da2e3ebdSchin #endif
259da2e3ebdSchin 
260da2e3ebdSchin /* states */
261da2e3ebdSchin /* low numbered states are same as options */
26234f9b3eeSRoland Mainz #define SH_NOFORK	0	/* set when fork not necessary */
263da2e3ebdSchin #define	SH_FORKED	7	/* set when process has been forked */
264da2e3ebdSchin #define	SH_PROFILE	8	/* set when processing profiles */
265da2e3ebdSchin #define SH_NOALIAS	9	/* do not expand non-exported aliases */
266da2e3ebdSchin #define SH_NOTRACK	10	/* set to disable sftrack() function */
267da2e3ebdSchin #define SH_STOPOK	11	/* set for stopable builtins */
268da2e3ebdSchin #define SH_GRACE	12	/* set for timeout grace period */
269da2e3ebdSchin #define SH_TIMING	13	/* set while timing pipelines */
270da2e3ebdSchin #define SH_DEFPATH	14	/* set when using default path */
271da2e3ebdSchin #define SH_INIT		15	/* set when initializing the shell */
272da2e3ebdSchin #define SH_TTYWAIT	16	/* waiting for keyboard input */
273da2e3ebdSchin #define	SH_FCOMPLETE	17	/* set for filename completion */
274da2e3ebdSchin #define	SH_PREINIT	18	/* set with SH_INIT before parsing options */
27534f9b3eeSRoland Mainz #define SH_COMPLETE	19	/* set for command completion */
276da2e3ebdSchin 
277da2e3ebdSchin #define SH_BASH			41
278da2e3ebdSchin #define SH_BRACEEXPAND		42
279da2e3ebdSchin #define SH_POSIX		46
280da2e3ebdSchin #define SH_MULTILINE    	47
281da2e3ebdSchin 
282da2e3ebdSchin #define SH_NOPROFILE		78
283da2e3ebdSchin #define SH_NOUSRPROFILE		79
284da2e3ebdSchin #define SH_LOGIN_SHELL		67
285da2e3ebdSchin #define SH_COMMANDLINE		0x100
286da2e3ebdSchin #define SH_BASHEXTRA		0x200
287da2e3ebdSchin #define SH_BASHOPT		0x400
288da2e3ebdSchin 
289da2e3ebdSchin #define SH_ID			"ksh"	/* ksh id */
290da2e3ebdSchin #define SH_STD			"sh"	/* standard sh id */
291da2e3ebdSchin 
292da2e3ebdSchin /* defines for sh_type() */
293da2e3ebdSchin 
294da2e3ebdSchin #define SH_TYPE_SH		001
295da2e3ebdSchin #define SH_TYPE_KSH		002
296da2e3ebdSchin #define SH_TYPE_BASH		004
297da2e3ebdSchin #define SH_TYPE_LOGIN		010
298da2e3ebdSchin #define SH_TYPE_PROFILE		020
299da2e3ebdSchin #define SH_TYPE_RESTRICTED	040
300da2e3ebdSchin 
301da2e3ebdSchin #if SHOPT_BASH
302da2e3ebdSchin #   ifndef SHOPT_HISTEXPAND
303da2e3ebdSchin #	define SHOPT_HISTEXPAND	1
304da2e3ebdSchin #   endif
305da2e3ebdSchin /*
306da2e3ebdSchin  *  define for all the bash options
307da2e3ebdSchin  */
308da2e3ebdSchin #   define SH_CDABLE_VARS	51
309da2e3ebdSchin #   define SH_CDSPELL		52
310da2e3ebdSchin #   define SH_CHECKHASH		53
311da2e3ebdSchin #   define SH_CHECKWINSIZE	54
312da2e3ebdSchin #   define SH_CMDHIST		55
313da2e3ebdSchin #   define SH_DOTGLOB		56
314da2e3ebdSchin #   define SH_EXECFAIL		57
315da2e3ebdSchin #   define SH_EXPAND_ALIASES	58
316da2e3ebdSchin #   define SH_EXTGLOB		59
317da2e3ebdSchin #   define SH_HOSTCOMPLETE	63
318da2e3ebdSchin #   define SH_HUPONEXIT		64
319da2e3ebdSchin #   define SH_INTERACTIVE_COMM	65
320da2e3ebdSchin #   define SH_LITHIST		66
321da2e3ebdSchin #   define SH_MAILWARN		68
322da2e3ebdSchin #   define SH_NOEMPTYCMDCOMPL	69
323da2e3ebdSchin #   define SH_NOCASEGLOB	70
324da2e3ebdSchin #   define SH_NULLGLOB		71
325da2e3ebdSchin #   define SH_PHYSICAL		45
326da2e3ebdSchin #   define SH_PROGCOMP		72
327da2e3ebdSchin #   define SH_PROMPTVARS	73
328da2e3ebdSchin #   define SH_RESTRICTED2	74
329da2e3ebdSchin #   define SH_SHIFT_VERBOSE	75
330da2e3ebdSchin #   define SH_SOURCEPATH	76
331da2e3ebdSchin #   define SH_XPG_ECHO		77
332da2e3ebdSchin #endif
333da2e3ebdSchin 
334da2e3ebdSchin #if SHOPT_HISTEXPAND
335da2e3ebdSchin #   define SH_HISTAPPEND	60
336da2e3ebdSchin #   define SH_HISTEXPAND	43
337da2e3ebdSchin #   define SH_HISTORY2		44
338da2e3ebdSchin #   define SH_HISTREEDIT	61
339da2e3ebdSchin #   define SH_HISTVERIFY	62
340da2e3ebdSchin #endif
341da2e3ebdSchin 
342da2e3ebdSchin #ifndef PIPE_BUF
343da2e3ebdSchin #   define PIPE_BUF		512
344da2e3ebdSchin #endif
345da2e3ebdSchin 
346*3e14f97fSRoger A. Faulkner #if SHOPT_PFSH && ( !_lib_getexecuser || !_lib_free_execattr )
347*3e14f97fSRoger A. Faulkner #   undef SHOPT_PFSH
348*3e14f97fSRoger A. Faulkner #endif
349*3e14f97fSRoger A. Faulkner 
350da2e3ebdSchin #define MATCH_MAX		64
351da2e3ebdSchin 
3527c2fbfb3SApril Chin #define SH_READEVAL		0x4000	/* for sh_eval */
35334f9b3eeSRoland Mainz #define SH_FUNEVAL		0x10000	/* for sh_eval for function load */
3547c2fbfb3SApril Chin 
3557c2fbfb3SApril Chin extern Shell_t		*nv_shell(Namval_t*);
356da2e3ebdSchin extern int		sh_addlib(void*);
3577c2fbfb3SApril Chin extern void		sh_applyopts(Shell_t*,Shopt_t);
3587c2fbfb3SApril Chin extern char 		**sh_argbuild(Shell_t*,int*,const struct comnod*,int);
3597c2fbfb3SApril Chin extern struct dolnod	*sh_argfree(Shell_t *, struct dolnod*,int);
3607c2fbfb3SApril Chin extern struct dolnod	*sh_argnew(Shell_t*,char*[],struct dolnod**);
361da2e3ebdSchin extern void 		*sh_argopen(Shell_t*);
36234f9b3eeSRoland Mainz extern struct argnod	*sh_argprocsub(Shell_t*,struct argnod*);
3637c2fbfb3SApril Chin extern void 		sh_argreset(Shell_t*,struct dolnod*,struct dolnod*);
364da2e3ebdSchin extern Namval_t		*sh_assignok(Namval_t*,int);
3657c2fbfb3SApril Chin extern struct dolnod	*sh_arguse(Shell_t*);
366da2e3ebdSchin extern char		*sh_checkid(char*,char*);
3677c2fbfb3SApril Chin extern int		sh_debug(Shell_t *shp,const char*,const char*,const char*,char *const[],int);
368da2e3ebdSchin extern int 		sh_echolist(Sfio_t*, int, char**);
3697c2fbfb3SApril Chin extern struct argnod	*sh_endword(Shell_t*,int);
370da2e3ebdSchin extern char 		**sh_envgen(void);
371da2e3ebdSchin #if SHOPT_ENV
372da2e3ebdSchin extern void 		sh_envput(Env_t*, Namval_t*);
373da2e3ebdSchin #endif
374da2e3ebdSchin extern void 		sh_envnolocal(Namval_t*,void*);
375da2e3ebdSchin extern Sfdouble_t	sh_arith(const char*);
376da2e3ebdSchin extern void		*sh_arithcomp(char*);
377da2e3ebdSchin extern pid_t 		sh_fork(int,int*);
378da2e3ebdSchin extern pid_t		_sh_fork(pid_t, int ,int*);
3797c2fbfb3SApril Chin extern char 		*sh_mactrim(Shell_t*,char*,int);
3807c2fbfb3SApril Chin extern int 		sh_macexpand(Shell_t*,struct argnod*,struct argnod**,int);
3817c2fbfb3SApril Chin extern int		sh_macfun(Shell_t*,const char*,int);
3827c2fbfb3SApril Chin extern void 		sh_machere(Shell_t*,Sfio_t*, Sfio_t*, char*);
383da2e3ebdSchin extern void 		*sh_macopen(Shell_t*);
3847c2fbfb3SApril Chin extern char 		*sh_macpat(Shell_t*,struct argnod*,int);
3857c2fbfb3SApril Chin extern char 		*sh_mactry(Shell_t*,char*);
386da2e3ebdSchin extern void		sh_printopts(Shopt_t,int,Shopt_t*);
387da2e3ebdSchin extern int 		sh_readline(Shell_t*,char**,int,int,long);
388da2e3ebdSchin extern Sfio_t		*sh_sfeval(char*[]);
389da2e3ebdSchin extern void		sh_setmatch(const char*,int,int,int[]);
390da2e3ebdSchin extern Dt_t		*sh_subaliastree(int);
3917c2fbfb3SApril Chin extern void             sh_scope(Shell_t*, struct argnod*, int);
3927c2fbfb3SApril Chin extern Namval_t		*sh_scoped(Shell_t*, Namval_t*);
393da2e3ebdSchin extern Dt_t		*sh_subfuntree(int);
3947c2fbfb3SApril Chin extern void		sh_subjobcheck(pid_t);
395da2e3ebdSchin extern int		sh_subsavefd(int);
3967c2fbfb3SApril Chin extern void		sh_subtmpfile(int);
397da2e3ebdSchin extern char 		*sh_substitute(const char*,const char*,char*);
398da2e3ebdSchin extern const char	*_sh_translate(const char*);
399da2e3ebdSchin extern int		sh_trace(char*[],int);
400da2e3ebdSchin extern void		sh_trim(char*);
401da2e3ebdSchin extern int		sh_type(const char*);
4027c2fbfb3SApril Chin extern void             sh_unscope(Shell_t*);
403da2e3ebdSchin extern void		sh_utol(const char*, char*);
404da2e3ebdSchin extern int 		sh_whence(char**,int);
405da2e3ebdSchin 
406da2e3ebdSchin #ifndef ERROR_dictionary
407da2e3ebdSchin #   define ERROR_dictionary(s)	(s)
408da2e3ebdSchin #endif
409da2e3ebdSchin #define sh_translate(s)	_sh_translate(ERROR_dictionary(s))
410da2e3ebdSchin 
411da2e3ebdSchin #define WBITS		(sizeof(long)*8)
412da2e3ebdSchin #define WMASK		(0xff)
413da2e3ebdSchin 
414da2e3ebdSchin #define is_option(s,x)	((s)->v[((x)&WMASK)/WBITS] & (1L << ((x) % WBITS)))
415da2e3ebdSchin #define on_option(s,x)	((s)->v[((x)&WMASK)/WBITS] |= (1L << ((x) % WBITS)))
416da2e3ebdSchin #define off_option(s,x)	((s)->v[((x)&WMASK)/WBITS] &= ~(1L << ((x) % WBITS)))
417da2e3ebdSchin #define sh_isoption(x)	is_option(&sh.options,x)
418da2e3ebdSchin #define sh_onoption(x)	on_option(&sh.options,x)
419da2e3ebdSchin #define sh_offoption(x)	off_option(&sh.options,x)
420da2e3ebdSchin 
421da2e3ebdSchin 
422da2e3ebdSchin #define sh_state(x)	( 1<<(x))
423da2e3ebdSchin #define	sh_isstate(x)	(sh.st.states&sh_state(x))
424da2e3ebdSchin #define	sh_onstate(x)	(sh.st.states |= sh_state(x))
425da2e3ebdSchin #define	sh_offstate(x)	(sh.st.states &= ~sh_state(x))
426da2e3ebdSchin #define	sh_getstate()	(sh.st.states)
427da2e3ebdSchin #define	sh_setstate(x)	(sh.st.states = (x))
428da2e3ebdSchin 
429da2e3ebdSchin #define sh_sigcheck() do{if(sh.trapnote&SH_SIGSET)sh_exit(SH_EXITSIG);} while(0)
430da2e3ebdSchin 
431da2e3ebdSchin extern int32_t		sh_mailchk;
432da2e3ebdSchin extern const char	e_dict[];
433da2e3ebdSchin 
434da2e3ebdSchin /* sh_printopts() mode flags -- set --[no]option by default */
435da2e3ebdSchin 
436da2e3ebdSchin #define PRINT_VERBOSE	0x01	/* option on|off list		*/
4377c2fbfb3SApril Chin #define PRINT_ALL	0x02	/* list unset options too	*/
438da2e3ebdSchin #define PRINT_NO_HEADER	0x04	/* omit listing header		*/
439da2e3ebdSchin #define PRINT_SHOPT	0x08	/* shopt -s|-u			*/
440da2e3ebdSchin #define PRINT_TABLE	0x10	/* table of all options		*/
4417c2fbfb3SApril Chin 
4427c2fbfb3SApril Chin #ifdef SHOPT_STATS
4437c2fbfb3SApril Chin     /* performance statistics */
4447c2fbfb3SApril Chin #   define	STAT_ARGHITS	0
4457c2fbfb3SApril Chin #   define	STAT_ARGEXPAND	1
4467c2fbfb3SApril Chin #   define	STAT_COMSUB	2
4477c2fbfb3SApril Chin #   define	STAT_FORKS	3
4487c2fbfb3SApril Chin #   define	STAT_FUNCT	4
4497c2fbfb3SApril Chin #   define	STAT_GLOBS	5
4507c2fbfb3SApril Chin #   define	STAT_READS	6
4517c2fbfb3SApril Chin #   define	STAT_NVHITS	7
4527c2fbfb3SApril Chin #   define	STAT_NVOPEN	8
4537c2fbfb3SApril Chin #   define	STAT_PATHS	9
4547c2fbfb3SApril Chin #   define	STAT_SVFUNCT	10
4557c2fbfb3SApril Chin #   define	STAT_SCMDS	11
4567c2fbfb3SApril Chin #   define	STAT_SPAWN	12
4577c2fbfb3SApril Chin #   define	STAT_SUBSHELL	13
4587c2fbfb3SApril Chin     extern const Shtable_t shtab_stats[];
4597c2fbfb3SApril Chin #   define sh_stats(x)	(sh.stats[(x)]++)
4607c2fbfb3SApril Chin #else
4617c2fbfb3SApril Chin #   define sh_stats(x)
4627c2fbfb3SApril Chin #endif /* SHOPT_STATS */
4637c2fbfb3SApril Chin 
4647c2fbfb3SApril Chin 
4657c2fbfb3SApril Chin #endif
466