/* $RCSfile: perl.h,v $$Revision: 4.0.1.1 $$Date: 91/04/11 17:49:51 $ * * 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: perl.h,v $ * 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 #include #include #ifndef MSDOS #include /* if this needs types.h we're still wrong */ #endif #ifdef __STDC__ /* Use all the "standard" definitions */ #include #include #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 #endif #endif #ifdef I_NETINET_IN #include #endif #include #ifdef I_TIME # include #endif #ifdef I_SYS_TIME # ifdef SYSTIMEKERNEL # define KERNEL # endif # include # ifdef SYSTIMEKERNEL # undef KERNEL # endif #endif #ifndef MSDOS #include #endif #if defined(HAS_STRERROR) && (!defined(HAS_MKDIR) || !defined(HAS_RMDIR)) #undef HAS_STRERROR #endif #include #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 #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 #endif #define SOME_DBM #ifdef HAS_NDBM #undef HAS_NDBM #endif #ifdef HAS_ODBM #undef HAS_ODBM #endif #else #ifdef HAS_NDBM #include #define SOME_DBM #ifdef HAS_ODBM #undef HAS_ODBM #endif #else #ifdef HAS_ODBM #ifdef NULL #undef NULL /* suppress redefinition message */ #endif #include #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 # define DIRENT dirent #else # ifdef I_SYS_NDIR # include # define DIRENT direct # else # ifdef I_SYS_DIR # ifdef hp9000s500 # include /* may be wrong in the future */ # else # include # 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