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