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