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