This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: glob in Safe compartment allows shell access
[perl5.git] / perl.h
CommitLineData
a0d0e21e 1/* perl.h
a687059c 2 *
a0d0e21e 3 * Copyright (c) 1987-1994, Larry Wall
a687059c 4 *
352d5a3a
LW
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
8d063cd8 7 *
8d063cd8 8 */
85e6fe83
LW
9#ifndef H_PERL
10#define H_PERL 1
a0d0e21e 11#define OVERLOAD
8d063cd8 12
760ac839
LW
13#ifdef PERL_FOR_X2P
14/*
15 * This file is being used for x2p stuff.
16 * Above symbol is defined via -D in 'x2p/Makefile.SH'
17 * Decouple x2p stuff from some of perls more extreme eccentricities.
18 */
19#undef MULTIPLICITY
20#undef EMBED
21#undef USE_STDIO
22#define USE_STDIO
23#endif /* PERL_FOR_X2P */
24
728e2803
PP
25/*
26 * STMT_START { statements; } STMT_END;
27 * can be used as a single statement, as in
28 * if (x) STMT_START { ... } STMT_END; else ...
29 *
30 * Trying to select a version that gives no warnings...
31 */
32#if !(defined(STMT_START) && defined(STMT_END))
33# if defined(__GNUC__) && !defined(__STRICT_ANSI__)
34# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */
35# define STMT_END )
36# else
37 /* Now which other defined()s do we need here ??? */
38# if (VOIDFLAGS) && (defined(sun) || defined(__sun__))
39# define STMT_START if (1)
40# define STMT_END else (void)0
41# else
42# define STMT_START do
43# define STMT_END while (0)
44# endif
45# endif
46#endif
47
79072805
LW
48#include "embed.h"
49
85e6fe83 50#define VOIDUSED 1
ac58e20f 51#include "config.h"
79072805
LW
52
53#ifndef BYTEORDER
54# define BYTEORDER 0x1234
55#endif
56
57/* Overall memory policy? */
58#ifndef CONSERVATIVE
59# define LIBERAL 1
60#endif
61
62/*
63 * The following contortions are brought to you on behalf of all the
64 * standards, semi-standards, de facto standards, not-so-de-facto standards
65 * of the world, as well as all the other botches anyone ever thought of.
66 * The basic theory is that if we work hard enough here, the rest of the
67 * code can be a lot prettier. Well, so much for theory. Sorry, Henry...
68 */
ac58e20f 69
ee0007ab
LW
70/* define this once if either system, instead of cluttering up the src */
71#if defined(MSDOS) || defined(atarist)
72#define DOSISH 1
73#endif
74
a0d0e21e 75#if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus)
352d5a3a
LW
76# define STANDARD_C 1
77#endif
78
79#if defined(HASVOLATILE) || defined(STANDARD_C)
79072805
LW
80# ifdef __cplusplus
81# define VOL // to temporarily suppress warnings
82# else
83# define VOL volatile
84# endif
663a0e37 85#else
79072805 86# define VOL
663a0e37
LW
87#endif
88
463ee0b2
LW
89#define TAINT_IF(c) (tainted |= (c))
90#define TAINT_NOT (tainted = 0)
91#define TAINT_PROPER(s) if (tainting) taint_proper(no_security, s)
92#define TAINT_ENV() if (tainting) taint_env()
a687059c 93
f82b3d41
PP
94#ifdef USE_BSDPGRP
95# ifdef HAS_GETPGRP
96# define BSD_GETPGRP(pid) getpgrp((pid))
663a0e37 97# endif
f82b3d41
PP
98# ifdef HAS_SETPGRP
99# define BSD_SETPGRP(pid, pgrp) setpgrp((pid), (pgrp))
c07a80fd
PP
100# endif
101#else
f82b3d41
PP
102# ifdef HAS_GETPGRP2
103# define BSD_GETPGRP(pid) getpgrp2((pid))
104# ifndef HAS_GETPGRP
105# define HAS_GETPGRP
106# endif
107# endif
108# ifdef HAS_SETPGRP2
109# define BSD_SETPGRP(pid, pgrp) setpgrp2((pid), (pgrp))
110# ifndef HAS_SETPGRP
111# define HAS_SETPGRP
112# endif
c07a80fd 113# endif
663a0e37
LW
114#endif
115
760ac839
LW
116#ifndef _TYPES_ /* If types.h defines this it's easy. */
117# ifndef major /* Does everyone's types.h define this? */
118# include <sys/types.h>
119# endif
120#endif
121
122#ifdef __cplusplus
123# ifndef I_STDARG
124# define I_STDARG 1
125# endif
126#endif
127
128#ifdef I_STDARG
129# include <stdarg.h>
130#else
131# ifdef I_VARARGS
132# include <varargs.h>
133# endif
134#endif
135
136#include "perlio.h"
0c30d9ec 137
4633a7c4 138#ifdef USE_NEXT_CTYPE
0c30d9ec
PP
139
140#if NX_CURRENT_COMPILER_RELEASE >= 400
141#include <objc/NXCType.h>
142#else /* NX_CURRENT_COMPILER_RELEASE < 400 */
a0d0e21e 143#include <appkit/NXCType.h>
0c30d9ec
PP
144#endif /* NX_CURRENT_COMPILER_RELEASE >= 400 */
145
146#else /* !USE_NEXT_CTYPE */
fe14fcc3 147#include <ctype.h>
0c30d9ec 148#endif /* USE_NEXT_CTYPE */
a0d0e21e 149
4633a7c4
LW
150#ifdef I_LOCALE
151#include <locale.h>
152#endif
153
a0d0e21e
LW
154#ifdef METHOD /* Defined by OSF/1 v3.0 by ctype.h */
155#undef METHOD
156#endif
157
fe14fcc3 158#include <setjmp.h>
79072805 159
a0d0e21e 160#ifdef I_SYS_PARAM
79072805
LW
161# ifdef PARAM_NEEDS_TYPES
162# include <sys/types.h>
163# endif
164# include <sys/param.h>
352d5a3a 165#endif
79072805
LW
166
167
168/* Use all the "standard" definitions? */
a0d0e21e 169#if defined(STANDARD_C) && defined(I_STDLIB)
79072805 170# include <stdlib.h>
352d5a3a 171#endif /* STANDARD_C */
03a14243 172
4633a7c4
LW
173/* Maybe this comes after <stdlib.h> so we don't try to change
174 the standard library prototypes?. We'll use our own in
175 proto.h instead. I guess. The patch had no explanation.
176*/
177#ifdef MYMALLOC
760ac839
LW
178# ifdef HIDEMYMALLOC
179# define malloc Perl_malloc
180# define realloc Perl_realloc
181# define free Perl_free
182# define calloc Perl_calloc
4633a7c4
LW
183# endif
184# define safemalloc malloc
185# define saferealloc realloc
186# define safefree free
0c30d9ec 187# define safecalloc calloc
4633a7c4
LW
188#endif
189
a0d0e21e
LW
190#define MEM_SIZE Size_t
191
192#if defined(I_STRING) || defined(__cplusplus)
193# include <string.h>
194#else
195# include <strings.h>
196#endif
197
198#if !defined(HAS_STRCHR) && defined(HAS_INDEX) && !defined(strchr)
199#define strchr index
200#define strrchr rindex
201#endif
202
203#if defined(mips) && defined(ultrix) && !defined(__STDC__)
79072805 204# undef HAS_MEMCMP
663a0e37 205#endif
fe14fcc3 206
16d20bd9
AD
207#ifdef I_MEMORY
208# include <memory.h>
209#endif
210
fe14fcc3 211#ifdef HAS_MEMCPY
85e6fe83 212# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
fe14fcc3 213# ifndef memcpy
a0d0e21e 214 extern char * memcpy _((char*, char*, int));
ee0007ab
LW
215# endif
216# endif
217#else
218# ifndef memcpy
219# ifdef HAS_BCOPY
220# define memcpy(d,s,l) bcopy(s,d,l)
221# else
222# define memcpy(d,s,l) my_bcopy(s,d,l)
223# endif
224# endif
225#endif /* HAS_MEMCPY */
fe14fcc3 226
ee0007ab 227#ifdef HAS_MEMSET
85e6fe83 228# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
ee0007ab 229# ifndef memset
a0d0e21e 230 extern char *memset _((char*, int, int));
ee0007ab
LW
231# endif
232# endif
233# define memzero(d,l) memset(d,0,l)
234#else
235# ifndef memzero
236# ifdef HAS_BZERO
237# define memzero(d,l) bzero(d,l)
238# else
239# define memzero(d,l) my_bzero(d,l)
240# endif
352d5a3a 241# endif
ee0007ab
LW
242#endif /* HAS_MEMSET */
243
244#ifdef HAS_MEMCMP
85e6fe83 245# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
ee0007ab 246# ifndef memcmp
a0d0e21e 247 extern int memcmp _((char*, char*, int));
ee0007ab
LW
248# endif
249# endif
250#else
251# ifndef memcmp
ecfc5424 252# define memcmp my_memcmp
352d5a3a 253# endif
ee0007ab 254#endif /* HAS_MEMCMP */
8d063cd8 255
85e6fe83 256#if !defined(HAS_MEMMOVE) && !defined(memmove)
2304df62 257# if defined(HAS_BCOPY) && defined(HAS_SAFE_BCOPY)
79072805
LW
258# define memmove(d,s,l) bcopy(s,d,l)
259# else
2304df62 260# if defined(HAS_MEMCPY) && defined(HAS_SAFE_MEMCPY)
79072805
LW
261# define memmove(d,s,l) memcpy(d,s,l)
262# else
263# define memmove(d,s,l) my_bcopy(s,d,l)
264# endif
265# endif
d9d8d8de 266#endif
378cc40b 267
ae986130 268#ifdef I_NETINET_IN
79072805 269# include <netinet/in.h>
ae986130
LW
270#endif
271
1aef975c 272#ifdef I_SYS_STAT
8d063cd8 273#include <sys/stat.h>
1aef975c 274#endif
79072805 275
a0d0e21e
LW
276/* The stat macros for Amdahl UTS, Unisoft System V/88 (and derivatives
277 like UTekV) are broken, sometimes giving false positives. Undefine
278 them here and let the code below set them to proper values.
279
280 The ghs macro stands for GreenHills Software C-1.8.5 which
281 is the C compiler for sysV88 and the various derivatives.
282 This header file bug is corrected in gcc-2.5.8 and later versions.
283 --Kaveh Ghazi (ghazi@noc.rutgers.edu) 10/3/94. */
284
285#if defined(uts) || (defined(m88k) && defined(ghs))
79072805
LW
286# undef S_ISDIR
287# undef S_ISCHR
288# undef S_ISBLK
289# undef S_ISREG
290# undef S_ISFIFO
291# undef S_ISLNK
ee0007ab 292#endif
135863df 293
663a0e37
LW
294#ifdef I_TIME
295# include <time.h>
ffed7fef 296#endif
663a0e37 297
fe14fcc3 298#ifdef I_SYS_TIME
85e6fe83 299# ifdef I_SYS_TIME_KERNEL
663a0e37
LW
300# define KERNEL
301# endif
302# include <sys/time.h>
85e6fe83 303# ifdef I_SYS_TIME_KERNEL
663a0e37
LW
304# undef KERNEL
305# endif
a687059c 306#endif
135863df 307
d9d8d8de 308#ifndef MSDOS
a0d0e21e 309# if defined(HAS_TIMES) && defined(I_SYS_TIMES)
85e6fe83
LW
310# include <sys/times.h>
311# endif
d9d8d8de 312#endif
8d063cd8 313
fe14fcc3 314#if defined(HAS_STRERROR) && (!defined(HAS_MKDIR) || !defined(HAS_RMDIR))
79072805 315# undef HAS_STRERROR
663a0e37
LW
316#endif
317
a0d0e21e
LW
318#ifndef HAS_MKFIFO
319# ifndef mkfifo
320# define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
321# endif
322#endif /* !HAS_MKFIFO */
323
663a0e37 324#include <errno.h>
ed6116ce 325#ifdef HAS_SOCKET
85e6fe83 326# ifdef I_NET_ERRNO
ed6116ce
LW
327# include <net/errno.h>
328# endif
329#endif
748a9306
LW
330#ifndef VMS
331# define FIXSTATUS(sts) (U_L((sts) & 0xffff))
332# define SHIFTSTATUS(sts) ((sts) >> 8)
333# define SETERRNO(errcode,vmserrcode) errno = (errcode)
334#else
335# define FIXSTATUS(sts) (U_L(sts))
336# define SHIFTSTATUS(sts) (sts)
728e2803 337# define SETERRNO(errcode,vmserrcode) STMT_START {set_errno(errcode); set_vaxc_errno(vmserrcode);} STMT_END
748a9306 338#endif
ed6116ce 339
d9d8d8de 340#ifndef MSDOS
79072805
LW
341# ifndef errno
342 extern int errno; /* ANSI allows errno to be an lvalue expr */
343# endif
d9d8d8de 344#endif
663a0e37 345
2304df62 346#ifdef HAS_STRERROR
a0d0e21e
LW
347# ifdef VMS
348 char *strerror _((int,...));
349# else
350 char *strerror _((int));
351# endif
2304df62
AD
352# ifndef Strerror
353# define Strerror strerror
354# endif
355#else
356# ifdef HAS_SYS_ERRLIST
79072805
LW
357 extern int sys_nerr;
358 extern char *sys_errlist[];
2304df62
AD
359# ifndef Strerror
360# define Strerror(e) \
79072805 361 ((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e])
2304df62 362# endif
79072805 363# endif
35c8bce7 364#endif
663a0e37 365
2304df62 366#ifdef I_SYS_IOCTL
79072805
LW
367# ifndef _IOCTL_
368# include <sys/ioctl.h>
369# endif
a687059c
LW
370#endif
371
ee0007ab 372#if defined(mc300) || defined(mc500) || defined(mc700) || defined(mc6000)
79072805
LW
373# ifdef HAS_SOCKETPAIR
374# undef HAS_SOCKETPAIR
375# endif
2304df62
AD
376# ifdef I_NDBM
377# undef I_NDBM
79072805 378# endif
a687059c
LW
379#endif
380
a687059c 381#if INTSIZE == 2
79072805
LW
382# define htoni htons
383# define ntohi ntohs
a687059c 384#else
79072805
LW
385# define htoni htonl
386# define ntohi ntohl
a687059c
LW
387#endif
388
a0d0e21e 389/* Configure already sets Direntry_t */
35c8bce7 390#if defined(I_DIRENT)
663a0e37 391# include <dirent.h>
a0d0e21e
LW
392# if defined(NeXT) && defined(I_SYS_DIR) /* NeXT needs dirent + sys/dir.h */
393# include <sys/dir.h>
394# endif
ae986130 395#else
fe14fcc3 396# ifdef I_SYS_NDIR
79a0689e 397# include <sys/ndir.h>
663a0e37 398# else
fe14fcc3 399# ifdef I_SYS_DIR
79a0689e
LW
400# ifdef hp9000s500
401# include <ndir.h> /* may be wrong in the future */
402# else
403# include <sys/dir.h>
404# endif
663a0e37
LW
405# endif
406# endif
4633a7c4 407#endif
a687059c 408
352d5a3a
LW
409#ifdef FPUTS_BOTCH
410/* work around botch in SunOS 4.0.1 and 4.0.2 */
411# ifndef fputs
79072805 412# define fputs(sv,fp) fprintf(fp,"%s",sv)
352d5a3a
LW
413# endif
414#endif
415
c623bd54
LW
416/*
417 * The following gobbledygook brought to you on behalf of __STDC__.
418 * (I could just use #ifndef __STDC__, but this is more bulletproof
419 * in the face of half-implementations.)
420 */
421
422#ifndef S_IFMT
423# ifdef _S_IFMT
424# define S_IFMT _S_IFMT
425# else
426# define S_IFMT 0170000
427# endif
428#endif
429
430#ifndef S_ISDIR
431# define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR)
432#endif
433
434#ifndef S_ISCHR
435# define S_ISCHR(m) ((m & S_IFMT) == S_IFCHR)
436#endif
437
438#ifndef S_ISBLK
fe14fcc3
LW
439# ifdef S_IFBLK
440# define S_ISBLK(m) ((m & S_IFMT) == S_IFBLK)
441# else
442# define S_ISBLK(m) (0)
443# endif
c623bd54
LW
444#endif
445
446#ifndef S_ISREG
447# define S_ISREG(m) ((m & S_IFMT) == S_IFREG)
448#endif
449
450#ifndef S_ISFIFO
fe14fcc3
LW
451# ifdef S_IFIFO
452# define S_ISFIFO(m) ((m & S_IFMT) == S_IFIFO)
453# else
454# define S_ISFIFO(m) (0)
455# endif
c623bd54
LW
456#endif
457
458#ifndef S_ISLNK
459# ifdef _S_ISLNK
460# define S_ISLNK(m) _S_ISLNK(m)
461# else
462# ifdef _S_IFLNK
463# define S_ISLNK(m) ((m & S_IFMT) == _S_IFLNK)
464# else
465# ifdef S_IFLNK
466# define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK)
467# else
468# define S_ISLNK(m) (0)
469# endif
470# endif
471# endif
472#endif
473
474#ifndef S_ISSOCK
475# ifdef _S_ISSOCK
476# define S_ISSOCK(m) _S_ISSOCK(m)
477# else
478# ifdef _S_IFSOCK
479# define S_ISSOCK(m) ((m & S_IFMT) == _S_IFSOCK)
480# else
481# ifdef S_IFSOCK
482# define S_ISSOCK(m) ((m & S_IFMT) == S_IFSOCK)
483# else
484# define S_ISSOCK(m) (0)
485# endif
486# endif
487# endif
488#endif
489
490#ifndef S_IRUSR
491# ifdef S_IREAD
492# define S_IRUSR S_IREAD
493# define S_IWUSR S_IWRITE
494# define S_IXUSR S_IEXEC
495# else
496# define S_IRUSR 0400
497# define S_IWUSR 0200
498# define S_IXUSR 0100
499# endif
500# define S_IRGRP (S_IRUSR>>3)
501# define S_IWGRP (S_IWUSR>>3)
502# define S_IXGRP (S_IXUSR>>3)
503# define S_IROTH (S_IRUSR>>6)
504# define S_IWOTH (S_IWUSR>>6)
505# define S_IXOTH (S_IXUSR>>6)
506#endif
507
508#ifndef S_ISUID
509# define S_ISUID 04000
510#endif
511
512#ifndef S_ISGID
513# define S_ISGID 02000
514#endif
515
79072805
LW
516#ifdef ff_next
517# undef ff_next
352d5a3a
LW
518#endif
519
a0d0e21e 520#if defined(cray) || defined(gould) || defined(i860) || defined(pyr)
45d8adaa
LW
521# define SLOPPYDIVIDE
522#endif
523
0c30d9ec 524#if defined(cray) || defined(convex) || BYTEORDER > 0xffff
ecfc5424 525# define HAS_QUAD
45d8adaa
LW
526#endif
527
748a9306
LW
528#ifdef UV
529#undef UV
530#endif
531
ecfc5424 532#ifdef HAS_QUAD
45d8adaa 533# ifdef cray
ecfc5424 534# define Quad_t int
45d8adaa 535# else
0c30d9ec 536# if defined(convex)
ecfc5424 537# define Quad_t long long
45d8adaa 538# else
ecfc5424 539# define Quad_t long
45d8adaa
LW
540# endif
541# endif
748a9306
LW
542 typedef Quad_t IV;
543 typedef unsigned Quad_t UV;
79072805 544#else
748a9306
LW
545 typedef long IV;
546 typedef unsigned long UV;
79072805
LW
547#endif
548
760ac839
LW
549/* Previously these definitions used hardcoded figures.
550 * It is hoped these formula are more portable, although
551 * no data one way or another is presently known to me.
552 * The "PERL_" names are used because these calculated constants
553 * do not meet the ANSI requirements for LONG_MAX, etc., which
554 * need to be constants acceptable to #if - kja
555 * define PERL_LONG_MAX 2147483647L
556 * define PERL_LONG_MIN (-LONG_MAX - 1)
557 * define PERL ULONG_MAX 4294967295L
558 */
559
560#ifdef I_LIMITS /* Needed for cast_xxx() functions below. */
561# include <limits.h>
562#else
563#ifdef I_VALUES
564# include <values.h>
565#endif
566#endif
567
568#ifdef LONG_MAX
569#define PERL_LONG_MAX LONG_MAX
570#else
571# ifdef MAXLONG /* Often used in <values.h> */
572# define PERL_LONG_MAX MAXLONG
573# else
574# define PERL_LONG_MAX ((long) ((~(unsigned long)0) >> 1))
575# endif
576#endif
577
578#ifdef LONG_MIN
579#define PERL_LONG_MIN LONG_MIN
580#else
581# ifdef MINLONG
582# define PERL_LONG_MIN MINLONG
583# else
584# define PERL_LONG_MIN (-LONG_MAX - ((3 & -1) == 3))
585# endif
586#endif
587
588#ifdef ULONG_MAX
589#define PERL_ULONG_MAX ULONG_MAX
590#else
591# ifdef MAXULONG
592# define PERL_ULONG_MAX MAXULONG
593# else
594# define PERL_ULONG_MAX (~(unsigned long)0)
595# endif
596#endif
597
598#ifdef ULONG_MIN
599#define PERL_ULONG_MIN ULONG_MIN
600#else
601# define ULONG_MIN 0L
602#endif
603
ee0007ab 604typedef MEM_SIZE STRLEN;
450a55e4 605
79072805
LW
606typedef struct op OP;
607typedef struct cop COP;
608typedef struct unop UNOP;
609typedef struct binop BINOP;
610typedef struct listop LISTOP;
611typedef struct logop LOGOP;
612typedef struct condop CONDOP;
613typedef struct pmop PMOP;
614typedef struct svop SVOP;
615typedef struct gvop GVOP;
616typedef struct pvop PVOP;
79072805
LW
617typedef struct loop LOOP;
618
619typedef struct Outrec Outrec;
93a17b20 620typedef struct interpreter PerlInterpreter;
79072805 621typedef struct ff FF;
79072805
LW
622typedef struct sv SV;
623typedef struct av AV;
624typedef struct hv HV;
625typedef struct cv CV;
378cc40b 626typedef struct regexp REGEXP;
79072805 627typedef struct gp GP;
0c30d9ec 628typedef struct gv GV;
8990e307 629typedef struct io IO;
79072805
LW
630typedef struct context CONTEXT;
631typedef struct block BLOCK;
632
633typedef struct magic MAGIC;
ed6116ce 634typedef struct xrv XRV;
79072805
LW
635typedef struct xpv XPV;
636typedef struct xpviv XPVIV;
637typedef struct xpvnv XPVNV;
638typedef struct xpvmg XPVMG;
639typedef struct xpvlv XPVLV;
640typedef struct xpvav XPVAV;
641typedef struct xpvhv XPVHV;
642typedef struct xpvgv XPVGV;
643typedef struct xpvcv XPVCV;
644typedef struct xpvbm XPVBM;
645typedef struct xpvfm XPVFM;
8990e307 646typedef struct xpvio XPVIO;
79072805
LW
647typedef struct mgvtbl MGVTBL;
648typedef union any ANY;
8d063cd8 649
378cc40b 650#include "handy.h"
a0d0e21e 651
16d20bd9
AD
652typedef I32 (*filter_t) _((int, SV *, int));
653#define FILTER_READ(idx, sv, len) filter_read(idx, sv, len)
654#define FILTER_DATA(idx) (AvARRAY(rsfp_filters)[idx])
655#define FILTER_ISREADER(idx) (idx >= AvFILL(rsfp_filters))
656
748a9306 657#ifdef DOSISH
4633a7c4
LW
658# if defined(OS2)
659# include "os2ish.h"
660# else
748a9306 661# include "dosish.h"
4633a7c4 662# endif
a0d0e21e 663#else
748a9306
LW
664# if defined(VMS)
665# include "vmsish.h"
666# else
0c30d9ec
PP
667# if defined(PLAN9)
668# include "./plan9/plan9ish.h"
669# else
670# include "unixish.h"
671# endif
748a9306
LW
672# endif
673#endif
3fc1aec6
PP
674
675/* Some unistd.h's give a prototype for pause() even though
676 HAS_PAUSE ends up undefined. This causes the #define
677 below to be rejected by the compmiler. Sigh.
678*/
679#ifdef HAS_PAUSE
680#define Pause pause
681#else
682#define Pause() sleep((32767<<16)+32767)
748a9306
LW
683#endif
684
685#ifndef IOCPARM_LEN
686# ifdef IOCPARM_MASK
687 /* on BSDish systes we're safe */
688# define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK)
689# else
690 /* otherwise guess at what's safe */
691# define IOCPARM_LEN(x) 256
692# endif
a0d0e21e
LW
693#endif
694
79072805
LW
695union any {
696 void* any_ptr;
697 I32 any_i32;
a0d0e21e 698 IV any_iv;
85e6fe83 699 long any_long;
a0d0e21e 700 void (*any_dptr) _((void*));
79072805
LW
701};
702
378cc40b 703#include "regexp.h"
79072805 704#include "sv.h"
378cc40b 705#include "util.h"
8d063cd8 706#include "form.h"
79072805
LW
707#include "gv.h"
708#include "cv.h"
709#include "opcode.h"
710#include "op.h"
711#include "cop.h"
712#include "av.h"
713#include "hv.h"
714#include "mg.h"
715#include "scope.h"
8d063cd8 716
4633a7c4
LW
717/* work around some libPW problems */
718#ifdef DOINIT
719EXT char Error[1];
720#endif
721
450a55e4 722#if defined(iAPX286) || defined(M_I286) || defined(I80286)
a687059c
LW
723# define I286
724#endif
725
fe14fcc3
LW
726#if defined(htonl) && !defined(HAS_HTONL)
727#define HAS_HTONL
ae986130 728#endif
fe14fcc3
LW
729#if defined(htons) && !defined(HAS_HTONS)
730#define HAS_HTONS
ae986130 731#endif
fe14fcc3
LW
732#if defined(ntohl) && !defined(HAS_NTOHL)
733#define HAS_NTOHL
ae986130 734#endif
fe14fcc3
LW
735#if defined(ntohs) && !defined(HAS_NTOHS)
736#define HAS_NTOHS
ae986130 737#endif
fe14fcc3 738#ifndef HAS_HTONL
d9d8d8de 739#if (BYTEORDER & 0xffff) != 0x4321
fe14fcc3
LW
740#define HAS_HTONS
741#define HAS_HTONL
742#define HAS_NTOHS
743#define HAS_NTOHL
a687059c
LW
744#define MYSWAP
745#define htons my_swap
746#define htonl my_htonl
747#define ntohs my_swap
748#define ntohl my_ntohl
749#endif
750#else
d9d8d8de 751#if (BYTEORDER & 0xffff) == 0x4321
fe14fcc3
LW
752#undef HAS_HTONS
753#undef HAS_HTONL
754#undef HAS_NTOHS
755#undef HAS_NTOHL
a687059c
LW
756#endif
757#endif
758
988174c1
LW
759/*
760 * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
761 * -DWS
762 */
763#if BYTEORDER != 0x1234
764# define HAS_VTOHL
765# define HAS_VTOHS
766# define HAS_HTOVL
767# define HAS_HTOVS
768# if BYTEORDER == 0x4321
769# define vtohl(x) ((((x)&0xFF)<<24) \
770 +(((x)>>24)&0xFF) \
771 +(((x)&0x0000FF00)<<8) \
772 +(((x)&0x00FF0000)>>8) )
773# define vtohs(x) ((((x)&0xFF)<<8) + (((x)>>8)&0xFF))
774# define htovl(x) vtohl(x)
775# define htovs(x) vtohs(x)
776# endif
777 /* otherwise default to functions in util.c */
778#endif
779
0f85fab0 780#ifdef CASTNEGFLOAT
79072805 781#define U_S(what) ((U16)(what))
0f85fab0 782#define U_I(what) ((unsigned int)(what))
79072805 783#define U_L(what) ((U32)(what))
0f85fab0 784#else
a0d0e21e 785U32 cast_ulong _((double));
232e078e
AD
786#define U_S(what) ((U16)cast_ulong((double)(what)))
787#define U_I(what) ((unsigned int)cast_ulong((double)(what)))
788#define U_L(what) (cast_ulong((double)(what)))
ee0007ab
LW
789#endif
790
ed6116ce
LW
791#ifdef CASTI32
792#define I_32(what) ((I32)(what))
a0d0e21e 793#define I_V(what) ((IV)(what))
5d94fbed 794#define U_V(what) ((UV)(what))
ed6116ce 795#else
a0d0e21e 796I32 cast_i32 _((double));
232e078e 797#define I_32(what) (cast_i32((double)(what)))
a0d0e21e 798IV cast_iv _((double));
232e078e 799#define I_V(what) (cast_iv((double)(what)))
5d94fbed
AD
800UV cast_uv _((double));
801#define U_V(what) (cast_uv((double)(what)))
ed6116ce
LW
802#endif
803
79072805
LW
804struct Outrec {
805 I32 o_lines;
d9d8d8de 806 char *o_str;
79072805 807 U32 o_len;
8d063cd8
LW
808};
809
352d5a3a
LW
810#ifndef MAXSYSFD
811# define MAXSYSFD 2
812#endif
ee0007ab 813
f82b3d41
PP
814#ifndef TMPPATH
815# define TMPPATH "/tmp/perl-eXXXXXX"
a0d0e21e 816#endif
79072805
LW
817
818#ifndef __cplusplus
a0d0e21e
LW
819Uid_t getuid _((void));
820Uid_t geteuid _((void));
821Gid_t getgid _((void));
822Gid_t getegid _((void));
79072805 823#endif
8d063cd8
LW
824
825#ifdef DEBUGGING
0c30d9ec 826#ifndef Perl_debug_log
760ac839 827#define Perl_debug_log PerlIO_stderr()
0c30d9ec 828#endif
d96024cf 829#define YYDEBUG 1
79072805
LW
830#define DEB(a) a
831#define DEBUG(a) if (debug) a
832#define DEBUG_p(a) if (debug & 1) a
833#define DEBUG_s(a) if (debug & 2) a
834#define DEBUG_l(a) if (debug & 4) a
835#define DEBUG_t(a) if (debug & 8) a
836#define DEBUG_o(a) if (debug & 16) a
837#define DEBUG_c(a) if (debug & 32) a
838#define DEBUG_P(a) if (debug & 64) a
0c30d9ec 839#define DEBUG_m(a) if (curinterp && debug & 128) a
79072805
LW
840#define DEBUG_f(a) if (debug & 256) a
841#define DEBUG_r(a) if (debug & 512) a
842#define DEBUG_x(a) if (debug & 1024) a
843#define DEBUG_u(a) if (debug & 2048) a
844#define DEBUG_L(a) if (debug & 4096) a
845#define DEBUG_H(a) if (debug & 8192) a
846#define DEBUG_X(a) if (debug & 16384) a
8990e307 847#define DEBUG_D(a) if (debug & 32768) a
79072805
LW
848#else
849#define DEB(a)
850#define DEBUG(a)
851#define DEBUG_p(a)
852#define DEBUG_s(a)
853#define DEBUG_l(a)
854#define DEBUG_t(a)
855#define DEBUG_o(a)
856#define DEBUG_c(a)
857#define DEBUG_P(a)
858#define DEBUG_m(a)
859#define DEBUG_f(a)
860#define DEBUG_r(a)
861#define DEBUG_x(a)
862#define DEBUG_u(a)
863#define DEBUG_L(a)
864#define DEBUG_H(a)
865#define DEBUG_X(a)
8990e307 866#define DEBUG_D(a)
8d063cd8 867#endif
fe14fcc3 868#define YYMAXDEPTH 300
8d063cd8 869
79072805
LW
870#define assert(what) DEB( { \
871 if (!(what)) { \
463ee0b2 872 croak("Assertion failed: file \"%s\", line %d", \
79072805
LW
873 __FILE__, __LINE__); \
874 exit(1); \
875 }})
8d063cd8 876
450a55e4 877struct ufuncs {
a0d0e21e
LW
878 I32 (*uf_val)_((IV, SV*));
879 I32 (*uf_set)_((IV, SV*));
880 IV uf_index;
450a55e4
LW
881};
882
fe14fcc3 883/* Fix these up for __STDC__ */
a0d0e21e
LW
884#ifndef __cplusplus
885char *mktemp _((char*));
886double atof _((const char*));
887#endif
79072805 888
352d5a3a 889#ifndef STANDARD_C
fe14fcc3 890/* All of these are in stdlib.h or time.h for ANSI C */
85e6fe83 891Time_t time();
8d063cd8 892struct tm *gmtime(), *localtime();
93a17b20 893char *strchr(), *strrchr();
378cc40b 894char *strcpy(), *strcat();
352d5a3a 895#endif /* ! STANDARD_C */
8d063cd8 896
79072805
LW
897
898#ifdef I_MATH
899# include <math.h>
900#else
901# ifdef __cplusplus
902 extern "C" {
903# endif
a0d0e21e 904 double exp _((double));
a0d0e21e
LW
905 double log _((double));
906 double sqrt _((double));
907 double modf _((double,double*));
908 double sin _((double));
909 double cos _((double));
910 double atan2 _((double,double));
911 double pow _((double,double));
79072805
LW
912# ifdef __cplusplus
913 };
914# endif
915#endif
916
a0d0e21e 917#ifndef __cplusplus
3fc1aec6
PP
918#ifdef __NeXT__ /* or whatever catches all NeXTs */
919char *crypt (); /* Maybe more hosts will need the unprototyped version */
920#else
a0d0e21e 921char *crypt _((const char*, const char*));
3fc1aec6 922#endif
a0d0e21e
LW
923char *getenv _((const char*));
924Off_t lseek _((int,Off_t,int));
925char *getlogin _((void));
926#endif
79072805 927
16d20bd9 928#ifdef UNLINK_ALL_VERSIONS /* Currently only makes sense for VMS */
378cc40b 929#define UNLINK unlnk
a0d0e21e 930I32 unlnk _((char*));
8d063cd8
LW
931#else
932#define UNLINK unlink
933#endif
a687059c 934
fe14fcc3 935#ifndef HAS_SETREUID
85e6fe83
LW
936# ifdef HAS_SETRESUID
937# define setreuid(r,e) setresuid(r,e,(Uid_t)-1)
938# define HAS_SETREUID
939# endif
a687059c 940#endif
fe14fcc3 941#ifndef HAS_SETREGID
85e6fe83
LW
942# ifdef HAS_SETRESGID
943# define setregid(r,e) setresgid(r,e,(Gid_t)-1)
944# define HAS_SETREGID
945# endif
a687059c 946#endif
ee0007ab
LW
947
948#define SCAN_DEF 0
949#define SCAN_TR 1
950#define SCAN_REPL 2
79072805 951
760ac839
LW
952#ifdef MYMALLOC
953# ifndef DEBUGGING_MSTATS
954# define DEBUGGING_MSTATS
955# endif
956#endif
957
79072805 958#ifdef DEBUGGING
4633a7c4 959# ifndef register
a0d0e21e
LW
960# define register
961# endif
962# define PAD_SV(po) pad_sv(po)
79072805 963#else
a0d0e21e 964# define PAD_SV(po) curpad[po]
79072805
LW
965#endif
966
967/****************/
968/* Truly global */
969/****************/
970
971/* global state */
a0d0e21e 972EXT PerlInterpreter * curinterp; /* currently running interpreter */
0c30d9ec
PP
973/* VMS doesn't use environ array and NeXT has problems with crt0.o globals */
974#if !defined(VMS) && !(defined(NeXT) && defined(__DYNAMIC__))
79072805 975extern char ** environ; /* environment variables supplied via exec */
0c30d9ec
PP
976#else
977# if defined(NeXT) && defined(__DYNAMIC__)
978
979# include <mach-o/dyld.h>
980EXT char *** environ_pointer;
981# define environ (*environ_pointer)
982# endif
983#endif /* environ processing */
984
79072805
LW
985EXT int uid; /* current real user id */
986EXT int euid; /* current effective user id */
987EXT int gid; /* current real group id */
988EXT int egid; /* current effective group id */
989EXT bool nomemok; /* let malloc context handle nomem */
990EXT U32 an; /* malloc sequence number */
463ee0b2 991EXT U32 cop_seqmax; /* statement sequence number */
c07a80fd 992EXT U16 op_seqmax; /* op sequence number */
8990e307 993EXT U32 evalseq; /* eval sequence number */
463ee0b2 994EXT U32 sub_generation; /* inc to force methods to be looked up again */
79072805
LW
995EXT char ** origenviron;
996EXT U32 origalen;
a0d0e21e 997EXT U32 * profiledata;
84ea024a 998EXT int maxo INIT(MAXO);/* Number of ops */
728e2803 999EXT char * osname; /* operating system */
79072805 1000
a0d0e21e
LW
1001EXT XPV* xiv_arenaroot; /* list of allocated xiv areas */
1002EXT IV ** xiv_root; /* free xiv list--shared by interpreters */
8990e307
LW
1003EXT double * xnv_root; /* free xnv list--shared by interpreters */
1004EXT XRV * xrv_root; /* free xrv list--shared by interpreters */
1005EXT XPV * xpv_root; /* free xpv list--shared by interpreters */
4633a7c4 1006EXT HE * he_root; /* free he list--shared by interpreters */
c07a80fd
PP
1007EXT char * nice_chunk; /* a nice chunk of memory to reuse */
1008EXT U32 nice_chunk_size;/* how nice the chunk of memory is */
8990e307 1009
79072805
LW
1010/* Stack for currently executing thread--context switch must handle this. */
1011EXT SV ** stack_base; /* stack->array_ary */
1012EXT SV ** stack_sp; /* stack pointer now */
1013EXT SV ** stack_max; /* stack->array_ary + stack->array_max */
1014
1015/* likewise for these */
1016
1017EXT OP * op; /* current op--oughta be in a global register */
1018
1019EXT I32 * scopestack; /* blocks we've entered */
1020EXT I32 scopestack_ix;
1021EXT I32 scopestack_max;
1022
1023EXT ANY* savestack; /* to save non-local values on */
1024EXT I32 savestack_ix;
1025EXT I32 savestack_max;
1026
1027EXT OP ** retstack; /* returns we've pushed */
1028EXT I32 retstack_ix;
1029EXT I32 retstack_max;
1030
1031EXT I32 * markstack; /* stackmarks we're remembering */
1032EXT I32 * markstack_ptr; /* stackmarks we're remembering */
1033EXT I32 * markstack_max; /* stackmarks we're remembering */
1034
1035EXT SV ** curpad;
1036
1037/* temp space */
1038EXT SV * Sv;
3fc1aec6 1039EXT HE He;
79072805 1040EXT XPV * Xpv;
f82b3d41 1041EXT char buf[2048]; /* should be longer than PATH_MAX */
79072805
LW
1042EXT char tokenbuf[256];
1043EXT struct stat statbuf;
ecfc5424 1044#ifdef HAS_TIMES
79072805
LW
1045EXT struct tms timesbuf;
1046#endif
463ee0b2 1047EXT STRLEN na; /* for use in SvPV when length is Not Applicable */
79072805
LW
1048
1049/* for tmp use in stupid debuggers */
1050EXT int * di;
1051EXT short * ds;
1052EXT char * dc;
1053
1054/* handy constants */
1055EXT char * Yes INIT("1");
1056EXT char * No INIT("");
1057EXT char * hexdigit INIT("0123456789abcdef0123456789ABCDEFx");
79072805
LW
1058EXT char * patleave INIT("\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}");
1059EXT char * vert INIT("|");
1060
8990e307 1061EXT char warn_uninit[]
a0d0e21e 1062 INIT("Use of uninitialized value");
463ee0b2
LW
1063EXT char warn_nosemi[]
1064 INIT("Semicolon seems to be missing");
1065EXT char warn_reserved[]
1066 INIT("Unquoted string \"%s\" may clash with future reserved word");
1067EXT char warn_nl[]
93a17b20 1068 INIT("Unsuccessful %s on filename containing newline");
a0d0e21e
LW
1069EXT char no_wrongref[]
1070 INIT("Can't use %s ref as %s ref");
1071EXT char no_symref[]
748a9306 1072 INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
93a17b20 1073EXT char no_usym[]
8990e307 1074 INIT("Can't use an undefined value as %s reference");
93a17b20
LW
1075EXT char no_aelem[]
1076 INIT("Modification of non-creatable array value attempted, subscript %d");
1077EXT char no_helem[]
1078 INIT("Modification of non-creatable hash value attempted, subscript \"%s\"");
1079EXT char no_modify[]
1080 INIT("Modification of a read-only value attempted");
1081EXT char no_mem[]
1082 INIT("Out of memory!\n");
1083EXT char no_security[]
463ee0b2 1084 INIT("Insecure dependency in %s%s");
93a17b20
LW
1085EXT char no_sock_func[]
1086 INIT("Unsupported socket function \"%s\" called");
1087EXT char no_dir_func[]
1088 INIT("Unsupported directory function \"%s\" called");
1089EXT char no_func[]
1090 INIT("The %s function is unimplemented");
748a9306
LW
1091EXT char no_myglob[]
1092 INIT("\"my\" variable %s can't be in a package");
93a17b20 1093
79072805
LW
1094EXT SV sv_undef;
1095EXT SV sv_no;
1096EXT SV sv_yes;
1097#ifdef CSH
1098 EXT char * cshname INIT(CSH);
1099 EXT I32 cshlen;
1100#endif
1101
1102#ifdef DOINIT
8e07c86e
AD
1103EXT char *sig_name[] = { SIG_NAME };
1104EXT int sig_num[] = { SIG_NUM };
0c30d9ec
PP
1105EXT SV * psig_ptr[sizeof(sig_num)/sizeof(*sig_num)];
1106EXT SV * psig_name[sizeof(sig_num)/sizeof(*sig_num)];
79072805
LW
1107#else
1108EXT char *sig_name[];
8e07c86e 1109EXT int sig_num[];
0c30d9ec
PP
1110EXT SV * psig_ptr[];
1111EXT SV * psig_name[];
79072805
LW
1112#endif
1113
1114#ifdef DOINIT
79072805
LW
1115EXT unsigned char fold[] = { /* fast case folding table */
1116 0, 1, 2, 3, 4, 5, 6, 7,
1117 8, 9, 10, 11, 12, 13, 14, 15,
1118 16, 17, 18, 19, 20, 21, 22, 23,
1119 24, 25, 26, 27, 28, 29, 30, 31,
1120 32, 33, 34, 35, 36, 37, 38, 39,
1121 40, 41, 42, 43, 44, 45, 46, 47,
1122 48, 49, 50, 51, 52, 53, 54, 55,
1123 56, 57, 58, 59, 60, 61, 62, 63,
1124 64, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
1125 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
1126 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
1127 'x', 'y', 'z', 91, 92, 93, 94, 95,
1128 96, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
1129 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
1130 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
1131 'X', 'Y', 'Z', 123, 124, 125, 126, 127,
1132 128, 129, 130, 131, 132, 133, 134, 135,
1133 136, 137, 138, 139, 140, 141, 142, 143,
1134 144, 145, 146, 147, 148, 149, 150, 151,
1135 152, 153, 154, 155, 156, 157, 158, 159,
1136 160, 161, 162, 163, 164, 165, 166, 167,
1137 168, 169, 170, 171, 172, 173, 174, 175,
1138 176, 177, 178, 179, 180, 181, 182, 183,
1139 184, 185, 186, 187, 188, 189, 190, 191,
1140 192, 193, 194, 195, 196, 197, 198, 199,
1141 200, 201, 202, 203, 204, 205, 206, 207,
1142 208, 209, 210, 211, 212, 213, 214, 215,
1143 216, 217, 218, 219, 220, 221, 222, 223,
1144 224, 225, 226, 227, 228, 229, 230, 231,
1145 232, 233, 234, 235, 236, 237, 238, 239,
1146 240, 241, 242, 243, 244, 245, 246, 247,
1147 248, 249, 250, 251, 252, 253, 254, 255
1148};
1149#else
1150EXT unsigned char fold[];
1151#endif
1152
1153#ifdef DOINIT
1154EXT unsigned char freq[] = { /* letter frequencies for mixed English/C */
1155 1, 2, 84, 151, 154, 155, 156, 157,
1156 165, 246, 250, 3, 158, 7, 18, 29,
1157 40, 51, 62, 73, 85, 96, 107, 118,
1158 129, 140, 147, 148, 149, 150, 152, 153,
1159 255, 182, 224, 205, 174, 176, 180, 217,
1160 233, 232, 236, 187, 235, 228, 234, 226,
1161 222, 219, 211, 195, 188, 193, 185, 184,
1162 191, 183, 201, 229, 181, 220, 194, 162,
1163 163, 208, 186, 202, 200, 218, 198, 179,
1164 178, 214, 166, 170, 207, 199, 209, 206,
1165 204, 160, 212, 216, 215, 192, 175, 173,
1166 243, 172, 161, 190, 203, 189, 164, 230,
1167 167, 248, 227, 244, 242, 255, 241, 231,
1168 240, 253, 169, 210, 245, 237, 249, 247,
1169 239, 168, 252, 251, 254, 238, 223, 221,
1170 213, 225, 177, 197, 171, 196, 159, 4,
1171 5, 6, 8, 9, 10, 11, 12, 13,
1172 14, 15, 16, 17, 19, 20, 21, 22,
1173 23, 24, 25, 26, 27, 28, 30, 31,
1174 32, 33, 34, 35, 36, 37, 38, 39,
1175 41, 42, 43, 44, 45, 46, 47, 48,
1176 49, 50, 52, 53, 54, 55, 56, 57,
1177 58, 59, 60, 61, 63, 64, 65, 66,
1178 67, 68, 69, 70, 71, 72, 74, 75,
1179 76, 77, 78, 79, 80, 81, 82, 83,
1180 86, 87, 88, 89, 90, 91, 92, 93,
1181 94, 95, 97, 98, 99, 100, 101, 102,
1182 103, 104, 105, 106, 108, 109, 110, 111,
1183 112, 113, 114, 115, 116, 117, 119, 120,
1184 121, 122, 123, 124, 125, 126, 127, 128,
1185 130, 131, 132, 133, 134, 135, 136, 137,
1186 138, 139, 141, 142, 143, 144, 145, 146
1187};
1188#else
1189EXT unsigned char freq[];
1190#endif
1191
8990e307
LW
1192#ifdef DEBUGGING
1193#ifdef DOINIT
1194EXT char* block_type[] = {
1195 "NULL",
1196 "SUB",
1197 "EVAL",
1198 "LOOP",
1199 "SUBST",
1200 "BLOCK",
1201};
1202#else
1203EXT char* block_type[];
1204#endif
1205#endif
1206
79072805
LW
1207/*****************************************************************************/
1208/* This lexer/parser stuff is currently global since yacc is hard to reenter */
1209/*****************************************************************************/
8990e307 1210/* XXX This needs to be revisited, since BEGIN makes yacc re-enter... */
79072805 1211
a0d0e21e
LW
1212#include "perly.h"
1213
79072805
LW
1214typedef enum {
1215 XOPERATOR,
1216 XTERM,
79072805 1217 XREF,
8990e307 1218 XSTATE,
a0d0e21e
LW
1219 XBLOCK,
1220 XTERMBLOCK
79072805
LW
1221} expectation;
1222
a0d0e21e
LW
1223EXT U32 lex_state; /* next token is determined */
1224EXT U32 lex_defer; /* state after determined token */
1225EXT expectation lex_expect; /* expect after determined token */
1226EXT I32 lex_brackets; /* bracket count */
1227EXT I32 lex_formbrack; /* bracket count at outer format level */
1228EXT I32 lex_fakebrack; /* outer bracket is mere delimiter */
1229EXT I32 lex_casemods; /* casemod count */
1230EXT I32 lex_dojoin; /* doing an array interpolation */
1231EXT I32 lex_starts; /* how many interps done on level */
1232EXT SV * lex_stuff; /* runtime pattern from m// or s/// */
1233EXT SV * lex_repl; /* runtime replacement from s/// */
1234EXT OP * lex_op; /* extra info to pass back on op */
1235EXT OP * lex_inpat; /* in pattern $) and $| are special */
1236EXT I32 lex_inwhat; /* what kind of quoting are we in */
1237EXT char * lex_brackstack; /* what kind of brackets to pop */
1238EXT char * lex_casestack; /* what kind of case mods in effect */
1239
1240/* What we know when we're in LEX_KNOWNEXT state. */
1241EXT YYSTYPE nextval[5]; /* value of next token, if any */
1242EXT I32 nexttype[5]; /* type of next token */
1243EXT I32 nexttoke;
1244
760ac839 1245EXT PerlIO * VOL rsfp INIT(Nullfp);
79072805
LW
1246EXT SV * linestr;
1247EXT char * bufptr;
1248EXT char * oldbufptr;
1249EXT char * oldoldbufptr;
1250EXT char * bufend;
8990e307 1251EXT expectation expect INIT(XSTATE); /* how to interpret ambiguous tokens */
16d20bd9 1252EXT AV * rsfp_filters;
79072805
LW
1253
1254EXT I32 multi_start; /* 1st line of multi-line string */
1255EXT I32 multi_end; /* last line of multi-line string */
1256EXT I32 multi_open; /* delimiter of said string */
1257EXT I32 multi_close; /* delimiter of said string */
1258
1259EXT GV * scrgv;
1260EXT I32 error_count; /* how many errors so far, max 10 */
1261EXT I32 subline; /* line this subroutine began on */
1262EXT SV * subname; /* name of current subroutine */
1263
748a9306 1264EXT CV * compcv; /* currently compiling subroutine */
93a17b20 1265EXT AV * comppad; /* storage for lexically scoped temporaries */
8990e307
LW
1266EXT AV * comppad_name; /* variable names for "my" variables */
1267EXT I32 comppad_name_fill;/* last "introduced" variable offset */
0c30d9ec 1268EXT I32 comppad_name_floor;/* start of vars in innermost block */
8990e307
LW
1269EXT I32 min_intro_pending;/* start of vars to introduce */
1270EXT I32 max_intro_pending;/* end of vars to introduce */
79072805 1271EXT I32 padix; /* max used index in current "register" pad */
a0d0e21e 1272EXT I32 padix_floor; /* how low may inner block reset padix */
748a9306 1273EXT I32 pad_reset_pending; /* reset pad on next attempted alloc */
79072805
LW
1274EXT COP compiling;
1275
79072805
LW
1276EXT I32 thisexpr; /* name id for nothing_in_common() */
1277EXT char * last_uni; /* position of last named-unary operator */
1278EXT char * last_lop; /* position of last list operator */
8990e307 1279EXT OPCODE last_lop_op; /* last list operator */
93a17b20 1280EXT bool in_my; /* we're compiling a "my" declaration */
79072805
LW
1281#ifdef FCRYPT
1282EXT I32 cryptseen; /* has fast crypt() been initialized? */
1283#endif
1284
85e6fe83
LW
1285EXT U32 hints; /* various compilation flags */
1286
1287 /* Note: the lowest 8 bits are reserved for
1288 stuffing into op->op_private */
1289#define HINT_INTEGER 0x00000001
1290#define HINT_STRICT_REFS 0x00000002
1291
1292#define HINT_BLOCK_SCOPE 0x00000100
1293#define HINT_STRICT_SUBS 0x00000200
1294#define HINT_STRICT_VARS 0x00000400
0c30d9ec 1295#define HINT_STRICT_UNTIE 0x00000800
85e6fe83 1296
79072805
LW
1297/**************************************************************************/
1298/* This regexp stuff is global since it always happens within 1 expr eval */
1299/**************************************************************************/
1300
1301EXT char * regprecomp; /* uncompiled string. */
1302EXT char * regparse; /* Input-scan pointer. */
1303EXT char * regxend; /* End of input for compile */
1304EXT I32 regnpar; /* () count. */
1305EXT char * regcode; /* Code-emit pointer; &regdummy = don't. */
1306EXT I32 regsize; /* Code size. */
a0d0e21e 1307EXT I32 regnaughty; /* How bad is this pattern? */
79072805
LW
1308EXT I32 regsawback; /* Did we see \1, ...? */
1309
1310EXT char * reginput; /* String-input pointer. */
79072805
LW
1311EXT char * regbol; /* Beginning of input, for ^ check. */
1312EXT char * regeol; /* End of input, for $ check. */
1313EXT char ** regstartp; /* Pointer to startp array. */
1314EXT char ** regendp; /* Ditto for endp. */
a0d0e21e 1315EXT U32 * reglastparen; /* Similarly for lastparen. */
79072805 1316EXT char * regtill; /* How far we are required to go. */
a0d0e21e
LW
1317EXT U16 regflags; /* are we folding, multilining? */
1318EXT char regprev; /* char before regbol, \n if none */
79072805 1319
760ac839
LW
1320EXT bool do_undump; /* -u or dump seen? */
1321EXT VOL U32 debug;
1322
79072805
LW
1323/***********************************************/
1324/* Global only to current interpreter instance */
1325/***********************************************/
1326
8990e307 1327#ifdef MULTIPLICITY
79072805
LW
1328#define IEXT
1329#define IINIT(x)
1330struct interpreter {
1331#else
1332#define IEXT EXT
1333#define IINIT(x) INIT(x)
1334#endif
1335
1336/* pseudo environmental stuff */
1337IEXT int Iorigargc;
1338IEXT char ** Iorigargv;
1339IEXT GV * Ienvgv;
1340IEXT GV * Isiggv;
1341IEXT GV * Iincgv;
1342IEXT char * Iorigfilename;
748a9306
LW
1343IEXT SV * Idiehook;
1344IEXT SV * Iwarnhook;
1345IEXT SV * Iparsehook;
79072805 1346
c07a80fd
PP
1347/* Various states of an input record separator SV (rs, nrs) */
1348#define RsSNARF(sv) (! SvOK(sv))
1349#define RsSIMPLE(sv) (SvOK(sv) && SvCUR(sv))
1350#define RsPARA(sv) (SvOK(sv) && ! SvCUR(sv))
1351
79072805
LW
1352/* switches */
1353IEXT char * Icddir;
1354IEXT bool Iminus_c;
a5f75d66 1355IEXT char Ipatchlevel[10];
728e2803 1356IEXT char ** Ilocalpatches;
c07a80fd 1357IEXT SV * Inrs;
2304df62 1358IEXT char * Isplitstr IINIT(" ");
79072805
LW
1359IEXT bool Ipreprocess;
1360IEXT bool Iminus_n;
1361IEXT bool Iminus_p;
1362IEXT bool Iminus_l;
1363IEXT bool Iminus_a;
2304df62 1364IEXT bool Iminus_F;
79072805
LW
1365IEXT bool Idoswitches;
1366IEXT bool Idowarn;
1367IEXT bool Idoextract;
79072805
LW
1368IEXT bool Isawampersand; /* must save all match strings */
1369IEXT bool Isawstudy; /* do fbm_instr on all strings */
1370IEXT bool Isawi; /* study must assume case insensitive */
1371IEXT bool Isawvec;
1372IEXT bool Iunsafe;
79072805
LW
1373IEXT char * Iinplace;
1374IEXT char * Ie_tmpname;
760ac839 1375IEXT PerlIO * Ie_fp;
79072805 1376IEXT U32 Iperldb;
748a9306
LW
1377 /* This value may be raised by extensions for testing purposes */
1378IEXT int Iperl_destruct_level; /* 0=none, 1=full, 2=full with checks */
79072805
LW
1379
1380/* magical thingies */
85e6fe83 1381IEXT Time_t Ibasetime; /* $^T */
79072805
LW
1382IEXT SV * Iformfeed; /* $^L */
1383IEXT char * Ichopset IINIT(" \n-"); /* $: */
c07a80fd 1384IEXT SV * Irs; /* $/ */
79072805 1385IEXT char * Iofs; /* $, */
8990e307 1386IEXT STRLEN Iofslen;
79072805 1387IEXT char * Iors; /* $\ */
8990e307 1388IEXT STRLEN Iorslen;
79072805
LW
1389IEXT char * Iofmt; /* $# */
1390IEXT I32 Imaxsysfd IINIT(MAXSYSFD); /* top fd to pass to subprocesses */
1391IEXT int Imultiline; /* $*--do strings hold >1 line? */
748a9306 1392IEXT U32 Istatusvalue; /* $? */
79072805
LW
1393
1394IEXT struct stat Istatcache; /* _ */
1395IEXT GV * Istatgv;
1396IEXT SV * Istatname IINIT(Nullsv);
1397
1398/* shortcuts to various I/O objects */
1399IEXT GV * Istdingv;
1400IEXT GV * Ilast_in_gv;
1401IEXT GV * Idefgv;
1402IEXT GV * Iargvgv;
1403IEXT GV * Idefoutgv;
79072805
LW
1404IEXT GV * Iargvoutgv;
1405
1406/* shortcuts to regexp stuff */
1407IEXT GV * Ileftgv;
1408IEXT GV * Iampergv;
1409IEXT GV * Irightgv;
1410IEXT PMOP * Icurpm; /* what to do \ interps from */
79072805
LW
1411IEXT I32 * Iscreamfirst;
1412IEXT I32 * Iscreamnext;
1413IEXT I32 Imaxscream IINIT(-1);
1414IEXT SV * Ilastscream;
1415
4633a7c4
LW
1416/* shortcuts to misc objects */
1417IEXT GV * Ierrgv;
1418
79072805
LW
1419/* shortcuts to debugging objects */
1420IEXT GV * IDBgv;
1421IEXT GV * IDBline;
1422IEXT GV * IDBsub;
1423IEXT SV * IDBsingle;
1424IEXT SV * IDBtrace;
1425IEXT SV * IDBsignal;
1426IEXT AV * Ilineary; /* lines of script for debugger */
1427IEXT AV * Idbargs; /* args to call listed by caller function */
1428
1429/* symbol tables */
1430IEXT HV * Idefstash; /* main symbol table */
1431IEXT HV * Icurstash; /* symbol table for current package */
1432IEXT HV * Idebstash; /* symbol table for perldb package */
1433IEXT SV * Icurstname; /* name of current package */
93a17b20
LW
1434IEXT AV * Ibeginav; /* names of BEGIN subroutines */
1435IEXT AV * Iendav; /* names of END subroutines */
0c30d9ec 1436IEXT HV * Istrtab; /* shared string table */
79072805
LW
1437
1438/* memory management */
79072805
LW
1439IEXT SV ** Itmps_stack;
1440IEXT I32 Itmps_ix IINIT(-1);
1441IEXT I32 Itmps_floor IINIT(-1);
8990e307
LW
1442IEXT I32 Itmps_max;
1443IEXT I32 Isv_count; /* how many SV* are currently allocated */
a0d0e21e 1444IEXT I32 Isv_objcount; /* how many objects are currently allocated */
8990e307
LW
1445IEXT SV* Isv_root; /* storage for SVs belonging to interp */
1446IEXT SV* Isv_arenaroot; /* list of areas for garbage collection */
79072805
LW
1447
1448/* funky return mechanisms */
1449IEXT I32 Ilastspbase;
1450IEXT I32 Ilastsize;
1451IEXT int Iforkprocess; /* so do_open |- can return proc# */
1452
1453/* subprocess state */
1454IEXT AV * Ifdpid; /* keep fd-to-pid mappings for my_popen */
1455IEXT HV * Ipidstatus; /* keep pid-to-status mappings for waitpid */
1456
1457/* internal state */
463ee0b2
LW
1458IEXT VOL int Iin_eval; /* trap "fatal" errors? */
1459IEXT OP * Irestartop; /* Are we propagating an error from croak? */
79072805 1460IEXT int Idelaymagic; /* ($<,$>) = ... */
2304df62 1461IEXT bool Idirty; /* In the middle of tearing things down? */
748a9306 1462IEXT U8 Ilocalizing; /* are we processing a local() list? */
79072805 1463IEXT bool Itainted; /* using variables controlled by $< */
463ee0b2 1464IEXT bool Itainting; /* doing taint checks */
e50aee73 1465IEXT char * Iop_mask IINIT(NULL); /* masked operations for safe evals */
79072805
LW
1466
1467/* trace state */
1468IEXT I32 Idlevel;
1469IEXT I32 Idlmax IINIT(128);
1470IEXT char * Idebname;
1471IEXT char * Idebdelim;
1472
1473/* current interpreter roots */
748a9306 1474IEXT CV * Imain_cv;
463ee0b2
LW
1475IEXT OP * Imain_root;
1476IEXT OP * Imain_start;
1477IEXT OP * Ieval_root;
1478IEXT OP * Ieval_start;
79072805
LW
1479
1480/* runtime control stuff */
1481IEXT COP * VOL Icurcop IINIT(&compiling);
0c30d9ec 1482IEXT COP * Icurcopdb IINIT(NULL);
79072805
LW
1483IEXT line_t Icopline IINIT(NOLINE);
1484IEXT CONTEXT * Icxstack;
1485IEXT I32 Icxstack_ix IINIT(-1);
1486IEXT I32 Icxstack_max IINIT(128);
a5f75d66 1487IEXT Sigjmp_buf Itop_env;
a0d0e21e 1488IEXT I32 Irunlevel;
79072805
LW
1489
1490/* stack stuff */
0c30d9ec 1491IEXT AV * Icurstack; /* THE STACK */
79072805
LW
1492IEXT AV * Imainstack; /* the stack when nothing funny is happening */
1493IEXT SV ** Imystack_base; /* stack->array_ary */
1494IEXT SV ** Imystack_sp; /* stack pointer now */
1495IEXT SV ** Imystack_max; /* stack->array_ary + stack->array_max */
1496
1497/* format accumulators */
463ee0b2
LW
1498IEXT SV * Iformtarget;
1499IEXT SV * Ibodytarget;
1500IEXT SV * Itoptarget;
79072805
LW
1501
1502/* statics moved here for shared library purposes */
93a17b20 1503IEXT SV Istrchop; /* return value from chop */
79072805
LW
1504IEXT int Ifilemode; /* so nextargv() can preserve mode */
1505IEXT int Ilastfd; /* what to preserve mode on */
1506IEXT char * Ioldname; /* what to preserve mode on */
1507IEXT char ** IArgv; /* stuff to free from do_aexec, vfork safe */
1508IEXT char * ICmd; /* stuff to free from do_aexec, vfork safe */
1509IEXT OP * Isortcop; /* user defined sort routine */
1510IEXT HV * Isortstash; /* which is in some package or other */
1511IEXT GV * Ifirstgv; /* $a */
1512IEXT GV * Isecondgv; /* $b */
1513IEXT AV * Isortstack; /* temp stack during pp_sort() */
1514IEXT AV * Isignalstack; /* temp stack during sighandler() */
1515IEXT SV * Imystrk; /* temp key string for do_each() */
1516IEXT I32 Idumplvl; /* indentation level on syntax tree dump */
79072805
LW
1517IEXT PMOP * Ioldlastpm; /* for saving regexp context during debugger */
1518IEXT I32 Igensym; /* next symbol for getsym() to define */
1519IEXT bool Ipreambled;
3c81428c 1520IEXT AV * Ipreambleav;
79072805
LW
1521IEXT int Ilaststatval IINIT(-1);
1522IEXT I32 Ilaststype IINIT(OP_STAT);
1523
1524#undef IEXT
1525#undef IINIT
1526
8990e307 1527#ifdef MULTIPLICITY
79072805
LW
1528};
1529#else
1530struct interpreter {
1531 char broiled;
1532};
1533#endif
1534
1535#include "pp.h"
1536
1537#ifdef __cplusplus
1538extern "C" {
1539#endif
1540
1541#include "proto.h"
1542
a0d0e21e
LW
1543#ifdef EMBED
1544#define Perl_sv_setptrobj(rv,ptr,name) Perl_sv_setref_iv(rv,name,(IV)ptr)
1545#define Perl_sv_setptrref(rv,ptr) Perl_sv_setref_iv(rv,Nullch,(IV)ptr)
1546#else
1547#define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,(IV)ptr)
1548#define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,(IV)ptr)
1549#endif
1550
79072805
LW
1551#ifdef __cplusplus
1552};
1553#endif
1554
93a17b20 1555/* The following must follow proto.h */
79072805
LW
1556
1557#ifdef DOINIT
4633a7c4 1558EXT MGVTBL vtbl_sv = {magic_get,
463ee0b2
LW
1559 magic_set,
1560 magic_len,
1561 0, 0};
4633a7c4
LW
1562EXT MGVTBL vtbl_env = {0, 0, 0, 0, 0};
1563EXT MGVTBL vtbl_envelem = {0, magic_setenv,
85e6fe83
LW
1564 0, magic_clearenv,
1565 0};
4633a7c4 1566EXT MGVTBL vtbl_sig = {0, 0, 0, 0, 0};
0c30d9ec
PP
1567EXT MGVTBL vtbl_sigelem = {magic_getsig,
1568 magic_setsig,
1569 0, magic_clearsig,
1570 0};
4633a7c4 1571EXT MGVTBL vtbl_pack = {0, 0, 0, magic_wipepack,
a0d0e21e 1572 0};
4633a7c4 1573EXT MGVTBL vtbl_packelem = {magic_getpack,
463ee0b2
LW
1574 magic_setpack,
1575 0, magic_clearpack,
1576 0};
4633a7c4 1577EXT MGVTBL vtbl_dbline = {0, magic_setdbline,
463ee0b2 1578 0, 0, 0};
4633a7c4 1579EXT MGVTBL vtbl_isa = {0, magic_setisa,
463ee0b2 1580 0, 0, 0};
4633a7c4 1581EXT MGVTBL vtbl_isaelem = {0, magic_setisa,
463ee0b2 1582 0, 0, 0};
4633a7c4 1583EXT MGVTBL vtbl_arylen = {magic_getarylen,
463ee0b2
LW
1584 magic_setarylen,
1585 0, 0, 0};
4633a7c4 1586EXT MGVTBL vtbl_glob = {magic_getglob,
463ee0b2
LW
1587 magic_setglob,
1588 0, 0, 0};
4633a7c4 1589EXT MGVTBL vtbl_mglob = {0, magic_setmglob,
463ee0b2 1590 0, 0, 0};
4633a7c4 1591EXT MGVTBL vtbl_taint = {magic_gettaint,magic_settaint,
463ee0b2 1592 0, 0, 0};
4633a7c4 1593EXT MGVTBL vtbl_substr = {0, magic_setsubstr,
463ee0b2 1594 0, 0, 0};
4633a7c4 1595EXT MGVTBL vtbl_vec = {0, magic_setvec,
463ee0b2 1596 0, 0, 0};
4633a7c4 1597EXT MGVTBL vtbl_pos = {magic_getpos,
a0d0e21e
LW
1598 magic_setpos,
1599 0, 0, 0};
4633a7c4 1600EXT MGVTBL vtbl_bm = {0, magic_setbm,
463ee0b2 1601 0, 0, 0};
4633a7c4 1602EXT MGVTBL vtbl_uvar = {magic_getuvar,
463ee0b2
LW
1603 magic_setuvar,
1604 0, 0, 0};
a0d0e21e
LW
1605
1606#ifdef OVERLOAD
4633a7c4 1607EXT MGVTBL vtbl_amagic = {0, magic_setamagic,
748a9306 1608 0, 0, magic_setamagic};
4633a7c4 1609EXT MGVTBL vtbl_amagicelem = {0, magic_setamagic,
748a9306 1610 0, 0, magic_setamagic};
a0d0e21e
LW
1611#endif /* OVERLOAD */
1612
79072805
LW
1613#else
1614EXT MGVTBL vtbl_sv;
1615EXT MGVTBL vtbl_env;
1616EXT MGVTBL vtbl_envelem;
1617EXT MGVTBL vtbl_sig;
1618EXT MGVTBL vtbl_sigelem;
463ee0b2
LW
1619EXT MGVTBL vtbl_pack;
1620EXT MGVTBL vtbl_packelem;
79072805 1621EXT MGVTBL vtbl_dbline;
463ee0b2
LW
1622EXT MGVTBL vtbl_isa;
1623EXT MGVTBL vtbl_isaelem;
79072805
LW
1624EXT MGVTBL vtbl_arylen;
1625EXT MGVTBL vtbl_glob;
93a17b20 1626EXT MGVTBL vtbl_mglob;
463ee0b2 1627EXT MGVTBL vtbl_taint;
79072805
LW
1628EXT MGVTBL vtbl_substr;
1629EXT MGVTBL vtbl_vec;
a0d0e21e 1630EXT MGVTBL vtbl_pos;
79072805
LW
1631EXT MGVTBL vtbl_bm;
1632EXT MGVTBL vtbl_uvar;
a0d0e21e
LW
1633
1634#ifdef OVERLOAD
1635EXT MGVTBL vtbl_amagic;
1636EXT MGVTBL vtbl_amagicelem;
1637#endif /* OVERLOAD */
1638
79072805 1639#endif
85e6fe83 1640
a0d0e21e
LW
1641#ifdef OVERLOAD
1642EXT long amagic_generation;
1643
748a9306 1644#define NofAMmeth 29
a0d0e21e
LW
1645#ifdef DOINIT
1646EXT char * AMG_names[NofAMmeth][2] = {
1647 {"fallback","abs"},
1648 {"bool", "nomethod"},
1649 {"\"\"", "0+"},
1650 {"+","+="},
1651 {"-","-="},
1652 {"*", "*="},
1653 {"/", "/="},
1654 {"%", "%="},
1655 {"**", "**="},
1656 {"<<", "<<="},
1657 {">>", ">>="},
748a9306
LW
1658 {"&", "&="},
1659 {"|", "|="},
1660 {"^", "^="},
a0d0e21e
LW
1661 {"<", "<="},
1662 {">", ">="},
1663 {"==", "!="},
1664 {"<=>", "cmp"},
1665 {"lt", "le"},
1666 {"gt", "ge"},
1667 {"eq", "ne"},
a0d0e21e
LW
1668 {"!", "~"},
1669 {"++", "--"},
1670 {"atan2", "cos"},
1671 {"sin", "exp"},
1672 {"log", "sqrt"},
1673 {"x","x="},
748a9306
LW
1674 {".",".="},
1675 {"=","neg"}
a0d0e21e
LW
1676};
1677#else
1678EXT char * AMG_names[NofAMmeth][2];
1679#endif /* def INITAMAGIC */
1680
1681struct am_table {
1682 long was_ok_sub;
1683 long was_ok_am;
1684 CV* table[NofAMmeth*2];
1685 long fallback;
1686};
1687typedef struct am_table AMT;
1688
1689#define AMGfallNEVER 1
1690#define AMGfallNO 2
1691#define AMGfallYES 3
1692
1693enum {
1694 fallback_amg, abs_amg,
1695 bool__amg, nomethod_amg,
1696 string_amg, numer_amg,
1697 add_amg, add_ass_amg,
1698 subtr_amg, subtr_ass_amg,
1699 mult_amg, mult_ass_amg,
1700 div_amg, div_ass_amg,
1701 mod_amg, mod_ass_amg,
1702 pow_amg, pow_ass_amg,
1703 lshift_amg, lshift_ass_amg,
1704 rshift_amg, rshift_ass_amg,
748a9306
LW
1705 band_amg, band_ass_amg,
1706 bor_amg, bor_ass_amg,
1707 bxor_amg, bxor_ass_amg,
a0d0e21e
LW
1708 lt_amg, le_amg,
1709 gt_amg, ge_amg,
1710 eq_amg, ne_amg,
1711 ncmp_amg, scmp_amg,
1712 slt_amg, sle_amg,
1713 sgt_amg, sge_amg,
1714 seq_amg, sne_amg,
a0d0e21e
LW
1715 not_amg, compl_amg,
1716 inc_amg, dec_amg,
1717 atan2_amg, cos_amg,
1718 sin_amg, exp_amg,
1719 log_amg, sqrt_amg,
1720 repeat_amg, repeat_ass_amg,
748a9306
LW
1721 concat_amg, concat_ass_amg,
1722 copy_amg, neg_amg
a0d0e21e
LW
1723};
1724#endif /* OVERLOAD */
1725
760ac839
LW
1726#if !defined(PERLIO_IS_STDIO) && defined(HAS_ATTRIBUTE)
1727/*
1728 * Now we have __attribute__ out of the way
1729 * Remap printf
1730 */
1731#define printf PerlIO_stdoutf
1732#endif
1733
85e6fe83 1734#endif /* Include guard */