This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Remove global macro "self". Change thr->Tself to thr->self.
[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
79072805
LW
1341/****************/
1342/* Truly global */
1343/****************/
1344
1345/* global state */
a0d0e21e 1346EXT PerlInterpreter * curinterp; /* currently running interpreter */
11343788 1347#ifdef USE_THREADS
0f15f207 1348EXT perl_key thr_key; /* For per-thread struct thread ptr */
12ca11f6
MB
1349EXT perl_mutex sv_mutex; /* Mutex for allocating SVs in sv.c */
1350EXT perl_mutex malloc_mutex; /* Mutex for malloc */
1351EXT perl_mutex eval_mutex; /* Mutex for doeval */
1352EXT perl_cond eval_cond; /* Condition variable for doeval */
11343788
MB
1353EXT struct thread * eval_owner; /* Owner thread for doeval */
1354EXT int nthreads; /* Number of threads currently */
33f46ff6 1355EXT perl_mutex threads_mutex; /* Mutex for nthreads and thread list */
12ca11f6 1356EXT perl_cond nthreads_cond; /* Condition variable for nthreads */
0f15f207
MB
1357#ifdef FAKE_THREADS
1358EXT struct thread * thr; /* Currently executing (fake) thread */
1359#endif
11343788
MB
1360#endif /* USE_THREADS */
1361
0c30d9ec 1362/* VMS doesn't use environ array and NeXT has problems with crt0.o globals */
1363#if !defined(VMS) && !(defined(NeXT) && defined(__DYNAMIC__))
68dc0745 1364#ifndef DONT_DECLARE_STD
79072805 1365extern char ** environ; /* environment variables supplied via exec */
a0d0e21e 1366#endif
0c30d9ec 1367#else
1368# if defined(NeXT) && defined(__DYNAMIC__)
1369
1370# include <mach-o/dyld.h>
1371EXT char *** environ_pointer;
1372# define environ (*environ_pointer)
1373# endif
1374#endif /* environ processing */
1375
79072805
LW
1376EXT int uid; /* current real user id */
1377EXT int euid; /* current effective user id */
1378EXT int gid; /* current real group id */
1379EXT int egid; /* current effective group id */
1380EXT bool nomemok; /* let malloc context handle nomem */
1381EXT U32 an; /* malloc sequence number */
463ee0b2 1382EXT U32 cop_seqmax; /* statement sequence number */
c07a80fd 1383EXT U16 op_seqmax; /* op sequence number */
8990e307 1384EXT U32 evalseq; /* eval sequence number */
463ee0b2 1385EXT U32 sub_generation; /* inc to force methods to be looked up again */
79072805
LW
1386EXT char ** origenviron;
1387EXT U32 origalen;
44a8e56a 1388EXT HV * pidstatus; /* pid-to-status mappings for waitpid */
a0d0e21e 1389EXT U32 * profiledata;
84ea024a 1390EXT int maxo INIT(MAXO);/* Number of ops */
728e2803 1391EXT char * osname; /* operating system */
ff68c719 1392EXT char * sh_path INIT(SH_PATH); /* full path of shell */
c23142e2 1393EXT Sighandler_t sighandlerp;
79072805 1394
a0d0e21e
LW
1395EXT XPV* xiv_arenaroot; /* list of allocated xiv areas */
1396EXT IV ** xiv_root; /* free xiv list--shared by interpreters */
8990e307
LW
1397EXT double * xnv_root; /* free xnv list--shared by interpreters */
1398EXT XRV * xrv_root; /* free xrv list--shared by interpreters */
1399EXT XPV * xpv_root; /* free xpv list--shared by interpreters */
4633a7c4 1400EXT HE * he_root; /* free he list--shared by interpreters */
c07a80fd 1401EXT char * nice_chunk; /* a nice chunk of memory to reuse */
1402EXT U32 nice_chunk_size;/* how nice the chunk of memory is */
8990e307 1403
79072805
LW
1404/* Stack for currently executing thread--context switch must handle this. */
1405EXT SV ** stack_base; /* stack->array_ary */
1406EXT SV ** stack_sp; /* stack pointer now */
1407EXT SV ** stack_max; /* stack->array_ary + stack->array_max */
1408
1409/* likewise for these */
1410
462e5cf6
MB
1411#ifdef OP_IN_REGISTER
1412EXT OP * opsave; /* save current op register across longjmps */
1413#else
1414EXT OP * op; /* current op--when not in a global register */
1415#endif
2ddcc7aa 1416EXT int (*runops) _((void)) INIT(RUNOPS_DEFAULT);
79072805
LW
1417EXT I32 * scopestack; /* blocks we've entered */
1418EXT I32 scopestack_ix;
1419EXT I32 scopestack_max;
1420
1421EXT ANY* savestack; /* to save non-local values on */
1422EXT I32 savestack_ix;
1423EXT I32 savestack_max;
1424
1425EXT OP ** retstack; /* returns we've pushed */
1426EXT I32 retstack_ix;
1427EXT I32 retstack_max;
1428
1429EXT I32 * markstack; /* stackmarks we're remembering */
1430EXT I32 * markstack_ptr; /* stackmarks we're remembering */
1431EXT I32 * markstack_max; /* stackmarks we're remembering */
1432
1433EXT SV ** curpad;
1434
1435/* temp space */
1436EXT SV * Sv;
1437EXT XPV * Xpv;
79072805
LW
1438EXT char tokenbuf[256];
1439EXT struct stat statbuf;
ecfc5424 1440#ifdef HAS_TIMES
79072805
LW
1441EXT struct tms timesbuf;
1442#endif
463ee0b2 1443EXT STRLEN na; /* for use in SvPV when length is Not Applicable */
79072805
LW
1444
1445/* for tmp use in stupid debuggers */
1446EXT int * di;
1447EXT short * ds;
1448EXT char * dc;
1449
1450/* handy constants */
71be2cbc 1451EXTCONST char * Yes INIT("1");
1452EXTCONST char * No INIT("");
1453EXTCONST char * hexdigit INIT("0123456789abcdef0123456789ABCDEFx");
1454EXTCONST char * patleave INIT("\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}");
1455EXTCONST char * vert INIT("|");
79072805 1456
3e3baf6d 1457EXTCONST char warn_uninit[]
a0d0e21e 1458 INIT("Use of uninitialized value");
3e3baf6d 1459EXTCONST char warn_nosemi[]
463ee0b2 1460 INIT("Semicolon seems to be missing");
3e3baf6d 1461EXTCONST char warn_reserved[]
463ee0b2 1462 INIT("Unquoted string \"%s\" may clash with future reserved word");
3e3baf6d 1463EXTCONST char warn_nl[]
93a17b20 1464 INIT("Unsuccessful %s on filename containing newline");
3e3baf6d 1465EXTCONST char no_wrongref[]
a0d0e21e 1466 INIT("Can't use %s ref as %s ref");
3e3baf6d 1467EXTCONST char no_symref[]
748a9306 1468 INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
3e3baf6d 1469EXTCONST char no_usym[]
8990e307 1470 INIT("Can't use an undefined value as %s reference");
3e3baf6d 1471EXTCONST char no_aelem[]
93a17b20 1472 INIT("Modification of non-creatable array value attempted, subscript %d");
3e3baf6d 1473EXTCONST char no_helem[]
93a17b20 1474 INIT("Modification of non-creatable hash value attempted, subscript \"%s\"");
3e3baf6d 1475EXTCONST char no_modify[]
93a17b20 1476 INIT("Modification of a read-only value attempted");
3e3baf6d 1477EXTCONST char no_mem[]
93a17b20 1478 INIT("Out of memory!\n");
3e3baf6d 1479EXTCONST char no_security[]
463ee0b2 1480 INIT("Insecure dependency in %s%s");
3e3baf6d 1481EXTCONST char no_sock_func[]
93a17b20 1482 INIT("Unsupported socket function \"%s\" called");
3e3baf6d 1483EXTCONST char no_dir_func[]
93a17b20 1484 INIT("Unsupported directory function \"%s\" called");
3e3baf6d 1485EXTCONST char no_func[]
93a17b20 1486 INIT("The %s function is unimplemented");
3e3baf6d 1487EXTCONST char no_myglob[]
748a9306 1488 INIT("\"my\" variable %s can't be in a package");
93a17b20 1489
79072805
LW
1490EXT SV sv_undef;
1491EXT SV sv_no;
1492EXT SV sv_yes;
1493#ifdef CSH
1494 EXT char * cshname INIT(CSH);
1495 EXT I32 cshlen;
1496#endif
1497
1498#ifdef DOINIT
8e07c86e
AD
1499EXT char *sig_name[] = { SIG_NAME };
1500EXT int sig_num[] = { SIG_NUM };
0c30d9ec 1501EXT SV * psig_ptr[sizeof(sig_num)/sizeof(*sig_num)];
1502EXT SV * psig_name[sizeof(sig_num)/sizeof(*sig_num)];
79072805
LW
1503#else
1504EXT char *sig_name[];
8e07c86e 1505EXT int sig_num[];
0c30d9ec 1506EXT SV * psig_ptr[];
1507EXT SV * psig_name[];
79072805
LW
1508#endif
1509
bbce6d69 1510/* fast case folding tables */
1511
79072805 1512#ifdef DOINIT
36477c24 1513EXTCONST unsigned char fold[] = {
79072805
LW
1514 0, 1, 2, 3, 4, 5, 6, 7,
1515 8, 9, 10, 11, 12, 13, 14, 15,
1516 16, 17, 18, 19, 20, 21, 22, 23,
1517 24, 25, 26, 27, 28, 29, 30, 31,
1518 32, 33, 34, 35, 36, 37, 38, 39,
1519 40, 41, 42, 43, 44, 45, 46, 47,
1520 48, 49, 50, 51, 52, 53, 54, 55,
1521 56, 57, 58, 59, 60, 61, 62, 63,
1522 64, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
1523 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
1524 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
1525 'x', 'y', 'z', 91, 92, 93, 94, 95,
1526 96, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
1527 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
1528 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
1529 'X', 'Y', 'Z', 123, 124, 125, 126, 127,
1530 128, 129, 130, 131, 132, 133, 134, 135,
1531 136, 137, 138, 139, 140, 141, 142, 143,
1532 144, 145, 146, 147, 148, 149, 150, 151,
1533 152, 153, 154, 155, 156, 157, 158, 159,
1534 160, 161, 162, 163, 164, 165, 166, 167,
1535 168, 169, 170, 171, 172, 173, 174, 175,
1536 176, 177, 178, 179, 180, 181, 182, 183,
1537 184, 185, 186, 187, 188, 189, 190, 191,
1538 192, 193, 194, 195, 196, 197, 198, 199,
1539 200, 201, 202, 203, 204, 205, 206, 207,
1540 208, 209, 210, 211, 212, 213, 214, 215,
1541 216, 217, 218, 219, 220, 221, 222, 223,
1542 224, 225, 226, 227, 228, 229, 230, 231,
1543 232, 233, 234, 235, 236, 237, 238, 239,
1544 240, 241, 242, 243, 244, 245, 246, 247,
1545 248, 249, 250, 251, 252, 253, 254, 255
1546};
1547#else
71be2cbc 1548EXTCONST unsigned char fold[];
79072805
LW
1549#endif
1550
1551#ifdef DOINIT
bbce6d69 1552EXT unsigned char fold_locale[] = {
79072805
LW
1553 0, 1, 2, 3, 4, 5, 6, 7,
1554 8, 9, 10, 11, 12, 13, 14, 15,
1555 16, 17, 18, 19, 20, 21, 22, 23,
1556 24, 25, 26, 27, 28, 29, 30, 31,
1557 32, 33, 34, 35, 36, 37, 38, 39,
1558 40, 41, 42, 43, 44, 45, 46, 47,
1559 48, 49, 50, 51, 52, 53, 54, 55,
1560 56, 57, 58, 59, 60, 61, 62, 63,
1561 64, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
1562 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
1563 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
1564 'x', 'y', 'z', 91, 92, 93, 94, 95,
1565 96, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
1566 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
1567 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
1568 'X', 'Y', 'Z', 123, 124, 125, 126, 127,
1569 128, 129, 130, 131, 132, 133, 134, 135,
1570 136, 137, 138, 139, 140, 141, 142, 143,
1571 144, 145, 146, 147, 148, 149, 150, 151,
1572 152, 153, 154, 155, 156, 157, 158, 159,
1573 160, 161, 162, 163, 164, 165, 166, 167,
1574 168, 169, 170, 171, 172, 173, 174, 175,
1575 176, 177, 178, 179, 180, 181, 182, 183,
1576 184, 185, 186, 187, 188, 189, 190, 191,
1577 192, 193, 194, 195, 196, 197, 198, 199,
1578 200, 201, 202, 203, 204, 205, 206, 207,
1579 208, 209, 210, 211, 212, 213, 214, 215,
1580 216, 217, 218, 219, 220, 221, 222, 223,
1581 224, 225, 226, 227, 228, 229, 230, 231,
1582 232, 233, 234, 235, 236, 237, 238, 239,
1583 240, 241, 242, 243, 244, 245, 246, 247,
1584 248, 249, 250, 251, 252, 253, 254, 255
1585};
1586#else
bbce6d69 1587EXT unsigned char fold_locale[];
79072805
LW
1588#endif
1589
1590#ifdef DOINIT
71be2cbc 1591EXTCONST unsigned char freq[] = { /* letter frequencies for mixed English/C */
79072805
LW
1592 1, 2, 84, 151, 154, 155, 156, 157,
1593 165, 246, 250, 3, 158, 7, 18, 29,
1594 40, 51, 62, 73, 85, 96, 107, 118,
1595 129, 140, 147, 148, 149, 150, 152, 153,
1596 255, 182, 224, 205, 174, 176, 180, 217,
1597 233, 232, 236, 187, 235, 228, 234, 226,
1598 222, 219, 211, 195, 188, 193, 185, 184,
1599 191, 183, 201, 229, 181, 220, 194, 162,
1600 163, 208, 186, 202, 200, 218, 198, 179,
1601 178, 214, 166, 170, 207, 199, 209, 206,
1602 204, 160, 212, 216, 215, 192, 175, 173,
1603 243, 172, 161, 190, 203, 189, 164, 230,
1604 167, 248, 227, 244, 242, 255, 241, 231,
1605 240, 253, 169, 210, 245, 237, 249, 247,
1606 239, 168, 252, 251, 254, 238, 223, 221,
1607 213, 225, 177, 197, 171, 196, 159, 4,
1608 5, 6, 8, 9, 10, 11, 12, 13,
1609 14, 15, 16, 17, 19, 20, 21, 22,
1610 23, 24, 25, 26, 27, 28, 30, 31,
1611 32, 33, 34, 35, 36, 37, 38, 39,
1612 41, 42, 43, 44, 45, 46, 47, 48,
1613 49, 50, 52, 53, 54, 55, 56, 57,
1614 58, 59, 60, 61, 63, 64, 65, 66,
1615 67, 68, 69, 70, 71, 72, 74, 75,
1616 76, 77, 78, 79, 80, 81, 82, 83,
1617 86, 87, 88, 89, 90, 91, 92, 93,
1618 94, 95, 97, 98, 99, 100, 101, 102,
1619 103, 104, 105, 106, 108, 109, 110, 111,
1620 112, 113, 114, 115, 116, 117, 119, 120,
1621 121, 122, 123, 124, 125, 126, 127, 128,
1622 130, 131, 132, 133, 134, 135, 136, 137,
1623 138, 139, 141, 142, 143, 144, 145, 146
1624};
1625#else
71be2cbc 1626EXTCONST unsigned char freq[];
79072805
LW
1627#endif
1628
8990e307
LW
1629#ifdef DEBUGGING
1630#ifdef DOINIT
71be2cbc 1631EXTCONST char* block_type[] = {
8990e307
LW
1632 "NULL",
1633 "SUB",
1634 "EVAL",
1635 "LOOP",
1636 "SUBST",
1637 "BLOCK",
1638};
1639#else
71be2cbc 1640EXTCONST char* block_type[];
8990e307
LW
1641#endif
1642#endif
1643
79072805
LW
1644/*****************************************************************************/
1645/* This lexer/parser stuff is currently global since yacc is hard to reenter */
1646/*****************************************************************************/
8990e307 1647/* XXX This needs to be revisited, since BEGIN makes yacc re-enter... */
79072805 1648
a0d0e21e
LW
1649#include "perly.h"
1650
fb73857a 1651#define LEX_NOTPARSING 11 /* borrowed from toke.c */
1652
79072805
LW
1653typedef enum {
1654 XOPERATOR,
1655 XTERM,
79072805 1656 XREF,
8990e307 1657 XSTATE,
a0d0e21e
LW
1658 XBLOCK,
1659 XTERMBLOCK
79072805
LW
1660} expectation;
1661
a0d0e21e
LW
1662EXT U32 lex_state; /* next token is determined */
1663EXT U32 lex_defer; /* state after determined token */
1664EXT expectation lex_expect; /* expect after determined token */
1665EXT I32 lex_brackets; /* bracket count */
1666EXT I32 lex_formbrack; /* bracket count at outer format level */
1667EXT I32 lex_fakebrack; /* outer bracket is mere delimiter */
1668EXT I32 lex_casemods; /* casemod count */
1669EXT I32 lex_dojoin; /* doing an array interpolation */
1670EXT I32 lex_starts; /* how many interps done on level */
1671EXT SV * lex_stuff; /* runtime pattern from m// or s/// */
1672EXT SV * lex_repl; /* runtime replacement from s/// */
1673EXT OP * lex_op; /* extra info to pass back on op */
1674EXT OP * lex_inpat; /* in pattern $) and $| are special */
1675EXT I32 lex_inwhat; /* what kind of quoting are we in */
1676EXT char * lex_brackstack; /* what kind of brackets to pop */
1677EXT char * lex_casestack; /* what kind of case mods in effect */
1678
1679/* What we know when we're in LEX_KNOWNEXT state. */
1680EXT YYSTYPE nextval[5]; /* value of next token, if any */
1681EXT I32 nexttype[5]; /* type of next token */
1682EXT I32 nexttoke;
1683
760ac839 1684EXT PerlIO * VOL rsfp INIT(Nullfp);
79072805
LW
1685EXT SV * linestr;
1686EXT char * bufptr;
1687EXT char * oldbufptr;
1688EXT char * oldoldbufptr;
1689EXT char * bufend;
8990e307 1690EXT expectation expect INIT(XSTATE); /* how to interpret ambiguous tokens */
16d20bd9 1691EXT AV * rsfp_filters;
79072805
LW
1692
1693EXT I32 multi_start; /* 1st line of multi-line string */
1694EXT I32 multi_end; /* last line of multi-line string */
1695EXT I32 multi_open; /* delimiter of said string */
1696EXT I32 multi_close; /* delimiter of said string */
1697
1698EXT GV * scrgv;
1699EXT I32 error_count; /* how many errors so far, max 10 */
1700EXT I32 subline; /* line this subroutine began on */
1701EXT SV * subname; /* name of current subroutine */
1702
748a9306 1703EXT CV * compcv; /* currently compiling subroutine */
93a17b20 1704EXT AV * comppad; /* storage for lexically scoped temporaries */
8990e307
LW
1705EXT AV * comppad_name; /* variable names for "my" variables */
1706EXT I32 comppad_name_fill;/* last "introduced" variable offset */
0c30d9ec 1707EXT I32 comppad_name_floor;/* start of vars in innermost block */
8990e307
LW
1708EXT I32 min_intro_pending;/* start of vars to introduce */
1709EXT I32 max_intro_pending;/* end of vars to introduce */
79072805 1710EXT I32 padix; /* max used index in current "register" pad */
a0d0e21e 1711EXT I32 padix_floor; /* how low may inner block reset padix */
748a9306 1712EXT I32 pad_reset_pending; /* reset pad on next attempted alloc */
79072805
LW
1713EXT COP compiling;
1714
79072805
LW
1715EXT I32 thisexpr; /* name id for nothing_in_common() */
1716EXT char * last_uni; /* position of last named-unary operator */
1717EXT char * last_lop; /* position of last list operator */
8990e307 1718EXT OPCODE last_lop_op; /* last list operator */
93a17b20 1719EXT bool in_my; /* we're compiling a "my" declaration */
c750a3ec 1720EXT HV * in_my_stash; /* declared class of this "my" declaration */
79072805
LW
1721#ifdef FCRYPT
1722EXT I32 cryptseen; /* has fast crypt() been initialized? */
1723#endif
1724
85e6fe83
LW
1725EXT U32 hints; /* various compilation flags */
1726
1727 /* Note: the lowest 8 bits are reserved for
1728 stuffing into op->op_private */
1729#define HINT_INTEGER 0x00000001
1730#define HINT_STRICT_REFS 0x00000002
1731
1732#define HINT_BLOCK_SCOPE 0x00000100
1733#define HINT_STRICT_SUBS 0x00000200
1734#define HINT_STRICT_VARS 0x00000400
bbce6d69 1735#define HINT_LOCALE 0x00000800
85e6fe83 1736
79072805
LW
1737/**************************************************************************/
1738/* This regexp stuff is global since it always happens within 1 expr eval */
1739/**************************************************************************/
1740
1741EXT char * regprecomp; /* uncompiled string. */
1742EXT char * regparse; /* Input-scan pointer. */
1743EXT char * regxend; /* End of input for compile */
1744EXT I32 regnpar; /* () count. */
1745EXT char * regcode; /* Code-emit pointer; &regdummy = don't. */
1746EXT I32 regsize; /* Code size. */
a0d0e21e 1747EXT I32 regnaughty; /* How bad is this pattern? */
79072805
LW
1748EXT I32 regsawback; /* Did we see \1, ...? */
1749
1750EXT char * reginput; /* String-input pointer. */
79072805
LW
1751EXT char * regbol; /* Beginning of input, for ^ check. */
1752EXT char * regeol; /* End of input, for $ check. */
1753EXT char ** regstartp; /* Pointer to startp array. */
1754EXT char ** regendp; /* Ditto for endp. */
a0d0e21e 1755EXT U32 * reglastparen; /* Similarly for lastparen. */
79072805 1756EXT char * regtill; /* How far we are required to go. */
a0d0e21e
LW
1757EXT U16 regflags; /* are we folding, multilining? */
1758EXT char regprev; /* char before regbol, \n if none */
79072805 1759
760ac839
LW
1760EXT bool do_undump; /* -u or dump seen? */
1761EXT VOL U32 debug;
1762
79072805
LW
1763/***********************************************/
1764/* Global only to current interpreter instance */
1765/***********************************************/
1766
8990e307 1767#ifdef MULTIPLICITY
79072805
LW
1768#define IEXT
1769#define IINIT(x)
1770struct interpreter {
1771#else
1772#define IEXT EXT
1773#define IINIT(x) INIT(x)
1774#endif
1775
1776/* pseudo environmental stuff */
1777IEXT int Iorigargc;
1778IEXT char ** Iorigargv;
1779IEXT GV * Ienvgv;
1780IEXT GV * Isiggv;
1781IEXT GV * Iincgv;
1782IEXT char * Iorigfilename;
748a9306
LW
1783IEXT SV * Idiehook;
1784IEXT SV * Iwarnhook;
1785IEXT SV * Iparsehook;
79072805 1786
c07a80fd 1787/* Various states of an input record separator SV (rs, nrs) */
1788#define RsSNARF(sv) (! SvOK(sv))
1789#define RsSIMPLE(sv) (SvOK(sv) && SvCUR(sv))
1790#define RsPARA(sv) (SvOK(sv) && ! SvCUR(sv))
1791
79072805
LW
1792/* switches */
1793IEXT char * Icddir;
1794IEXT bool Iminus_c;
a5f75d66 1795IEXT char Ipatchlevel[10];
728e2803 1796IEXT char ** Ilocalpatches;
c07a80fd 1797IEXT SV * Inrs;
2304df62 1798IEXT char * Isplitstr IINIT(" ");
79072805
LW
1799IEXT bool Ipreprocess;
1800IEXT bool Iminus_n;
1801IEXT bool Iminus_p;
1802IEXT bool Iminus_l;
1803IEXT bool Iminus_a;
2304df62 1804IEXT bool Iminus_F;
79072805
LW
1805IEXT bool Idoswitches;
1806IEXT bool Idowarn;
1807IEXT bool Idoextract;
79072805
LW
1808IEXT bool Isawampersand; /* must save all match strings */
1809IEXT bool Isawstudy; /* do fbm_instr on all strings */
79072805
LW
1810IEXT bool Isawvec;
1811IEXT bool Iunsafe;
79072805
LW
1812IEXT char * Iinplace;
1813IEXT char * Ie_tmpname;
760ac839 1814IEXT PerlIO * Ie_fp;
79072805 1815IEXT U32 Iperldb;
748a9306 1816 /* This value may be raised by extensions for testing purposes */
8ebc5c01 1817IEXT int Iperl_destruct_level IINIT(0); /* 0=none, 1=full, 2=full with checks */
79072805
LW
1818
1819/* magical thingies */
85e6fe83 1820IEXT Time_t Ibasetime; /* $^T */
79072805
LW
1821IEXT SV * Iformfeed; /* $^L */
1822IEXT char * Ichopset IINIT(" \n-"); /* $: */
c07a80fd 1823IEXT SV * Irs; /* $/ */
79072805 1824IEXT char * Iofs; /* $, */
8990e307 1825IEXT STRLEN Iofslen;
79072805 1826IEXT char * Iors; /* $\ */
8990e307 1827IEXT STRLEN Iorslen;
79072805
LW
1828IEXT char * Iofmt; /* $# */
1829IEXT I32 Imaxsysfd IINIT(MAXSYSFD); /* top fd to pass to subprocesses */
f86702cc 1830IEXT int Imultiline; /* $*--do strings hold >1 line? */
91e9c03f 1831IEXT I32 Istatusvalue; /* $? */
f86702cc 1832#ifdef VMS
ff0cee69 1833IEXT U32 Istatusvalue_vms;
f86702cc 1834#endif
79072805
LW
1835
1836IEXT struct stat Istatcache; /* _ */
1837IEXT GV * Istatgv;
1838IEXT SV * Istatname IINIT(Nullsv);
1839
1840/* shortcuts to various I/O objects */
1841IEXT GV * Istdingv;
1842IEXT GV * Ilast_in_gv;
1843IEXT GV * Idefgv;
1844IEXT GV * Iargvgv;
1845IEXT GV * Idefoutgv;
79072805
LW
1846IEXT GV * Iargvoutgv;
1847
1848/* shortcuts to regexp stuff */
1849IEXT GV * Ileftgv;
1850IEXT GV * Iampergv;
1851IEXT GV * Irightgv;
1852IEXT PMOP * Icurpm; /* what to do \ interps from */
79072805
LW
1853IEXT I32 * Iscreamfirst;
1854IEXT I32 * Iscreamnext;
1855IEXT I32 Imaxscream IINIT(-1);
1856IEXT SV * Ilastscream;
1857
4633a7c4
LW
1858/* shortcuts to misc objects */
1859IEXT GV * Ierrgv;
1860
79072805
LW
1861/* shortcuts to debugging objects */
1862IEXT GV * IDBgv;
1863IEXT GV * IDBline;
1864IEXT GV * IDBsub;
1865IEXT SV * IDBsingle;
1866IEXT SV * IDBtrace;
1867IEXT SV * IDBsignal;
1868IEXT AV * Ilineary; /* lines of script for debugger */
1869IEXT AV * Idbargs; /* args to call listed by caller function */
1870
1871/* symbol tables */
1872IEXT HV * Idefstash; /* main symbol table */
1873IEXT HV * Icurstash; /* symbol table for current package */
1874IEXT HV * Idebstash; /* symbol table for perldb package */
1875IEXT SV * Icurstname; /* name of current package */
93a17b20
LW
1876IEXT AV * Ibeginav; /* names of BEGIN subroutines */
1877IEXT AV * Iendav; /* names of END subroutines */
7d07dbc2 1878IEXT AV * Iinitav; /* names of INIT subroutines */
0c30d9ec 1879IEXT HV * Istrtab; /* shared string table */
79072805
LW
1880
1881/* memory management */
79072805
LW
1882IEXT SV ** Itmps_stack;
1883IEXT I32 Itmps_ix IINIT(-1);
1884IEXT I32 Itmps_floor IINIT(-1);
8990e307
LW
1885IEXT I32 Itmps_max;
1886IEXT I32 Isv_count; /* how many SV* are currently allocated */
a0d0e21e 1887IEXT I32 Isv_objcount; /* how many objects are currently allocated */
8990e307
LW
1888IEXT SV* Isv_root; /* storage for SVs belonging to interp */
1889IEXT SV* Isv_arenaroot; /* list of areas for garbage collection */
79072805
LW
1890
1891/* funky return mechanisms */
1892IEXT I32 Ilastspbase;
1893IEXT I32 Ilastsize;
1894IEXT int Iforkprocess; /* so do_open |- can return proc# */
1895
1896/* subprocess state */
1897IEXT AV * Ifdpid; /* keep fd-to-pid mappings for my_popen */
79072805
LW
1898
1899/* internal state */
463ee0b2
LW
1900IEXT VOL int Iin_eval; /* trap "fatal" errors? */
1901IEXT OP * Irestartop; /* Are we propagating an error from croak? */
79072805 1902IEXT int Idelaymagic; /* ($<,$>) = ... */
2304df62 1903IEXT bool Idirty; /* In the middle of tearing things down? */
748a9306 1904IEXT U8 Ilocalizing; /* are we processing a local() list? */
79072805 1905IEXT bool Itainted; /* using variables controlled by $< */
463ee0b2 1906IEXT bool Itainting; /* doing taint checks */
e50aee73 1907IEXT char * Iop_mask IINIT(NULL); /* masked operations for safe evals */
79072805
LW
1908
1909/* trace state */
1910IEXT I32 Idlevel;
1911IEXT I32 Idlmax IINIT(128);
1912IEXT char * Idebname;
1913IEXT char * Idebdelim;
1914
1915/* current interpreter roots */
748a9306 1916IEXT CV * Imain_cv;
463ee0b2
LW
1917IEXT OP * Imain_root;
1918IEXT OP * Imain_start;
1919IEXT OP * Ieval_root;
1920IEXT OP * Ieval_start;
79072805
LW
1921
1922/* runtime control stuff */
1923IEXT COP * VOL Icurcop IINIT(&compiling);
0c30d9ec 1924IEXT COP * Icurcopdb IINIT(NULL);
79072805
LW
1925IEXT line_t Icopline IINIT(NOLINE);
1926IEXT CONTEXT * Icxstack;
1927IEXT I32 Icxstack_ix IINIT(-1);
1928IEXT I32 Icxstack_max IINIT(128);
54310121 1929IEXT JMPENV Istart_env; /* empty startup sigjmp() environment */
1930IEXT JMPENV * Itop_env; /* ptr. to current sigjmp() environment */
a0d0e21e 1931IEXT I32 Irunlevel;
79072805
LW
1932
1933/* stack stuff */
0c30d9ec 1934IEXT AV * Icurstack; /* THE STACK */
79072805 1935IEXT AV * Imainstack; /* the stack when nothing funny is happening */
79072805
LW
1936
1937/* format accumulators */
463ee0b2
LW
1938IEXT SV * Iformtarget;
1939IEXT SV * Ibodytarget;
1940IEXT SV * Itoptarget;
79072805
LW
1941
1942/* statics moved here for shared library purposes */
93a17b20 1943IEXT SV Istrchop; /* return value from chop */
79072805
LW
1944IEXT int Ifilemode; /* so nextargv() can preserve mode */
1945IEXT int Ilastfd; /* what to preserve mode on */
1946IEXT char * Ioldname; /* what to preserve mode on */
1947IEXT char ** IArgv; /* stuff to free from do_aexec, vfork safe */
1948IEXT char * ICmd; /* stuff to free from do_aexec, vfork safe */
1949IEXT OP * Isortcop; /* user defined sort routine */
1950IEXT HV * Isortstash; /* which is in some package or other */
1951IEXT GV * Ifirstgv; /* $a */
1952IEXT GV * Isecondgv; /* $b */
1953IEXT AV * Isortstack; /* temp stack during pp_sort() */
1954IEXT AV * Isignalstack; /* temp stack during sighandler() */
1955IEXT SV * Imystrk; /* temp key string for do_each() */
1956IEXT I32 Idumplvl; /* indentation level on syntax tree dump */
79072805
LW
1957IEXT PMOP * Ioldlastpm; /* for saving regexp context during debugger */
1958IEXT I32 Igensym; /* next symbol for getsym() to define */
1959IEXT bool Ipreambled;
3c81428c 1960IEXT AV * Ipreambleav;
79072805
LW
1961IEXT int Ilaststatval IINIT(-1);
1962IEXT I32 Ilaststype IINIT(OP_STAT);
46fc3d4c 1963IEXT SV * Imess_sv;
79072805 1964
8023c3ce
MB
1965#ifdef USE_THREADS
1966/* threads stuff */
1967IEXT SV * Ithrsv; /* holds struct thread for main thread */
1968#endif /* USE_THREADS */
1969
79072805
LW
1970#undef IEXT
1971#undef IINIT
1972
8990e307 1973#ifdef MULTIPLICITY
79072805
LW
1974};
1975#else
1976struct interpreter {
1977 char broiled;
1978};
1979#endif
1980
11343788 1981#include "thread.h"
79072805
LW
1982#include "pp.h"
1983
1984#ifdef __cplusplus
1985extern "C" {
1986#endif
1987
1988#include "proto.h"
1989
a0d0e21e
LW
1990#ifdef EMBED
1991#define Perl_sv_setptrobj(rv,ptr,name) Perl_sv_setref_iv(rv,name,(IV)ptr)
1992#define Perl_sv_setptrref(rv,ptr) Perl_sv_setref_iv(rv,Nullch,(IV)ptr)
1993#else
1994#define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,(IV)ptr)
1995#define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,(IV)ptr)
1996#endif
1997
79072805
LW
1998#ifdef __cplusplus
1999};
2000#endif
2001
93a17b20 2002/* The following must follow proto.h */
79072805
LW
2003
2004#ifdef DOINIT
bbce6d69 2005
4633a7c4 2006EXT MGVTBL vtbl_sv = {magic_get,
463ee0b2
LW
2007 magic_set,
2008 magic_len,
2009 0, 0};
fb73857a 2010EXT MGVTBL vtbl_env = {0, magic_set_all_env,
2011 0, magic_clear_all_env,
66b1d557 2012 0};
4633a7c4 2013EXT MGVTBL vtbl_envelem = {0, magic_setenv,
85e6fe83
LW
2014 0, magic_clearenv,
2015 0};
4633a7c4 2016EXT MGVTBL vtbl_sig = {0, 0, 0, 0, 0};
0c30d9ec 2017EXT MGVTBL vtbl_sigelem = {magic_getsig,
2018 magic_setsig,
2019 0, magic_clearsig,
2020 0};
4633a7c4 2021EXT MGVTBL vtbl_pack = {0, 0, 0, magic_wipepack,
a0d0e21e 2022 0};
4633a7c4 2023EXT MGVTBL vtbl_packelem = {magic_getpack,
463ee0b2
LW
2024 magic_setpack,
2025 0, magic_clearpack,
2026 0};
4633a7c4 2027EXT MGVTBL vtbl_dbline = {0, magic_setdbline,
463ee0b2 2028 0, 0, 0};
4633a7c4 2029EXT MGVTBL vtbl_isa = {0, magic_setisa,
fb73857a 2030 0, magic_setisa,
2031 0};
4633a7c4 2032EXT MGVTBL vtbl_isaelem = {0, magic_setisa,
463ee0b2 2033 0, 0, 0};
4633a7c4 2034EXT MGVTBL vtbl_arylen = {magic_getarylen,
463ee0b2
LW
2035 magic_setarylen,
2036 0, 0, 0};
4633a7c4 2037EXT MGVTBL vtbl_glob = {magic_getglob,
463ee0b2
LW
2038 magic_setglob,
2039 0, 0, 0};
4633a7c4 2040EXT MGVTBL vtbl_mglob = {0, magic_setmglob,
463ee0b2 2041 0, 0, 0};
99abf803 2042EXT MGVTBL vtbl_nkeys = {0, magic_setnkeys,
2043 0, 0, 0};
4633a7c4 2044EXT MGVTBL vtbl_taint = {magic_gettaint,magic_settaint,
463ee0b2 2045 0, 0, 0};
4633a7c4 2046EXT MGVTBL vtbl_substr = {0, magic_setsubstr,
463ee0b2 2047 0, 0, 0};
4633a7c4 2048EXT MGVTBL vtbl_vec = {0, magic_setvec,
463ee0b2 2049 0, 0, 0};
4633a7c4 2050EXT MGVTBL vtbl_pos = {magic_getpos,
a0d0e21e
LW
2051 magic_setpos,
2052 0, 0, 0};
4633a7c4 2053EXT MGVTBL vtbl_bm = {0, magic_setbm,
463ee0b2 2054 0, 0, 0};
55497cff 2055EXT MGVTBL vtbl_fm = {0, magic_setfm,
2056 0, 0, 0};
4633a7c4 2057EXT MGVTBL vtbl_uvar = {magic_getuvar,
463ee0b2
LW
2058 magic_setuvar,
2059 0, 0, 0};
f93b4edd
MB
2060#ifdef USE_THREADS
2061EXT MGVTBL vtbl_mutex = {0, 0, 0, 0, magic_mutexfree};
2062#endif /* USE_THREADS */
68dc0745 2063EXT MGVTBL vtbl_defelem = {magic_getdefelem,magic_setdefelem,
2064 0, 0, magic_freedefelem};
a0d0e21e 2065
36477c24 2066#ifdef USE_LOCALE_COLLATE
bbce6d69 2067EXT MGVTBL vtbl_collxfrm = {0,
2068 magic_setcollxfrm,
2069 0, 0, 0};
2070#endif
a0d0e21e
LW
2071
2072#ifdef OVERLOAD
4633a7c4 2073EXT MGVTBL vtbl_amagic = {0, magic_setamagic,
748a9306 2074 0, 0, magic_setamagic};
4633a7c4 2075EXT MGVTBL vtbl_amagicelem = {0, magic_setamagic,
748a9306 2076 0, 0, magic_setamagic};
a0d0e21e
LW
2077#endif /* OVERLOAD */
2078
bbce6d69 2079#else /* !DOINIT */
2080
79072805
LW
2081EXT MGVTBL vtbl_sv;
2082EXT MGVTBL vtbl_env;
2083EXT MGVTBL vtbl_envelem;
2084EXT MGVTBL vtbl_sig;
2085EXT MGVTBL vtbl_sigelem;
463ee0b2
LW
2086EXT MGVTBL vtbl_pack;
2087EXT MGVTBL vtbl_packelem;
79072805 2088EXT MGVTBL vtbl_dbline;
463ee0b2
LW
2089EXT MGVTBL vtbl_isa;
2090EXT MGVTBL vtbl_isaelem;
79072805
LW
2091EXT MGVTBL vtbl_arylen;
2092EXT MGVTBL vtbl_glob;
93a17b20 2093EXT MGVTBL vtbl_mglob;
99abf803 2094EXT MGVTBL vtbl_nkeys;
463ee0b2 2095EXT MGVTBL vtbl_taint;
79072805
LW
2096EXT MGVTBL vtbl_substr;
2097EXT MGVTBL vtbl_vec;
a0d0e21e 2098EXT MGVTBL vtbl_pos;
79072805 2099EXT MGVTBL vtbl_bm;
55497cff 2100EXT MGVTBL vtbl_fm;
79072805 2101EXT MGVTBL vtbl_uvar;
a0d0e21e 2102
f93b4edd
MB
2103#ifdef USE_THREADS
2104EXT MGVTBL vtbl_mutex;
2105#endif /* USE_THREADS */
2106
68dc0745 2107EXT MGVTBL vtbl_defelem;
a0d0e21e 2108
36477c24 2109#ifdef USE_LOCALE_COLLATE
bbce6d69 2110EXT MGVTBL vtbl_collxfrm;
2111#endif
a0d0e21e
LW
2112
2113#ifdef OVERLOAD
2114EXT MGVTBL vtbl_amagic;
2115EXT MGVTBL vtbl_amagicelem;
2116#endif /* OVERLOAD */
2117
bbce6d69 2118#endif /* !DOINIT */
85e6fe83 2119
a0d0e21e 2120#ifdef OVERLOAD
c0315cdf 2121
a0d0e21e
LW
2122EXT long amagic_generation;
2123
a6006777 2124#define NofAMmeth 58
a0d0e21e 2125#ifdef DOINIT
a6006777 2126EXTCONST char * AMG_names[NofAMmeth] = {
2127 "fallback", "abs", /* "fallback" should be the first. */
2128 "bool", "nomethod",
2129 "\"\"", "0+",
2130 "+", "+=",
2131 "-", "-=",
2132 "*", "*=",
2133 "/", "/=",
2134 "%", "%=",
2135 "**", "**=",
2136 "<<", "<<=",
2137 ">>", ">>=",
2138 "&", "&=",
2139 "|", "|=",
2140 "^", "^=",
2141 "<", "<=",
2142 ">", ">=",
2143 "==", "!=",
2144 "<=>", "cmp",
2145 "lt", "le",
2146 "gt", "ge",
2147 "eq", "ne",
2148 "!", "~",
2149 "++", "--",
2150 "atan2", "cos",
2151 "sin", "exp",
2152 "log", "sqrt",
2153 "x", "x=",
2154 ".", ".=",
2155 "=", "neg"
a0d0e21e
LW
2156};
2157#else
a6006777 2158EXTCONST char * AMG_names[NofAMmeth];
a0d0e21e
LW
2159#endif /* def INITAMAGIC */
2160
a6006777 2161struct am_table {
a0d0e21e
LW
2162 long was_ok_sub;
2163 long was_ok_am;
a6006777 2164 U32 flags;
2165 CV* table[NofAMmeth];
a0d0e21e
LW
2166 long fallback;
2167};
a6006777 2168struct am_table_short {
2169 long was_ok_sub;
2170 long was_ok_am;
2171 U32 flags;
2172};
a0d0e21e 2173typedef struct am_table AMT;
a6006777 2174typedef struct am_table_short AMTS;
a0d0e21e
LW
2175
2176#define AMGfallNEVER 1
2177#define AMGfallNO 2
2178#define AMGfallYES 3
2179
a6006777 2180#define AMTf_AMAGIC 1
2181#define AMT_AMAGIC(amt) ((amt)->flags & AMTf_AMAGIC)
2182#define AMT_AMAGIC_on(amt) ((amt)->flags |= AMTf_AMAGIC)
2183#define AMT_AMAGIC_off(amt) ((amt)->flags &= ~AMTf_AMAGIC)
2184
a0d0e21e
LW
2185enum {
2186 fallback_amg, abs_amg,
2187 bool__amg, nomethod_amg,
2188 string_amg, numer_amg,
2189 add_amg, add_ass_amg,
2190 subtr_amg, subtr_ass_amg,
2191 mult_amg, mult_ass_amg,
2192 div_amg, div_ass_amg,
2193 mod_amg, mod_ass_amg,
2194 pow_amg, pow_ass_amg,
2195 lshift_amg, lshift_ass_amg,
2196 rshift_amg, rshift_ass_amg,
748a9306
LW
2197 band_amg, band_ass_amg,
2198 bor_amg, bor_ass_amg,
2199 bxor_amg, bxor_ass_amg,
a0d0e21e
LW
2200 lt_amg, le_amg,
2201 gt_amg, ge_amg,
2202 eq_amg, ne_amg,
2203 ncmp_amg, scmp_amg,
2204 slt_amg, sle_amg,
2205 sgt_amg, sge_amg,
2206 seq_amg, sne_amg,
a0d0e21e
LW
2207 not_amg, compl_amg,
2208 inc_amg, dec_amg,
2209 atan2_amg, cos_amg,
2210 sin_amg, exp_amg,
2211 log_amg, sqrt_amg,
2212 repeat_amg, repeat_ass_amg,
748a9306
LW
2213 concat_amg, concat_ass_amg,
2214 copy_amg, neg_amg
a0d0e21e 2215};
c0315cdf
JH
2216
2217/*
2218 * some compilers like to redefine cos et alia as faster
2219 * (and less accurate?) versions called F_cos et cetera (Quidquid
2220 * latine dictum sit, altum viditur.) This trick collides with
2221 * the Perl overloading (amg). The following #defines fool both.
2222 */
2223
2224#ifdef _FASTMATH
2225# ifdef atan2
2226# define F_atan2_amg atan2_amg
2227# endif
2228# ifdef cos
2229# define F_cos_amg cos_amg
2230# endif
2231# ifdef exp
2232# define F_exp_amg exp_amg
2233# endif
2234# ifdef log
2235# define F_log_amg log_amg
2236# endif
2237# ifdef pow
2238# define F_pow_amg pow_amg
2239# endif
2240# ifdef sin
2241# define F_sin_amg sin_amg
2242# endif
2243# ifdef sqrt
2244# define F_sqrt_amg sqrt_amg
2245# endif
2246#endif /* _FASTMATH */
2247
a0d0e21e
LW
2248#endif /* OVERLOAD */
2249
84902520
TB
2250#define PERLDB_ALL 0xff
2251#define PERLDBf_SUB 0x01 /* Debug sub enter/exit. */
2252#define PERLDBf_LINE 0x02 /* Keep line #. */
2253#define PERLDBf_NOOPT 0x04 /* Switch off optimizations. */
2254#define PERLDBf_INTER 0x08 /* Preserve more data for
2255 later inspections. */
2256#define PERLDBf_SUBLINE 0x10 /* Keep subr source lines. */
2257#define PERLDBf_SINGLE 0x20 /* Start with single-step on. */
2258
2259#define PERLDB_SUB (perldb && (perldb & PERLDBf_SUB))
2260#define PERLDB_LINE (perldb && (perldb & PERLDBf_LINE))
2261#define PERLDB_NOOPT (perldb && (perldb & PERLDBf_NOOPT))
2262#define PERLDB_INTER (perldb && (perldb & PERLDBf_INTER))
2263#define PERLDB_SUBLINE (perldb && (perldb & PERLDBf_SUBLINE))
2264#define PERLDB_SINGLE (perldb && (perldb & PERLDBf_SINGLE))
2265
36477c24 2266#ifdef USE_LOCALE_COLLATE
bbce6d69 2267EXT U32 collation_ix; /* Collation generation index */
2268EXT char * collation_name; /* Name of current collation */
2269EXT bool collation_standard INIT(TRUE); /* Assume simple collation */
2270EXT Size_t collxfrm_base; /* Basic overhead in *xfrm() */
2271EXT Size_t collxfrm_mult INIT(2); /* Expansion factor in *xfrm() */
36477c24 2272#endif /* USE_LOCALE_COLLATE */
bbce6d69 2273
36477c24 2274#ifdef USE_LOCALE_NUMERIC
bbce6d69 2275
2276EXT char * numeric_name; /* Name of current numeric locale */
2277EXT bool numeric_standard INIT(TRUE); /* Assume simple numerics */
2278EXT bool numeric_local INIT(TRUE); /* Assume local numerics */
2279
36477c24 2280#define SET_NUMERIC_STANDARD() \
2281 STMT_START { \
2282 if (! numeric_standard) \
2283 perl_set_numeric_standard(); \
2284 } STMT_END
2285
2286#define SET_NUMERIC_LOCAL() \
2287 STMT_START { \
2288 if (! numeric_local) \
2289 perl_set_numeric_local(); \
2290 } STMT_END
bbce6d69 2291
36477c24 2292#else /* !USE_LOCALE_NUMERIC */
bbce6d69 2293
36477c24 2294#define SET_NUMERIC_STANDARD() /**/
2295#define SET_NUMERIC_LOCAL() /**/
bbce6d69 2296
36477c24 2297#endif /* !USE_LOCALE_NUMERIC */
a0d0e21e 2298
760ac839
LW
2299#if !defined(PERLIO_IS_STDIO) && defined(HAS_ATTRIBUTE)
2300/*
2301 * Now we have __attribute__ out of the way
2302 * Remap printf
2303 */
2304#define printf PerlIO_stdoutf
2305#endif
2306
fba3b22e
MB
2307/*
2308 * nice_chunk and nice_chunk size need to be set
2309 * and queried under the protection of sv_mutex
2310 */
2311#define offer_nice_chunk(chunk, chunk_size) do { \
2312 MUTEX_LOCK(&sv_mutex); \
2313 if (!nice_chunk) { \
2314 nice_chunk = (char*)(chunk); \
2315 nice_chunk_size = (chunk_size); \
2316 } \
2317 MUTEX_UNLOCK(&sv_mutex); \
2318 } while (0)
2319
85e6fe83 2320#endif /* Include guard */
a6e633de 2321