xref: /onnv-gate/usr/src/lib/libshell/common/include/defs.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 /*
224887Schin  * David Korn
234887Schin  * AT&T Labs
244887Schin  *
254887Schin  * Shell interface private definitions
264887Schin  *
274887Schin  */
288462SApril.Chin@Sun.COM #ifndef defs_h_defined
298462SApril.Chin@Sun.COM #define defs_h_defined
304887Schin 
314887Schin #include	<ast.h>
324887Schin #include	<sfio.h>
334887Schin #include	<error.h>
34*12068SRoger.Faulkner@Oracle.COM #include	"FEATURE/externs"
354887Schin #include	"FEATURE/options"
364887Schin #include	<cdt.h>
374887Schin #include	<history.h>
384887Schin #include	"fault.h"
394887Schin #include	"argnod.h"
408462SApril.Chin@Sun.COM #include	"name.h"
4110898Sroland.mainz@nrubsig.org #include	<ctype.h>
428462SApril.Chin@Sun.COM #define _SH_PRIVATE
438462SApril.Chin@Sun.COM #include	<shcmd.h>
448462SApril.Chin@Sun.COM #undef _SH_PRIVATE
454887Schin 
464887Schin #ifndef pointerof
474887Schin #define pointerof(x)		((void*)((char*)0+(x)))
484887Schin #endif
494887Schin 
508462SApril.Chin@Sun.COM #define Empty			((char*)(e_sptbnl+3))
518462SApril.Chin@Sun.COM 
524887Schin #define	env_change()		(++ast.env_serial)
534887Schin #if SHOPT_ENV
544887Schin #   include	<env.h>
554887Schin #else
564887Schin #   define Env_t		void
574887Schin #   define sh_envput(e,p)	env_change()
584887Schin #   define env_delete(e,p)	env_change()
594887Schin #endif
604887Schin 
61*12068SRoger.Faulkner@Oracle.COM extern char*	sh_getenv(const char*);
62*12068SRoger.Faulkner@Oracle.COM extern char*	sh_setenviron(const char*);
63*12068SRoger.Faulkner@Oracle.COM 
644887Schin /*
654887Schin  * note that the first few fields have to be the same as for
664887Schin  * Shscoped_t in <shell.h>
674887Schin  */
688462SApril.Chin@Sun.COM 
698462SApril.Chin@Sun.COM 
704887Schin struct sh_scoped
714887Schin {
724887Schin 	struct sh_scoped *prevst;	/* pointer to previous state */
734887Schin 	int		dolc;
744887Schin 	char		**dolv;
754887Schin 	char		*cmdname;
764887Schin 	char		*filename;
778462SApril.Chin@Sun.COM 	char		*funname;
784887Schin 	int		lineno;
794887Schin 	Dt_t		*save_tree;	/* var_tree for calling function */
804887Schin 	struct sh_scoped *self;		/* pointer to copy of this scope*/
814887Schin 	Dt_t		*var_local;	/* local level variables for name() */
824887Schin 	struct slnod	*staklist;	/* link list of function stacks */
834887Schin 	int		states;
844887Schin 	int		breakcnt;
854887Schin 	int		execbrk;
864887Schin 	int		loopcnt;
874887Schin 	int		firstline;
884887Schin 	int32_t		optindex;
894887Schin 	int32_t		optnum;
904887Schin 	int32_t		tmout;		/* value for TMOUT */
914887Schin 	short		optchar;
924887Schin 	short		opterror;
934887Schin 	int		ioset;
944887Schin 	unsigned short	trapmax;
954887Schin 	char		*trap[SH_DEBUGTRAP+1];
964887Schin 	char		**trapcom;
974887Schin 	char		**otrapcom;
984887Schin 	void		*timetrap;
998462SApril.Chin@Sun.COM 	struct Ufunction *real_fun;	/* current 'function name' function */
1004887Schin };
1014887Schin 
1024887Schin struct limits
1034887Schin {
1044887Schin 	long		arg_max;	/* max arg+env exec() size */
1054887Schin 	int		open_max;	/* maximum number of file descriptors */
1064887Schin 	int		clk_tck;	/* number of ticks per second */
1074887Schin 	int		child_max;	/* maxumum number of children */
1084887Schin 	int		ngroups_max;	/* maximum number of process groups */
1094887Schin 	unsigned char	posix_version;	/* posix version number */
1104887Schin 	unsigned char	posix_jobcontrol;/* non-zero for job control systems */
1114887Schin 	unsigned char	fs3d;		/* non-zero for 3-d file system */
1124887Schin };
1134887Schin 
1144887Schin #define _SH_PRIVATE \
1154887Schin 	struct sh_scoped st;		/* scoped information */ \
1164887Schin 	struct limits	lim;		/* run time limits */ \
1178462SApril.Chin@Sun.COM 	Stk_t		*stk;		/* stack poiter */ \
1184887Schin 	Sfio_t		*heredocs;	/* current here-doc temp file */ \
1194887Schin 	Sfio_t		*funlog;	/* for logging function definitions */ \
1204887Schin 	int		**fdptrs;	/* pointer to file numbers */ \
1214887Schin 	int		savexit; \
1224887Schin 	char		*lastarg; \
1234887Schin 	char		*lastpath;	/* last alsolute path found */ \
1244887Schin 	int		path_err;	/* last error on path search */ \
1254887Schin 	Dt_t		*track_tree;	/* for tracked aliases*/ \
1264887Schin 	Dt_t		*var_base;	/* global level variables */ \
1274887Schin 	Namval_t	*namespace;	/* current active namespace*/ \
1284887Schin 	Namval_t	*last_table;	/* last table used in last nv_open  */ \
1298462SApril.Chin@Sun.COM 	Namval_t	*prev_table;	/* previous table used in nv_open  */ \
1304887Schin 	Sfio_t		*outpool;	/* ouput stream pool */ \
1314887Schin 	long		timeout;	/* read timeout */ \
1324887Schin 	short		curenv;		/* current subshell number */ \
1334887Schin 	short		jobenv;		/* subshell number for jobs */ \
1348462SApril.Chin@Sun.COM 	int		infd;		/* input file descriptor */ \
1354887Schin 	int		nextprompt;	/* next prompt is PS<nextprompt> */ \
1368462SApril.Chin@Sun.COM 	int		bltin_nnodes;	/* number of bltins nodes */ \
1378462SApril.Chin@Sun.COM 	Namval_t	*bltin_nodes;	/* pointer to built-in variables */ \
1384887Schin 	Namval_t	*bltin_cmds;	/* pointer to built-in commands */ \
1394887Schin 	Namval_t	*posix_fun;	/* points to last name() function */ \
1404887Schin 	char		*outbuff;	/* pointer to output buffer */ \
1414887Schin 	char		*errbuff;	/* pointer to stderr buffer */ \
1424887Schin 	char		*prompt;	/* pointer to prompt string */ \
1434887Schin 	char		*shname;	/* shell name */ \
1444887Schin 	char		*shpath;	/* path name of shell */ \
1454887Schin 	char		*user;		/* name of real user for pfsh */ \
1464887Schin 	char		*comdiv;	/* points to sh -c argument */ \
1474887Schin 	char		*prefix;	/* prefix for compound assignment */ \
1484887Schin 	sigjmp_buf	*jmplist;	/* longjmp return stack */ \
1494887Schin 	char		**sigmsg;	/* points to signal messages */ \
1504887Schin 	int		oldexit; \
1514887Schin 	uid_t 		userid,euserid;	/* real and effective user id */ \
1524887Schin 	gid_t 		groupid,egroupid;/* real and effective group id */ \
1534887Schin 	pid_t		pid;		/* process id of shell */ \
1544887Schin 	pid_t		bckpid;		/* background process id */ \
1554887Schin 	pid_t		cpid; \
1568462SApril.Chin@Sun.COM 	pid_t		spid; 		/* subshell process id */ \
15710898Sroland.mainz@nrubsig.org 	pid_t		pipepid; \
1584887Schin 	int32_t		ppid;		/* parent process id of shell */ \
1594887Schin 	int		topfd; \
1604887Schin 	int		sigmax;		/* maximum number of signals */ \
1614887Schin 	int		savesig; \
1624887Schin 	unsigned char	*sigflag;	/* pointer to signal states */ \
1634887Schin 	char		intrap; \
1644887Schin 	char		login_sh; \
1654887Schin 	char		lastbase; \
1664887Schin 	char		forked;	\
1674887Schin 	char		binscript; \
1684887Schin 	char		deftype; \
1698462SApril.Chin@Sun.COM 	char		funload; \
1704887Schin 	char		used_pos;	/* used postional parameter */\
1718462SApril.Chin@Sun.COM 	char		universe; \
1728462SApril.Chin@Sun.COM 	char		winch; \
1738462SApril.Chin@Sun.COM 	char		indebug; 	/* set when in debug trap */ \
1744887Schin 	unsigned char	lastsig;	/* last signal received */ \
1758810SCasper.Dik@Sun.COM 	char		subshare;	/* set when in ${..} comsub */ \
17610898Sroland.mainz@nrubsig.org 	char		toomany;	/* set when out of fd's */ \
177*12068SRoger.Faulkner@Oracle.COM 	char		instance;	/* in set_instance */ \
178*12068SRoger.Faulkner@Oracle.COM 	char		decomma;	/* decimal_point=',' */ \
1794887Schin 	char		*readscript;	/* set before reading a script */ \
1804887Schin 	int		*inpipe;	/* input pipe pointer */ \
1814887Schin 	int		*outpipe;	/* output pipe pointer */ \
1824887Schin 	int		cpipe[2]; \
1834887Schin 	int		coutpipe; \
1844887Schin 	int		inuse_bits; \
1854887Schin 	struct argnod	*envlist; \
1864887Schin 	struct dolnod	*arglist; \
1874887Schin 	int		fn_depth; \
1888462SApril.Chin@Sun.COM 	int		fn_reset; \
1894887Schin 	int		dot_depth; \
1904887Schin 	int		hist_depth; \
1914887Schin 	int		xargmin; \
1924887Schin 	int		xargmax; \
1934887Schin 	int		xargexit; \
1948462SApril.Chin@Sun.COM 	int		nenv; \
1954887Schin 	mode_t		mask; \
1964887Schin 	long		nforks; \
1974887Schin 	Env_t		*env; \
1984887Schin 	void		*init_context; \
1994887Schin 	void		*mac_context; \
2004887Schin 	void		*lex_context; \
2014887Schin 	void		*arg_context; \
2024887Schin 	void		*ed_context; \
2034887Schin 	void		*job_context; \
2044887Schin 	void		*pathlist; \
2054887Schin 	void		*defpathlist; \
2064887Schin 	void		*cdpathlist; \
2074887Schin 	char		**argaddr; \
2084887Schin 	void		*optlist; \
2094887Schin 	struct sh_scoped global; \
2104887Schin 	struct checkpt	checkbase; \
2114887Schin 	Shinit_f	userinit; \
2124887Schin 	Shbltin_f	bltinfun; \
2138462SApril.Chin@Sun.COM 	Shbltin_t	bltindata; \
2144887Schin 	Shwait_f	waitevent; \
2154887Schin 	char		*cur_line; \
2164887Schin 	char		*rcfile; \
2174887Schin 	char		**login_files; \
2188462SApril.Chin@Sun.COM 	int		offsets[10]; \
2194887Schin 	Sfio_t		**sftable; \
2204887Schin 	unsigned char	*fdstatus; \
2214887Schin 	const char	*pwd; \
2224887Schin 	History_t	*hist_ptr; \
2234887Schin 	void		*jmpbuffer; \
2244887Schin 	void		*mktype; \
2254887Schin 	Sfio_t		*strbuf; \
2268462SApril.Chin@Sun.COM 	Sfio_t		*strbuf2; \
2274887Schin 	Dt_t		*last_root; \
2288462SApril.Chin@Sun.COM 	Dt_t		*prev_root; \
2298462SApril.Chin@Sun.COM 	Dt_t		*fpathdict; \
2308462SApril.Chin@Sun.COM 	Dt_t		*typedict; \
2314887Schin 	char		ifstable[256]; \
2328462SApril.Chin@Sun.COM 	unsigned char	sigruntime[2]; \
2338462SApril.Chin@Sun.COM 	unsigned long	test; \
2348462SApril.Chin@Sun.COM 	Shopt_t		offoptions; \
2358462SApril.Chin@Sun.COM 	Shopt_t		glob_options; \
2368462SApril.Chin@Sun.COM 	Namval_t	*typeinit; \
2378462SApril.Chin@Sun.COM 	int		*stats; \
23810898Sroland.mainz@nrubsig.org 	Namfun_t	nvfun; \
23910898Sroland.mainz@nrubsig.org 	struct Regress_s*regress;
2404887Schin 
2414887Schin #include	<shell.h>
2424887Schin 
24310898Sroland.mainz@nrubsig.org #include	"regress.h"
2444887Schin 
2454887Schin /* error exits from various parts of shell */
2464887Schin #define	NIL(type)	((type)0)
2474887Schin 
2484887Schin #define new_of(type,x)	((type*)malloc((unsigned)sizeof(type)+(x)))
2494887Schin 
2504887Schin #define exitset()	(sh.savexit=sh.exitval)
2514887Schin 
2524887Schin #ifndef SH_DICT
2534887Schin #define SH_DICT		(void*)e_dict
2544887Schin #endif
2554887Schin 
2564887Schin #ifndef SH_CMDLIB_DIR
2574887Schin #define SH_CMDLIB_DIR	"/opt/ast/bin"
2584887Schin #endif
2594887Schin 
2604887Schin /* states */
2614887Schin /* low numbered states are same as options */
26210898Sroland.mainz@nrubsig.org #define SH_NOFORK	0	/* set when fork not necessary */
2634887Schin #define	SH_FORKED	7	/* set when process has been forked */
2644887Schin #define	SH_PROFILE	8	/* set when processing profiles */
2654887Schin #define SH_NOALIAS	9	/* do not expand non-exported aliases */
2664887Schin #define SH_NOTRACK	10	/* set to disable sftrack() function */
2674887Schin #define SH_STOPOK	11	/* set for stopable builtins */
2684887Schin #define SH_GRACE	12	/* set for timeout grace period */
2694887Schin #define SH_TIMING	13	/* set while timing pipelines */
2704887Schin #define SH_DEFPATH	14	/* set when using default path */
2714887Schin #define SH_INIT		15	/* set when initializing the shell */
2724887Schin #define SH_TTYWAIT	16	/* waiting for keyboard input */
2734887Schin #define	SH_FCOMPLETE	17	/* set for filename completion */
2744887Schin #define	SH_PREINIT	18	/* set with SH_INIT before parsing options */
27510898Sroland.mainz@nrubsig.org #define SH_COMPLETE	19	/* set for command completion */
2764887Schin 
2774887Schin #define SH_BASH			41
2784887Schin #define SH_BRACEEXPAND		42
2794887Schin #define SH_POSIX		46
2804887Schin #define SH_MULTILINE    	47
2814887Schin 
2824887Schin #define SH_NOPROFILE		78
2834887Schin #define SH_NOUSRPROFILE		79
2844887Schin #define SH_LOGIN_SHELL		67
2854887Schin #define SH_COMMANDLINE		0x100
2864887Schin #define SH_BASHEXTRA		0x200
2874887Schin #define SH_BASHOPT		0x400
2884887Schin 
2894887Schin #define SH_ID			"ksh"	/* ksh id */
2904887Schin #define SH_STD			"sh"	/* standard sh id */
2914887Schin 
2924887Schin /* defines for sh_type() */
2934887Schin 
2944887Schin #define SH_TYPE_SH		001
2954887Schin #define SH_TYPE_KSH		002
2964887Schin #define SH_TYPE_BASH		004
2974887Schin #define SH_TYPE_LOGIN		010
2984887Schin #define SH_TYPE_PROFILE		020
2994887Schin #define SH_TYPE_RESTRICTED	040
3004887Schin 
3014887Schin #if SHOPT_BASH
3024887Schin #   ifndef SHOPT_HISTEXPAND
3034887Schin #	define SHOPT_HISTEXPAND	1
3044887Schin #   endif
3054887Schin /*
3064887Schin  *  define for all the bash options
3074887Schin  */
3084887Schin #   define SH_CDABLE_VARS	51
3094887Schin #   define SH_CDSPELL		52
3104887Schin #   define SH_CHECKHASH		53
3114887Schin #   define SH_CHECKWINSIZE	54
3124887Schin #   define SH_CMDHIST		55
3134887Schin #   define SH_DOTGLOB		56
3144887Schin #   define SH_EXECFAIL		57
3154887Schin #   define SH_EXPAND_ALIASES	58
3164887Schin #   define SH_EXTGLOB		59
3174887Schin #   define SH_HOSTCOMPLETE	63
3184887Schin #   define SH_HUPONEXIT		64
3194887Schin #   define SH_INTERACTIVE_COMM	65
3204887Schin #   define SH_LITHIST		66
3214887Schin #   define SH_MAILWARN		68
3224887Schin #   define SH_NOEMPTYCMDCOMPL	69
3234887Schin #   define SH_NOCASEGLOB	70
3244887Schin #   define SH_NULLGLOB		71
3254887Schin #   define SH_PHYSICAL		45
3264887Schin #   define SH_PROGCOMP		72
3274887Schin #   define SH_PROMPTVARS	73
3284887Schin #   define SH_RESTRICTED2	74
3294887Schin #   define SH_SHIFT_VERBOSE	75
3304887Schin #   define SH_SOURCEPATH	76
3314887Schin #   define SH_XPG_ECHO		77
3324887Schin #endif
3334887Schin 
3344887Schin #if SHOPT_HISTEXPAND
3354887Schin #   define SH_HISTAPPEND	60
3364887Schin #   define SH_HISTEXPAND	43
3374887Schin #   define SH_HISTORY2		44
3384887Schin #   define SH_HISTREEDIT	61
3394887Schin #   define SH_HISTVERIFY	62
3404887Schin #endif
3414887Schin 
3424887Schin #ifndef PIPE_BUF
3434887Schin #   define PIPE_BUF		512
3444887Schin #endif
3454887Schin 
346*12068SRoger.Faulkner@Oracle.COM #if SHOPT_PFSH && ( !_lib_getexecuser || !_lib_free_execattr )
347*12068SRoger.Faulkner@Oracle.COM #   undef SHOPT_PFSH
348*12068SRoger.Faulkner@Oracle.COM #endif
349*12068SRoger.Faulkner@Oracle.COM 
3504887Schin #define MATCH_MAX		64
3514887Schin 
3528462SApril.Chin@Sun.COM #define SH_READEVAL		0x4000	/* for sh_eval */
35310898Sroland.mainz@nrubsig.org #define SH_FUNEVAL		0x10000	/* for sh_eval for function load */
3548462SApril.Chin@Sun.COM 
3558462SApril.Chin@Sun.COM extern Shell_t		*nv_shell(Namval_t*);
3564887Schin extern int		sh_addlib(void*);
3578462SApril.Chin@Sun.COM extern void		sh_applyopts(Shell_t*,Shopt_t);
3588462SApril.Chin@Sun.COM extern char 		**sh_argbuild(Shell_t*,int*,const struct comnod*,int);
3598462SApril.Chin@Sun.COM extern struct dolnod	*sh_argfree(Shell_t *, struct dolnod*,int);
3608462SApril.Chin@Sun.COM extern struct dolnod	*sh_argnew(Shell_t*,char*[],struct dolnod**);
3614887Schin extern void 		*sh_argopen(Shell_t*);
36210898Sroland.mainz@nrubsig.org extern struct argnod	*sh_argprocsub(Shell_t*,struct argnod*);
3638462SApril.Chin@Sun.COM extern void 		sh_argreset(Shell_t*,struct dolnod*,struct dolnod*);
3644887Schin extern Namval_t		*sh_assignok(Namval_t*,int);
3658462SApril.Chin@Sun.COM extern struct dolnod	*sh_arguse(Shell_t*);
3664887Schin extern char		*sh_checkid(char*,char*);
3678462SApril.Chin@Sun.COM extern int		sh_debug(Shell_t *shp,const char*,const char*,const char*,char *const[],int);
3684887Schin extern int 		sh_echolist(Sfio_t*, int, char**);
3698462SApril.Chin@Sun.COM extern struct argnod	*sh_endword(Shell_t*,int);
3704887Schin extern char 		**sh_envgen(void);
3714887Schin #if SHOPT_ENV
3724887Schin extern void 		sh_envput(Env_t*, Namval_t*);
3734887Schin #endif
3744887Schin extern void 		sh_envnolocal(Namval_t*,void*);
3754887Schin extern Sfdouble_t	sh_arith(const char*);
3764887Schin extern void		*sh_arithcomp(char*);
3774887Schin extern pid_t 		sh_fork(int,int*);
3784887Schin extern pid_t		_sh_fork(pid_t, int ,int*);
3798462SApril.Chin@Sun.COM extern char 		*sh_mactrim(Shell_t*,char*,int);
3808462SApril.Chin@Sun.COM extern int 		sh_macexpand(Shell_t*,struct argnod*,struct argnod**,int);
3818462SApril.Chin@Sun.COM extern int		sh_macfun(Shell_t*,const char*,int);
3828462SApril.Chin@Sun.COM extern void 		sh_machere(Shell_t*,Sfio_t*, Sfio_t*, char*);
3834887Schin extern void 		*sh_macopen(Shell_t*);
3848462SApril.Chin@Sun.COM extern char 		*sh_macpat(Shell_t*,struct argnod*,int);
3858462SApril.Chin@Sun.COM extern char 		*sh_mactry(Shell_t*,char*);
3864887Schin extern void		sh_printopts(Shopt_t,int,Shopt_t*);
3874887Schin extern int 		sh_readline(Shell_t*,char**,int,int,long);
3884887Schin extern Sfio_t		*sh_sfeval(char*[]);
3894887Schin extern void		sh_setmatch(const char*,int,int,int[]);
3904887Schin extern Dt_t		*sh_subaliastree(int);
3918462SApril.Chin@Sun.COM extern void             sh_scope(Shell_t*, struct argnod*, int);
3928462SApril.Chin@Sun.COM extern Namval_t		*sh_scoped(Shell_t*, Namval_t*);
3934887Schin extern Dt_t		*sh_subfuntree(int);
3948462SApril.Chin@Sun.COM extern void		sh_subjobcheck(pid_t);
3954887Schin extern int		sh_subsavefd(int);
3968462SApril.Chin@Sun.COM extern void		sh_subtmpfile(int);
3974887Schin extern char 		*sh_substitute(const char*,const char*,char*);
3984887Schin extern const char	*_sh_translate(const char*);
3994887Schin extern int		sh_trace(char*[],int);
4004887Schin extern void		sh_trim(char*);
4014887Schin extern int		sh_type(const char*);
4028462SApril.Chin@Sun.COM extern void             sh_unscope(Shell_t*);
4034887Schin extern void		sh_utol(const char*, char*);
4044887Schin extern int 		sh_whence(char**,int);
4054887Schin 
4064887Schin #ifndef ERROR_dictionary
4074887Schin #   define ERROR_dictionary(s)	(s)
4084887Schin #endif
4094887Schin #define sh_translate(s)	_sh_translate(ERROR_dictionary(s))
4104887Schin 
4114887Schin #define WBITS		(sizeof(long)*8)
4124887Schin #define WMASK		(0xff)
4134887Schin 
4144887Schin #define is_option(s,x)	((s)->v[((x)&WMASK)/WBITS] & (1L << ((x) % WBITS)))
4154887Schin #define on_option(s,x)	((s)->v[((x)&WMASK)/WBITS] |= (1L << ((x) % WBITS)))
4164887Schin #define off_option(s,x)	((s)->v[((x)&WMASK)/WBITS] &= ~(1L << ((x) % WBITS)))
4174887Schin #define sh_isoption(x)	is_option(&sh.options,x)
4184887Schin #define sh_onoption(x)	on_option(&sh.options,x)
4194887Schin #define sh_offoption(x)	off_option(&sh.options,x)
4204887Schin 
4214887Schin 
4224887Schin #define sh_state(x)	( 1<<(x))
4234887Schin #define	sh_isstate(x)	(sh.st.states&sh_state(x))
4244887Schin #define	sh_onstate(x)	(sh.st.states |= sh_state(x))
4254887Schin #define	sh_offstate(x)	(sh.st.states &= ~sh_state(x))
4264887Schin #define	sh_getstate()	(sh.st.states)
4274887Schin #define	sh_setstate(x)	(sh.st.states = (x))
4284887Schin 
4294887Schin #define sh_sigcheck() do{if(sh.trapnote&SH_SIGSET)sh_exit(SH_EXITSIG);} while(0)
4304887Schin 
4314887Schin extern int32_t		sh_mailchk;
4324887Schin extern const char	e_dict[];
4334887Schin 
4344887Schin /* sh_printopts() mode flags -- set --[no]option by default */
4354887Schin 
4364887Schin #define PRINT_VERBOSE	0x01	/* option on|off list		*/
4378462SApril.Chin@Sun.COM #define PRINT_ALL	0x02	/* list unset options too	*/
4384887Schin #define PRINT_NO_HEADER	0x04	/* omit listing header		*/
4394887Schin #define PRINT_SHOPT	0x08	/* shopt -s|-u			*/
4404887Schin #define PRINT_TABLE	0x10	/* table of all options		*/
4418462SApril.Chin@Sun.COM 
4428462SApril.Chin@Sun.COM #ifdef SHOPT_STATS
4438462SApril.Chin@Sun.COM     /* performance statistics */
4448462SApril.Chin@Sun.COM #   define	STAT_ARGHITS	0
4458462SApril.Chin@Sun.COM #   define	STAT_ARGEXPAND	1
4468462SApril.Chin@Sun.COM #   define	STAT_COMSUB	2
4478462SApril.Chin@Sun.COM #   define	STAT_FORKS	3
4488462SApril.Chin@Sun.COM #   define	STAT_FUNCT	4
4498462SApril.Chin@Sun.COM #   define	STAT_GLOBS	5
4508462SApril.Chin@Sun.COM #   define	STAT_READS	6
4518462SApril.Chin@Sun.COM #   define	STAT_NVHITS	7
4528462SApril.Chin@Sun.COM #   define	STAT_NVOPEN	8
4538462SApril.Chin@Sun.COM #   define	STAT_PATHS	9
4548462SApril.Chin@Sun.COM #   define	STAT_SVFUNCT	10
4558462SApril.Chin@Sun.COM #   define	STAT_SCMDS	11
4568462SApril.Chin@Sun.COM #   define	STAT_SPAWN	12
4578462SApril.Chin@Sun.COM #   define	STAT_SUBSHELL	13
4588462SApril.Chin@Sun.COM     extern const Shtable_t shtab_stats[];
4598462SApril.Chin@Sun.COM #   define sh_stats(x)	(sh.stats[(x)]++)
4608462SApril.Chin@Sun.COM #else
4618462SApril.Chin@Sun.COM #   define sh_stats(x)
4628462SApril.Chin@Sun.COM #endif /* SHOPT_STATS */
4638462SApril.Chin@Sun.COM 
4648462SApril.Chin@Sun.COM 
4658462SApril.Chin@Sun.COM #endif
466