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