| /* $RCSfile$$Revision$$Date$ |
| * |
| * Copyright (c) 1989, Larry Wall |
| * |
| * You may distribute under the terms of the GNU General Public License |
| * as specified in the README file that comes with the perl 3.0 kit. |
| * |
| * $Log$ |
| * Revision 1.1 2004/02/17 22:21:16 criswell |
| * Initial commit of the perl Malloc Benchmark. I've cheated a little by |
| * generating the yacc output files and committing them directly, but it was |
| * easier than disabling the Bison Voodoo that gets executed by default. |
| * |
| * Revision 4.0.1.1 91/04/11 17:49:51 lwall |
| * patch1: hopefully straightened out some of the Xenix mess |
| * |
| * Revision 4.0 91/03/20 01:37:56 lwall |
| * 4.0 baseline. |
| * |
| */ |
| |
| #define VOIDWANT 1 |
| #include "config.h" |
| |
| #ifdef MSDOS |
| /* This stuff now in the MS-DOS config.h file. */ |
| #else /* !MSDOS */ |
| |
| /* |
| * The following symbols are defined if your operating system supports |
| * functions by that name. All Unixes I know of support them, thus they |
| * are not checked by the configuration script, but are directly defined |
| * here. |
| */ |
| #define HAS_ALARM |
| #define HAS_CHOWN |
| #define HAS_CHROOT |
| #define HAS_FORK |
| #define HAS_GETLOGIN |
| #define HAS_GETPPID |
| #define HAS_KILL |
| #define HAS_LINK |
| #define HAS_PIPE |
| #define HAS_WAIT |
| #define HAS_UMASK |
| /* |
| * The following symbols are defined if your operating system supports |
| * password and group functions in general. All Unix systems do. |
| */ |
| #define HAS_GROUP |
| #define HAS_PASSWD |
| |
| #endif /* !MSDOS */ |
| |
| #if defined(HASVOLATILE) || defined(__STDC__) |
| #define VOLATILE volatile |
| #else |
| #define VOLATILE |
| #endif |
| |
| #ifdef IAMSUID |
| # ifndef TAINT |
| # define TAINT |
| # endif |
| #endif |
| |
| #ifndef HAS_VFORK |
| # define vfork fork |
| #endif |
| |
| #ifdef HAS_GETPGRP2 |
| # ifndef HAS_GETPGRP |
| # define HAS_GETPGRP |
| # endif |
| # define getpgrp getpgrp2 |
| #endif |
| |
| #ifdef HAS_SETPGRP2 |
| # ifndef HAS_SETPGRP |
| # define HAS_SETPGRP |
| # endif |
| # define setpgrp setpgrp2 |
| #endif |
| |
| #include <stdio.h> |
| #include <ctype.h> |
| #include <setjmp.h> |
| #ifndef MSDOS |
| #include <sys/param.h> /* if this needs types.h we're still wrong */ |
| #endif |
| #ifdef __STDC__ |
| /* Use all the "standard" definitions */ |
| //#include <stdlib.h> |
| #include <string.h> |
| #endif /* __STDC__ */ |
| |
| #if defined(HAS_MEMCMP) && defined(mips) && BYTEORDER == 0x1234 |
| #undef HAS_MEMCMP |
| #endif |
| |
| #ifdef HAS_MEMCPY |
| |
| # ifndef __STDC__ |
| # ifndef memcpy |
| extern char * memcpy(), *memset(); |
| extern int memcmp(); |
| # endif /* ndef memcpy */ |
| # endif /* ndef __STDC__ */ |
| |
| #define bcopy(s1,s2,l) memcpy(s2,s1,l) |
| #define bzero(s,l) memset(s,0,l) |
| #endif /* HAS_MEMCPY */ |
| |
| #ifndef HAS_BCMP /* prefer bcmp slightly 'cuz it doesn't order */ |
| #define bcmp(s1,s2,l) memcmp(s1,s2,l) |
| #endif |
| |
| #ifndef _TYPES_ /* If types.h defines this it's easy. */ |
| #ifndef major /* Does everyone's types.h define this? */ |
| #include <sys/types.h> |
| #endif |
| #endif |
| |
| #ifdef I_NETINET_IN |
| #include <netinet/in.h> |
| #endif |
| |
| #include <sys/stat.h> |
| |
| #ifdef I_TIME |
| # include <time.h> |
| #endif |
| |
| #ifdef I_SYS_TIME |
| # ifdef SYSTIMEKERNEL |
| # define KERNEL |
| # endif |
| # include <sys/time.h> |
| # ifdef SYSTIMEKERNEL |
| # undef KERNEL |
| # endif |
| #endif |
| |
| #ifndef MSDOS |
| #include <sys/times.h> |
| #endif |
| |
| #if defined(HAS_STRERROR) && (!defined(HAS_MKDIR) || !defined(HAS_RMDIR)) |
| #undef HAS_STRERROR |
| #endif |
| |
| #include <errno.h> |
| #ifndef MSDOS |
| #ifndef errno |
| extern int errno; /* ANSI allows errno to be an lvalue expr */ |
| #endif |
| #endif |
| |
| #ifndef strerror |
| #ifdef HAS_STRERROR |
| char *strerror(); |
| #else |
| extern int sys_nerr; |
| extern char *sys_errlist[]; |
| #define strerror(e) ((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e]) |
| #endif |
| #endif |
| |
| #ifdef I_SYSIOCTL |
| #ifndef _IOCTL_ |
| #include <sys/ioctl.h> |
| #endif |
| #endif |
| |
| #if defined(mc300) || defined(mc500) || defined(mc700) /* MASSCOMP */ |
| #ifdef HAS_SOCKETPAIR |
| #undef HAS_SOCKETPAIR |
| #endif |
| #ifdef HAS_NDBM |
| #undef HAS_NDBM |
| #endif |
| #endif |
| |
| #ifdef HAS_GDBM |
| #ifdef I_GDBM |
| #include <gdbm.h> |
| #endif |
| #define SOME_DBM |
| #ifdef HAS_NDBM |
| #undef HAS_NDBM |
| #endif |
| #ifdef HAS_ODBM |
| #undef HAS_ODBM |
| #endif |
| #else |
| #ifdef HAS_NDBM |
| #include <ndbm.h> |
| #define SOME_DBM |
| #ifdef HAS_ODBM |
| #undef HAS_ODBM |
| #endif |
| #else |
| #ifdef HAS_ODBM |
| #ifdef NULL |
| #undef NULL /* suppress redefinition message */ |
| #endif |
| #include <dbm.h> |
| #ifdef NULL |
| #undef NULL |
| #endif |
| #define NULL 0 /* silly thing is, we don't even use this */ |
| #define SOME_DBM |
| #define dbm_fetch(db,dkey) fetch(dkey) |
| #define dbm_delete(db,dkey) delete(dkey) |
| #define dbm_store(db,dkey,dcontent,flags) store(dkey,dcontent) |
| #define dbm_close(db) dbmclose() |
| #define dbm_firstkey(db) firstkey() |
| #endif /* HAS_ODBM */ |
| #endif /* HAS_NDBM */ |
| #endif /* HAS_GDBM */ |
| #ifdef SOME_DBM |
| EXT char *dbmkey; |
| EXT int dbmlen; |
| #endif |
| |
| #if INTSIZE == 2 |
| #define htoni htons |
| #define ntohi ntohs |
| #else |
| #define htoni htonl |
| #define ntohi ntohl |
| #endif |
| |
| #if defined(I_DIRENT) |
| # include <dirent.h> |
| # define DIRENT dirent |
| #else |
| # ifdef I_SYS_NDIR |
| # include <sys/ndir.h> |
| # define DIRENT direct |
| # else |
| # ifdef I_SYS_DIR |
| # ifdef hp9000s500 |
| # include <ndir.h> /* may be wrong in the future */ |
| # else |
| # include <sys/dir.h> |
| # endif |
| # define DIRENT direct |
| # endif |
| # endif |
| #endif |
| |
| /* |
| * The following gobbledygook brought to you on behalf of __STDC__. |
| * (I could just use #ifndef __STDC__, but this is more bulletproof |
| * in the face of half-implementations.) |
| */ |
| |
| #ifndef S_IFMT |
| # ifdef _S_IFMT |
| # define S_IFMT _S_IFMT |
| # else |
| # define S_IFMT 0170000 |
| # endif |
| #endif |
| |
| #ifndef S_ISDIR |
| # define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR) |
| #endif |
| |
| #ifndef S_ISCHR |
| # define S_ISCHR(m) ((m & S_IFMT) == S_IFCHR) |
| #endif |
| |
| #ifndef S_ISBLK |
| # ifdef S_IFBLK |
| # define S_ISBLK(m) ((m & S_IFMT) == S_IFBLK) |
| # else |
| # define S_ISBLK(m) (0) |
| # endif |
| #endif |
| |
| #ifndef S_ISREG |
| # define S_ISREG(m) ((m & S_IFMT) == S_IFREG) |
| #endif |
| |
| #ifndef S_ISFIFO |
| # ifdef S_IFIFO |
| # define S_ISFIFO(m) ((m & S_IFMT) == S_IFIFO) |
| # else |
| # define S_ISFIFO(m) (0) |
| # endif |
| #endif |
| |
| #ifndef S_ISLNK |
| # ifdef _S_ISLNK |
| # define S_ISLNK(m) _S_ISLNK(m) |
| # else |
| # ifdef _S_IFLNK |
| # define S_ISLNK(m) ((m & S_IFMT) == _S_IFLNK) |
| # else |
| # ifdef S_IFLNK |
| # define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK) |
| # else |
| # define S_ISLNK(m) (0) |
| # endif |
| # endif |
| # endif |
| #endif |
| |
| #ifndef S_ISSOCK |
| # ifdef _S_ISSOCK |
| # define S_ISSOCK(m) _S_ISSOCK(m) |
| # else |
| # ifdef _S_IFSOCK |
| # define S_ISSOCK(m) ((m & S_IFMT) == _S_IFSOCK) |
| # else |
| # ifdef S_IFSOCK |
| # define S_ISSOCK(m) ((m & S_IFMT) == S_IFSOCK) |
| # else |
| # define S_ISSOCK(m) (0) |
| # endif |
| # endif |
| # endif |
| #endif |
| |
| #ifndef S_IRUSR |
| # ifdef S_IREAD |
| # define S_IRUSR S_IREAD |
| # define S_IWUSR S_IWRITE |
| # define S_IXUSR S_IEXEC |
| # else |
| # define S_IRUSR 0400 |
| # define S_IWUSR 0200 |
| # define S_IXUSR 0100 |
| # endif |
| # define S_IRGRP (S_IRUSR>>3) |
| # define S_IWGRP (S_IWUSR>>3) |
| # define S_IXGRP (S_IXUSR>>3) |
| # define S_IROTH (S_IRUSR>>6) |
| # define S_IWOTH (S_IWUSR>>6) |
| # define S_IXOTH (S_IXUSR>>6) |
| #endif |
| |
| #ifndef S_ISUID |
| # define S_ISUID 04000 |
| #endif |
| |
| #ifndef S_ISGID |
| # define S_ISGID 02000 |
| #endif |
| |
| typedef unsigned int STRLEN; |
| |
| typedef struct arg ARG; |
| typedef struct cmd CMD; |
| typedef struct formcmd FCMD; |
| typedef struct scanpat SPAT; |
| typedef struct stio STIO; |
| typedef struct sub SUBR; |
| typedef struct string STR; |
| typedef struct atbl ARRAY; |
| typedef struct htbl HASH; |
| typedef struct regexp REGEXP; |
| typedef struct stabptrs STBP; |
| typedef struct stab STAB; |
| typedef struct callsave CSV; |
| |
| #include "handy.h" |
| #include "regexp.h" |
| #include "str.h" |
| #include "util.h" |
| #include "form.h" |
| #include "stab.h" |
| #include "spat.h" |
| #include "arg.h" |
| #include "cmd.h" |
| #include "array.h" |
| #include "hash.h" |
| |
| #if defined(iAPX286) || defined(M_I286) || defined(I80286) |
| # define I286 |
| #endif |
| |
| #ifndef __STDC__ |
| #ifdef CHARSPRINTF |
| char *sprintf(); |
| #else |
| int sprintf(); |
| #endif |
| #endif |
| |
| EXT char *Yes INIT("1"); |
| EXT char *No INIT(""); |
| |
| /* "gimme" values */ |
| |
| /* Note: cmd.c assumes that it can use && to produce one of these values! */ |
| #define G_SCALAR 0 |
| #define G_ARRAY 1 |
| |
| #ifdef CRIPPLED_CC |
| int str_true(); |
| #else /* !CRIPPLED_CC */ |
| #define str_true(str) (Str = (str), \ |
| (Str->str_pok ? \ |
| ((*Str->str_ptr > '0' || \ |
| Str->str_cur > 1 || \ |
| (Str->str_cur && *Str->str_ptr != '0')) ? 1 : 0) \ |
| : \ |
| (Str->str_nok ? (Str->str_u.str_nval != 0.0) : 0 ) )) |
| #endif /* CRIPPLED_CC */ |
| |
| #ifdef DEBUGGING |
| #define str_peek(str) (Str = (str), \ |
| (Str->str_pok ? \ |
| Str->str_ptr : \ |
| (Str->str_nok ? \ |
| (sprintf(tokenbuf,"num(%g)",Str->str_u.str_nval), \ |
| (char*)tokenbuf) : \ |
| "" ))) |
| #endif |
| |
| #ifdef CRIPPLED_CC |
| char *str_get(); |
| #else |
| #ifdef TAINT |
| #define str_get(str) (Str = (str), tainted |= Str->str_tainted, \ |
| (Str->str_pok ? Str->str_ptr : str_2ptr(Str))) |
| #else |
| #define str_get(str) (Str = (str), (Str->str_pok ? Str->str_ptr : str_2ptr(Str))) |
| #endif /* TAINT */ |
| #endif /* CRIPPLED_CC */ |
| |
| #ifdef CRIPPLED_CC |
| double str_gnum(); |
| #else /* !CRIPPLED_CC */ |
| #ifdef TAINT |
| #define str_gnum(str) (Str = (str), tainted |= Str->str_tainted, \ |
| (Str->str_nok ? Str->str_u.str_nval : str_2num(Str))) |
| #else /* !TAINT */ |
| #define str_gnum(str) (Str = (str), (Str->str_nok ? Str->str_u.str_nval : str_2num(Str))) |
| #endif /* TAINT*/ |
| #endif /* CRIPPLED_CC */ |
| EXT STR *Str; |
| |
| #define GROWSTR(pp,lp,len) if (*(lp) < (len)) growstr(pp,lp,len) |
| |
| #ifndef MSDOS |
| #define STR_GROW(str,len) if ((str)->str_len < (len)) str_grow(str,len) |
| #define Str_Grow str_grow |
| #else |
| /* extra parentheses intentionally NOT placed around "len"! */ |
| #define STR_GROW(str,len) if ((str)->str_len < (unsigned long)len) \ |
| str_grow(str,(unsigned long)len) |
| #define Str_Grow(str,len) str_grow(str,(unsigned long)(len)) |
| #endif /* MSDOS */ |
| |
| #ifndef BYTEORDER |
| #define BYTEORDER 0x1234 |
| #endif |
| |
| #if defined(htonl) && !defined(HAS_HTONL) |
| #define HAS_HTONL |
| #endif |
| #if defined(htons) && !defined(HAS_HTONS) |
| #define HAS_HTONS |
| #endif |
| #if defined(ntohl) && !defined(HAS_NTOHL) |
| #define HAS_NTOHL |
| #endif |
| #if defined(ntohs) && !defined(HAS_NTOHS) |
| #define HAS_NTOHS |
| #endif |
| #ifndef HAS_HTONL |
| #if (BYTEORDER & 0xffff) != 0x4321 |
| #define HAS_HTONS |
| #define HAS_HTONL |
| #define HAS_NTOHS |
| #define HAS_NTOHL |
| #define MYSWAP |
| #define htons my_swap |
| #define htonl my_htonl |
| #define ntohs my_swap |
| #define ntohl my_ntohl |
| #endif |
| #else |
| #if (BYTEORDER & 0xffff) == 0x4321 |
| #undef HAS_HTONS |
| #undef HAS_HTONL |
| #undef HAS_NTOHS |
| #undef HAS_NTOHL |
| #endif |
| #endif |
| |
| #ifdef CASTNEGFLOAT |
| #define U_S(what) ((unsigned short)(what)) |
| #define U_I(what) ((unsigned int)(what)) |
| #define U_L(what) ((unsigned long)(what)) |
| #else |
| unsigned long castulong(); |
| #define U_S(what) ((unsigned int)castulong(what)) |
| #define U_I(what) ((unsigned int)castulong(what)) |
| #define U_L(what) (castulong(what)) |
| #endif |
| |
| CMD *add_label(); |
| CMD *block_head(); |
| CMD *append_line(); |
| CMD *make_acmd(); |
| CMD *make_ccmd(); |
| CMD *make_icmd(); |
| CMD *invert(); |
| CMD *addcond(); |
| CMD *addloop(); |
| CMD *wopt(); |
| CMD *over(); |
| |
| STAB *stabent(); |
| STAB *genstab(); |
| |
| ARG *stab2arg(); |
| ARG *op_new(); |
| ARG *make_op(); |
| ARG *make_match(); |
| ARG *make_split(); |
| ARG *rcatmaybe(); |
| ARG *listish(); |
| ARG *maybelistish(); |
| ARG *localize(); |
| ARG *fixeval(); |
| ARG *jmaybe(); |
| ARG *l(); |
| ARG *fixl(); |
| ARG *mod_match(); |
| ARG *make_list(); |
| ARG *cmd_to_arg(); |
| ARG *addflags(); |
| ARG *hide_ary(); |
| ARG *cval_to_arg(); |
| |
| STR *str_new(); |
| STR *stab_str(); |
| |
| int do_each(); |
| int do_subr(); |
| int do_match(); |
| int do_unpack(); |
| int eval(); /* this evaluates expressions */ |
| int do_eval(); /* this evaluates eval operator */ |
| int do_assign(); |
| |
| SUBR *make_sub(); |
| |
| FCMD *load_format(); |
| |
| char *scanpat(); |
| char *scansubst(); |
| char *scantrans(); |
| char *scanstr(); |
| char *scanident(); |
| char *str_append_till(); |
| char *str_gets(); |
| char *str_grow(); |
| |
| bool do_open(); |
| bool do_close(); |
| bool do_print(); |
| bool do_aprint(); |
| bool do_exec(); |
| bool do_aexec(); |
| |
| int do_subst(); |
| int cando(); |
| int ingroup(); |
| |
| void str_replace(); |
| void str_inc(); |
| void str_dec(); |
| void str_free(); |
| void stab_clear(); |
| void do_join(); |
| void do_sprintf(); |
| void do_accept(); |
| void do_pipe(); |
| void do_vecset(); |
| void do_unshift(); |
| void do_execfree(); |
| void magicalize(); |
| void magicname(); |
| void savelist(); |
| void saveitem(); |
| void saveint(); |
| void savelong(); |
| void savesptr(); |
| void savehptr(); |
| void restorelist(); |
| void repeatcpy(); |
| HASH *savehash(); |
| ARRAY *saveary(); |
| |
| EXT char **origargv; |
| EXT int origargc; |
| EXT char **origenviron; |
| extern char **environ; |
| |
| EXT line_t subline INIT(0); |
| EXT STR *subname INIT(Nullstr); |
| EXT int arybase INIT(0); |
| |
| struct outrec { |
| long o_lines; |
| char *o_str; |
| int o_len; |
| }; |
| |
| EXT struct outrec outrec; |
| EXT struct outrec toprec; |
| |
| EXT STAB *stdinstab INIT(Nullstab); |
| EXT STAB *last_in_stab INIT(Nullstab); |
| EXT STAB *defstab INIT(Nullstab); |
| EXT STAB *argvstab INIT(Nullstab); |
| EXT STAB *envstab INIT(Nullstab); |
| EXT STAB *sigstab INIT(Nullstab); |
| EXT STAB *defoutstab INIT(Nullstab); |
| EXT STAB *curoutstab INIT(Nullstab); |
| EXT STAB *argvoutstab INIT(Nullstab); |
| EXT STAB *incstab INIT(Nullstab); |
| EXT STAB *leftstab INIT(Nullstab); |
| EXT STAB *amperstab INIT(Nullstab); |
| EXT STAB *rightstab INIT(Nullstab); |
| EXT STAB *DBstab INIT(Nullstab); |
| EXT STAB *DBline INIT(Nullstab); |
| EXT STAB *DBsub INIT(Nullstab); |
| |
| EXT HASH *defstash; /* main symbol table */ |
| EXT HASH *curstash; /* symbol table for current package */ |
| EXT HASH *debstash; /* symbol table for perldb package */ |
| |
| EXT STR *curstname; /* name of current package */ |
| |
| EXT STR *freestrroot INIT(Nullstr); |
| EXT STR *lastretstr INIT(Nullstr); |
| EXT STR *DBsingle INIT(Nullstr); |
| EXT STR *DBtrace INIT(Nullstr); |
| EXT STR *DBsignal INIT(Nullstr); |
| |
| EXT int lastspbase; |
| EXT int lastsize; |
| |
| EXT char *hexdigit INIT("0123456789abcdef0123456789ABCDEF"); |
| EXT char *origfilename; |
| EXT FILE * VOLATILE rsfp; |
| EXT char buf[1024]; |
| EXT char *bufptr; |
| EXT char *oldbufptr; |
| EXT char *oldoldbufptr; |
| EXT char *bufend; |
| |
| EXT STR *linestr INIT(Nullstr); |
| |
| EXT char *rs INIT("\n"); |
| EXT int rschar INIT('\n'); /* final char of rs, or 0777 if none */ |
| EXT int rslen INIT(1); |
| EXT char *ofs INIT(Nullch); |
| EXT int ofslen INIT(0); |
| EXT char *ors INIT(Nullch); |
| EXT int orslen INIT(0); |
| EXT char *ofmt INIT(Nullch); |
| EXT char *inplace INIT(Nullch); |
| EXT char *nointrp INIT(""); |
| |
| EXT bool preprocess INIT(FALSE); |
| EXT bool minus_n INIT(FALSE); |
| EXT bool minus_p INIT(FALSE); |
| EXT bool minus_l INIT(FALSE); |
| EXT bool minus_a INIT(FALSE); |
| EXT bool doswitches INIT(FALSE); |
| EXT bool dowarn INIT(FALSE); |
| EXT bool doextract INIT(FALSE); |
| EXT bool allstabs INIT(FALSE); /* init all customary symbols in symbol table?*/ |
| EXT bool sawampersand INIT(FALSE); /* must save all match strings */ |
| EXT bool sawstudy INIT(FALSE); /* do fbminstr on all strings */ |
| EXT bool sawi INIT(FALSE); /* study must assume case insensitive */ |
| EXT bool sawvec INIT(FALSE); |
| EXT bool localizing INIT(FALSE); /* are we processing a local() list? */ |
| |
| #ifdef CSH |
| char *cshname INIT(CSH); |
| int cshlen INIT(0); |
| #endif /* CSH */ |
| |
| #ifdef TAINT |
| EXT bool tainted INIT(FALSE); /* using variables controlled by $< */ |
| #endif |
| |
| #ifndef MSDOS |
| #define TMPPATH "/tmp/perl-eXXXXXX" |
| #else |
| #define TMPPATH "plXXXXXX" |
| #endif /* MSDOS */ |
| EXT char *e_tmpname; |
| EXT FILE *e_fp INIT(Nullfp); |
| |
| EXT char tokenbuf[256]; |
| EXT int expectterm INIT(TRUE); /* how to interpret ambiguous tokens */ |
| EXT VOLATILE int in_eval INIT(FALSE); /* trap fatal errors? */ |
| EXT int multiline INIT(0); /* $*--do strings hold >1 line? */ |
| EXT int forkprocess; /* so do_open |- can return proc# */ |
| EXT int do_undump INIT(0); /* -u or dump seen? */ |
| EXT int error_count INIT(0); /* how many errors so far, max 10 */ |
| EXT int multi_start INIT(0); /* 1st line of multi-line string */ |
| EXT int multi_end INIT(0); /* last line of multi-line string */ |
| EXT int multi_open INIT(0); /* delimiter of said string */ |
| EXT int multi_close INIT(0); /* delimiter of said string */ |
| |
| FILE *popen(); |
| /* char *str_get(); */ |
| STR *interp(); |
| void free_arg(); |
| STIO *stio_new(); |
| |
| EXT struct stat statbuf; |
| EXT struct stat statcache; |
| STAB *statstab INIT(Nullstab); |
| STR *statname; |
| #ifndef MSDOS |
| EXT struct tms timesbuf; |
| #endif |
| EXT int uid; |
| EXT int euid; |
| EXT int gid; |
| EXT int egid; |
| UIDTYPE getuid(); |
| UIDTYPE geteuid(); |
| GIDTYPE getgid(); |
| GIDTYPE getegid(); |
| EXT int unsafe; |
| |
| #ifdef DEBUGGING |
| EXT VOLATILE int debug INIT(0); |
| EXT int dlevel INIT(0); |
| EXT int dlmax INIT(128); |
| EXT char *debname; |
| EXT char *debdelim; |
| #define YYDEBUG 1 |
| #endif |
| EXT int perldb INIT(0); |
| #define YYMAXDEPTH 300 |
| |
| EXT line_t cmdline INIT(NOLINE); |
| |
| EXT STR str_undef; |
| EXT STR str_no; |
| EXT STR str_yes; |
| |
| /* runtime control stuff */ |
| |
| EXT struct loop { |
| char *loop_label; /* what the loop was called, if anything */ |
| int loop_sp; /* stack pointer to copy stuff down to */ |
| jmp_buf loop_env; |
| } *loop_stack; |
| |
| EXT int loop_ptr INIT(-1); |
| EXT int loop_max INIT(128); |
| |
| EXT jmp_buf top_env; |
| |
| EXT char * VOLATILE goto_targ INIT(Nullch); /* cmd_exec gets strange when set */ |
| |
| struct ufuncs { |
| int (*uf_val)(); |
| int (*uf_set)(); |
| int uf_index; |
| }; |
| |
| EXT ARRAY *stack; /* THE STACK */ |
| |
| EXT ARRAY * VOLATILE savestack; /* to save non-local values on */ |
| |
| EXT ARRAY *tosave; /* strings to save on recursive subroutine */ |
| |
| EXT ARRAY *lineary; /* lines of script for debugger */ |
| EXT ARRAY *dbargs; /* args to call listed by caller function */ |
| |
| EXT ARRAY *fdpid; /* keep fd-to-pid mappings for mypopen */ |
| EXT HASH *pidstatus; /* keep pid-to-status mappings for waitpid */ |
| |
| EXT int *di; /* for tmp use in debuggers */ |
| EXT char *dc; |
| EXT short *ds; |
| |
| /* Fix these up for __STDC__ */ |
| EXT long basetime INIT(0); |
| char *mktemp(); |
| #ifndef __STDC__ |
| /* All of these are in stdlib.h or time.h for ANSI C */ |
| double atof(); |
| long time(); |
| struct tm *gmtime(), *localtime(); |
| char *index(), *rindex(); |
| char *strcpy(), *strcat(); |
| #endif /* ! __STDC__ */ |
| |
| #ifdef EUNICE |
| #define UNLINK unlnk |
| int unlnk(); |
| #else |
| #define UNLINK unlink |
| #endif |
| |
| #ifndef HAS_SETREUID |
| #ifdef HAS_SETRESUID |
| #define setreuid(r,e) setresuid(r,e,-1) |
| #define HAS_SETREUID |
| #endif |
| #endif |
| #ifndef HAS_SETREGID |
| #ifdef HAS_SETRESGID |
| #define setregid(r,e) setresgid(r,e,-1) |
| #define HAS_SETREGID |
| #endif |
| #endif |
| /* work around botch in SunOS 4.0.1 and 4.0.2 */ |
| #ifndef fputs |
| #define fputs(str,fp) fprintf(fp,"%s",str) |
| #endif |