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