diff options
author | Larry Wall <lwall@netlabs.com> | 1993-02-04 22:50:33 +0000 |
---|---|---|
committer | Larry Wall <lwall@netlabs.com> | 1993-02-04 22:50:33 +0000 |
commit | e334a159a5616cab575044bafaf68f75b7bb3a16 (patch) | |
tree | 47369293eb7417e5322f7fe46e1a1cfc0d9c69ef /perl.h.orig | |
parent | 514dae0dba791ec01681adb3b3946a7646e146b3 (diff) | |
download | perl-e334a159a5616cab575044bafaf68f75b7bb3a16.tar.gz |
perl 4.0 patch 36: (combined patch)perl-4.0.36
Since Ed Barton sent me a patch for the malignent form of "Malformed
cmd links", I finally broke down and made a patch for the various
other little things that have been accumulating on version 4.
Diffstat (limited to 'perl.h.orig')
-rw-r--r-- | perl.h.orig | 1057 |
1 files changed, 1057 insertions, 0 deletions
diff --git a/perl.h.orig b/perl.h.orig new file mode 100644 index 0000000000..5d9f002052 --- /dev/null +++ b/perl.h.orig @@ -0,0 +1,1057 @@ +/* $RCSfile: perl.h,v $$Revision: 4.0.1.6 $$Date: 92/06/08 14:55:10 $ + * + * Copyright (c) 1991, Larry Wall + * + * You may distribute under the terms of either the GNU General Public + * License or the Artistic License, as specified in the README file. + * + * $Log: perl.h,v $ + * Revision 4.0.1.6 92/06/08 14:55:10 lwall + * patch20: added Atari ST portability + * patch20: bcopy() and memcpy() now tested for overlap safety + * patch20: Perl now distinguishes overlapped copies from non-overlapped + * patch20: removed implicit int declarations on functions + * + * Revision 4.0.1.5 91/11/11 16:41:07 lwall + * patch19: uts wrongly defines S_ISDIR() et al + * patch19: too many preprocessors can't expand a macro right in #if + * patch19: added little-endian pack/unpack options + * + * Revision 4.0.1.4 91/11/05 18:06:10 lwall + * patch11: various portability fixes + * patch11: added support for dbz + * patch11: added some support for 64-bit integers + * patch11: hex() didn't understand leading 0x + * + * Revision 4.0.1.3 91/06/10 01:25:10 lwall + * patch10: certain pattern optimizations were botched + * + * Revision 4.0.1.2 91/06/07 11:28:33 lwall + * patch4: new copyright notice + * patch4: made some allowances for "semi-standard" C + * patch4: many, many itty-bitty portability fixes + * + * 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 MYMALLOC +# ifdef HIDEMYMALLOC +# define malloc Mymalloc +# define realloc Myremalloc +# define free Myfree +# endif +# define safemalloc malloc +# define saferealloc realloc +# define safefree free +#endif + +/* work around some libPW problems */ +#define fatal Myfatal +#ifdef DOINIT +char Error[1]; +#endif + +/* define this once if either system, instead of cluttering up the src */ +#if defined(MSDOS) || defined(atarist) +#define DOSISH 1 +#endif + +#ifdef DOSISH +/* 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(__STDC__) || defined(_AIX) || defined(__stdc__) +# define STANDARD_C 1 +#endif + +#if defined(HASVOLATILE) || defined(STANDARD_C) +#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 +#ifdef PARAM_NEEDS_TYPES +#include <sys/types.h> +#endif +#include <sys/param.h> +#endif +#ifdef STANDARD_C +/* Use all the "standard" definitions */ +#include <stdlib.h> +#include <string.h> +#define MEM_SIZE size_t +#else +typedef unsigned int MEM_SIZE; +#endif /* STANDARD_C */ + +#if defined(HAS_MEMCMP) && defined(mips) && defined(ultrix) +#undef HAS_MEMCMP +#endif + +#ifdef HAS_MEMCPY +# ifndef STANDARD_C +# ifndef memcpy + extern char * memcpy(); +# endif +# endif +#else +# ifndef memcpy +# ifdef HAS_BCOPY +# define memcpy(d,s,l) bcopy(s,d,l) +# else +# define memcpy(d,s,l) my_bcopy(s,d,l) +# endif +# endif +#endif /* HAS_MEMCPY */ + +#ifdef HAS_MEMSET +# ifndef STANDARD_C +# ifndef memset + extern char *memset(); +# endif +# endif +# define memzero(d,l) memset(d,0,l) +#else +# ifndef memzero +# ifdef HAS_BZERO +# define memzero(d,l) bzero(d,l) +# else +# define memzero(d,l) my_bzero(d,l) +# endif +# endif +#endif /* HAS_MEMSET */ + +#ifdef HAS_MEMCMP +# ifndef STANDARD_C +# ifndef memcmp + extern int memcmp(); +# endif +# endif +#else +# ifndef memcmp +# define memcmp(s1,s2,l) my_memcmp(s1,s2,l) +# endif +#endif /* HAS_MEMCMP */ + +/* we prefer bcmp slightly for comparisons that don't care about ordering */ +#ifndef HAS_BCMP +# ifndef bcmp +# define bcmp(s1,s2,l) memcmp(s1,s2,l) +# endif +#endif /* HAS_BCMP */ + +#ifndef HAS_MEMMOVE +#if defined(HAS_BCOPY) && defined(SAFE_BCOPY) +#define memmove(d,s,l) bcopy(s,d,l) +#else +#if defined(HAS_MEMCPY) && defined(SAFE_MEMCPY) +#define memmove(d,s,l) memcpy(d,s,l) +#else +#define memmove(d,s,l) my_bcopy(s,d,l) +#endif +#endif +#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> +#if defined(uts) || defined(UTekV) +#undef S_ISDIR +#undef S_ISCHR +#undef S_ISBLK +#undef S_ISREG +#undef S_ISFIFO +#undef S_ISLNK +#define S_ISDIR(P) (((P)&S_IFMT)==S_IFDIR) +#define S_ISCHR(P) (((P)&S_IFMT)==S_IFCHR) +#define S_ISBLK(P) (((P)&S_IFMT)==S_IFBLK) +#define S_ISREG(P) (((P)&S_IFMT)==S_IFREG) +#define S_ISFIFO(P) (((P)&S_IFMT)==S_IFIFO) +#ifdef S_IFLNK +#define S_ISLNK(P) (((P)&S_IFMT)==S_IFLNK) +#endif +#endif + +#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) || defined(mc6000) +#ifdef HAS_SOCKETPAIR +#undef HAS_SOCKETPAIR +#endif +#ifdef HAS_NDBM +#undef HAS_NDBM +#endif +#endif + +#ifdef WANT_DBZ +#include <dbz.h> +#define SOME_DBM +#define dbm_fetch(db,dkey) fetch(dkey) +#define dbm_delete(db,dkey) fatal("dbz doesn't implement delete") +#define dbm_store(db,dkey,dcontent,flags) store(dkey,dcontent) +#define dbm_close(db) dbmclose() +#define dbm_firstkey(db) (fatal("dbz doesn't implement traversal"),fetch()) +#define nextkey() (fatal("dbz doesn't implement traversal"),fetch()) +#define dbm_nextkey(db) (fatal("dbz doesn't implement traversal"),fetch()) +#ifdef HAS_NDBM +#undef HAS_NDBM +#endif +#ifndef HAS_ODBM +#define HAS_ODBM +#endif +#else +#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 */ +#endif /* WANT_DBZ */ +#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 + +#ifdef FPUTS_BOTCH +/* work around botch in SunOS 4.0.1 and 4.0.2 */ +# ifndef fputs +# define fputs(str,fp) fprintf(fp,"%s",str) +# 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 + +#ifdef f_next +#undef f_next +#endif + +#if defined(cray) || defined(gould) || defined(i860) +# define SLOPPYDIVIDE +#endif + +#if defined(cray) || defined(convex) || defined (uts) || BYTEORDER > 0xffff +# define QUAD +#endif + +#ifdef QUAD +# ifdef cray +# define quad int +# else +# if defined(convex) || defined (uts) +# define quad long long +# else +# define quad long +# endif +# endif +#endif + +typedef MEM_SIZE 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 STANDARD_C +#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 DOSISH +#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 /* DOSISH */ + +#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 + +/* + * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'. + * -DWS + */ +#if BYTEORDER != 0x1234 +# define HAS_VTOHL +# define HAS_VTOHS +# define HAS_HTOVL +# define HAS_HTOVS +# if BYTEORDER == 0x4321 +# define vtohl(x) ((((x)&0xFF)<<24) \ + +(((x)>>24)&0xFF) \ + +(((x)&0x0000FF00)<<8) \ + +(((x)&0x00FF0000)>>8) ) +# define vtohs(x) ((((x)&0xFF)<<8) + (((x)>>8)&0xFF)) +# define htovl(x) vtohl(x) +# define htovs(x) vtohs(x) +# endif + /* otherwise default to functions in util.c */ +#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 apply(); +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(); +int whichsig(); +int userinit(); +#ifdef CRYPTSCRIPT +void cryptswitch(); +#endif + +void str_replace(); +void str_inc(); +void str_dec(); +void str_free(); +void cmd_free(); +void arg_free(); +void spat_free(); +void regfree(); +void stab_clear(); +void do_chop(); +void do_vop(); +void do_write(); +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(); +void make_form(); +void dehoist(); +void format(); +void my_unexec(); +void fatal(); +void warn(); +#ifdef DEBUGGING +void dump_all(); +void dump_cmd(); +void dump_arg(); +void dump_flags(); +void dump_stab(); +void dump_spat(); +#endif +#ifdef MSTATS +void mstats(); +#endif + +HASH *savehash(); +ARRAY *saveary(); + +EXT char **origargv; +EXT int origargc; +EXT char **origenviron; +extern char **environ; + +EXT long 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 STR *formfeed INIT(Nullstr); + +EXT int lastspbase; +EXT int lastsize; + +EXT char *hexdigit INIT("0123456789abcdef0123456789ABCDEFx"); +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 bool rspara INIT(FALSE); +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? */ + +#ifndef MAXSYSFD +# define MAXSYSFD 2 +#endif +EXT int maxsysfd INIT(MAXSYSFD); /* top fd to pass to subprocesses */ + +#ifdef CSH +EXT char *cshname INIT(CSH); +EXT int cshlen INIT(0); +#endif /* CSH */ + +#ifdef TAINT +EXT bool tainted INIT(FALSE); /* using variables controlled by $< */ +EXT bool taintanyway INIT(FALSE); /* force taint checks when !set?id */ +#endif + +EXT bool nomemok INIT(FALSE); /* let malloc context handle nomem */ + +#ifndef DOSISH +#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(); +void hoistmust(); +void scanconst(); + +EXT struct stat statbuf; +EXT struct stat statcache; +EXT STAB *statstab INIT(Nullstab); +EXT 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 time_t basetime INIT(0); +char *mktemp(); +#ifndef STANDARD_C +/* 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 /* ! STANDARD_C */ + +#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 + +#define SCAN_DEF 0 +#define SCAN_TR 1 +#define SCAN_REPL 2 |