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