This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate from mainperl.
[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
8d063cd8 11
cea2e8a9
GS
12/*#define PERL_IMPLICIT_CONTEXT*/
13
760ac839
LW
14#ifdef PERL_FOR_X2P
15/*
16 * This file is being used for x2p stuff.
17 * Above symbol is defined via -D in 'x2p/Makefile.SH'
18 * Decouple x2p stuff from some of perls more extreme eccentricities.
19 */
55497cff 20#undef MULTIPLICITY
760ac839
LW
21#undef USE_STDIO
22#define USE_STDIO
23#endif /* PERL_FOR_X2P */
24
76e3520e 25#ifdef PERL_OBJECT
3dfd1da1
GS
26
27/* PERL_OBJECT explained - DickH and DougL @ ActiveState.com
28
29Defining PERL_OBJECT turns on creation of a C++ object that
30contains all writable core perl global variables and functions.
31Stated another way, all necessary global variables and functions
32are members of a big C++ object. This object's class is CPerlObj.
33This allows a Perl Host to have multiple, independent perl
34interpreters in the same process space. This is very important on
35Win32 systems as the overhead of process creation is quite high --
36this could be even higher than the script compile and execute time
37for small scripts.
38
39The perl executable implementation on Win32 is composed of perl.exe
40(the Perl Host) and perlX.dll. (the Perl Core). This allows the
41same Perl Core to easily be embedded in other applications that use
42the perl interpreter.
43
44+-----------+
45| Perl Host |
46+-----------+
47 ^
48 |
49 v
50+-----------+ +-----------+
51| Perl Core |<->| Extension |
52+-----------+ +-----------+ ...
53
54Defining PERL_OBJECT has the following effects:
55
56PERL CORE
571. CPerlObj is defined (this is the PERL_OBJECT)
582. all static functions that needed to access either global
59variables or functions needed are made member functions
603. all writable static variables are made member variables
614. all global variables and functions are defined as:
22c35a8c 62 #define var CPerlObj::PL_var
3dfd1da1 63 #define func CPerlObj::Perl_func
22c35a8c 64 * these are in embed.h
3dfd1da1
GS
65This necessitated renaming some local variables and functions that
66had the same name as a global variable or function. This was
67probably a _good_ thing anyway.
68
69
70EXTENSIONS
711. Access to global variables and perl functions is through a
72pointer to the PERL_OBJECT. This pointer type is CPerlObj*. This is
73made transparent to extension developers by the following macros:
22c35a8c 74 #define var pPerl->PL_var
3dfd1da1 75 #define func pPerl->Perl_func
6de196ee 76 * these are done in objXSUB.h
3dfd1da1
GS
77This requires that the extension be compiled as C++, which means
78that the code must be ANSI C and not K&R C. For K&R extensions,
79please see the C API notes located in Win32/GenCAPI.pl. This script
6de196ee 80creates a perlCAPI.lib that provides a K & R compatible C interface
3dfd1da1
GS
81to the PERL_OBJECT.
822. Local variables and functions cannot have the same name as perl's
83variables or functions since the macros will redefine these. Look for
84this if you get some strange error message and it does not look like
85the code that you had written. This often happens with variables that
86are local to a function.
87
88PERL HOST
891. The perl host is linked with perlX.lib to get perl_alloc. This
90function will return a pointer to CPerlObj (the PERL_OBJECT). It
0f4eea8f
DL
91takes pointers to the various PerlXXX_YYY interfaces (see iperlsys.h
92for more information on this).
3dfd1da1
GS
932. The perl host calls the same functions as normally would be
94called in setting up and running a perl script, except that the
95functions are now member functions of the PERL_OBJECT.
96
97*/
98
99
76e3520e
GS
100class CPerlObj;
101
102#define STATIC
103#define CPERLscope(x) CPerlObj::x
104#define CPERLproto CPerlObj *
e3b8966e 105#define _CPERLproto ,CPERLproto
76e3520e
GS
106#define CPERLarg CPerlObj *pPerl
107#define CPERLarg_ CPERLarg,
e3b8966e 108#define _CPERLarg ,CPERLarg
1d583055
GS
109#define PERL_OBJECT_THIS this
110#define _PERL_OBJECT_THIS ,this
111#define PERL_OBJECT_THIS_ this,
312caa8e 112#define CALL_FPTR(fptr) (this->*fptr)
76e3520e
GS
113
114#else /* !PERL_OBJECT */
115
116#define STATIC static
117#define CPERLscope(x) x
118#define CPERLproto
e3b8966e 119#define _CPERLproto
565764a8 120#define CPERLarg void
76e3520e 121#define CPERLarg_
e3b8966e 122#define _CPERLarg
1d583055
GS
123#define PERL_OBJECT_THIS
124#define _PERL_OBJECT_THIS
125#define PERL_OBJECT_THIS_
312caa8e 126#define CALL_FPTR(fptr) (*fptr)
76e3520e
GS
127
128#endif /* PERL_OBJECT */
129
312caa8e
CS
130#define CALLRUNOPS CALL_FPTR(PL_runops)
131#define CALLREGCOMP CALL_FPTR(PL_regcompp)
132#define CALLREGEXEC CALL_FPTR(PL_regexecp)
133#define CALLPROTECT CALL_FPTR(PL_protect)
134
71be2cbc
PP
135#define VOIDUSED 1
136#include "config.h"
137
cea2e8a9
GS
138/* XXXXXX testing threads via implicit pointer */
139#ifdef USE_THREADS
140#define PERL_IMPLICIT_CONTEXT
22c35a8c 141#endif
71be2cbc 142
326b05e3
GS
143#undef START_EXTERN_C
144#undef END_EXTERN_C
145#undef EXTERN_C
32f822de
GS
146#ifdef __cplusplus
147# define START_EXTERN_C extern "C" {
148# define END_EXTERN_C }
149# define EXTERN_C extern "C"
150#else
151# define START_EXTERN_C
152# define END_EXTERN_C
73c4f7a1 153# define EXTERN_C extern
32f822de
GS
154#endif
155
462e5cf6
MB
156#ifdef OP_IN_REGISTER
157# ifdef __GNUC__
158# define stringify_immed(s) #s
159# define stringify(s) stringify_immed(s)
d1ca3daa 160register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
462e5cf6
MB
161# endif
162#endif
163
728e2803
PP
164/*
165 * STMT_START { statements; } STMT_END;
166 * can be used as a single statement, as in
167 * if (x) STMT_START { ... } STMT_END; else ...
168 *
169 * Trying to select a version that gives no warnings...
170 */
171#if !(defined(STMT_START) && defined(STMT_END))
169d69b2 172# if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(__cplusplus)
728e2803
PP
173# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */
174# define STMT_END )
175# else
176 /* Now which other defined()s do we need here ??? */
177# if (VOIDFLAGS) && (defined(sun) || defined(__sun__))
178# define STMT_START if (1)
179# define STMT_END else (void)0
180# else
181# define STMT_START do
182# define STMT_END while (0)
183# endif
184# endif
185#endif
186
462e5cf6 187#define NOOP (void)0
cea2e8a9 188#define dNOOP extern int Perl___notused
61bb5906 189#define WITH_THR(s) STMT_START { dTHR; s; } STMT_END
ea0efc06 190
55497cff
PP
191/*
192 * SOFT_CAST can be used for args to prototyped functions to retain some
193 * type checking; it only casts if the compiler does not know prototypes.
194 */
195#if defined(CAN_PROTOTYPE) && defined(DEBUGGING_COMPILE)
196#define SOFT_CAST(type)
197#else
198#define SOFT_CAST(type) (type)
199#endif
79072805 200
6ee623d5 201#ifndef BYTEORDER /* Should never happen -- byteorder is in config.h */
79072805
LW
202# define BYTEORDER 0x1234
203#endif
204
205/* Overall memory policy? */
206#ifndef CONSERVATIVE
207# define LIBERAL 1
208#endif
209
8ada0baa
JH
210#if 'A' == 65 && 'I' == 73 && 'J' == 74 && 'Z' == 90
211#define ASCIIish
212#else
213#undef ASCIIish
214#endif
215
79072805
LW
216/*
217 * The following contortions are brought to you on behalf of all the
218 * standards, semi-standards, de facto standards, not-so-de-facto standards
219 * of the world, as well as all the other botches anyone ever thought of.
220 * The basic theory is that if we work hard enough here, the rest of the
221 * code can be a lot prettier. Well, so much for theory. Sorry, Henry...
222 */
ac58e20f 223
ee0007ab 224/* define this once if either system, instead of cluttering up the src */
8736538c 225#if defined(MSDOS) || defined(atarist) || defined(WIN32) || defined(CYGWIN32)
ee0007ab
LW
226#define DOSISH 1
227#endif
228
a0d0e21e 229#if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus)
352d5a3a
LW
230# define STANDARD_C 1
231#endif
232
09b7f37c 233#if defined(__cplusplus) || defined(WIN32) || defined(__sgi) || defined(OS2) || defined(__DGUX)
68dc0745
PP
234# define DONT_DECLARE_STD 1
235#endif
236
352d5a3a 237#if defined(HASVOLATILE) || defined(STANDARD_C)
79072805
LW
238# ifdef __cplusplus
239# define VOL // to temporarily suppress warnings
240# else
241# define VOL volatile
242# endif
663a0e37 243#else
79072805 244# define VOL
663a0e37
LW
245#endif
246
3280af22
NIS
247#define TAINT (PL_tainted = TRUE)
248#define TAINT_NOT (PL_tainted = FALSE)
249#define TAINT_IF(c) if (c) { PL_tainted = TRUE; }
250#define TAINT_ENV() if (PL_tainting) { taint_env(); }
22c35a8c 251#define TAINT_PROPER(s) if (PL_tainting) { taint_proper(Nullch, s); }
a687059c 252
a6e633de
PP
253/* XXX All process group stuff is handled in pp_sys.c. Should these
254 defines move there? If so, I could simplify this a lot. --AD 9/96.
255*/
256/* Process group stuff changed from traditional BSD to POSIX.
257 perlfunc.pod documents the traditional BSD-style syntax, so we'll
258 try to preserve that, if possible.
259*/
260#ifdef HAS_SETPGID
261# define BSD_SETPGRP(pid, pgrp) setpgid((pid), (pgrp))
c07a80fd 262#else
a6e633de
PP
263# if defined(HAS_SETPGRP) && defined(USE_BSD_SETPGRP)
264# define BSD_SETPGRP(pid, pgrp) setpgrp((pid), (pgrp))
265# else
266# ifdef HAS_SETPGRP2 /* DG/UX */
267# define BSD_SETPGRP(pid, pgrp) setpgrp2((pid), (pgrp))
268# endif
269# endif
270#endif
271#if defined(BSD_SETPGRP) && !defined(HAS_SETPGRP)
272# define HAS_SETPGRP /* Well, effectively it does . . . */
273#endif
274
275/* getpgid isn't POSIX, but at least Solaris and Linux have it, and it makes
276 our life easier :-) so we'll try it.
277*/
278#ifdef HAS_GETPGID
279# define BSD_GETPGRP(pid) getpgid((pid))
280#else
281# if defined(HAS_GETPGRP) && defined(USE_BSD_GETPGRP)
282# define BSD_GETPGRP(pid) getpgrp((pid))
283# else
284# ifdef HAS_GETPGRP2 /* DG/UX */
285# define BSD_GETPGRP(pid) getpgrp2((pid))
286# endif
287# endif
288#endif
289#if defined(BSD_GETPGRP) && !defined(HAS_GETPGRP)
290# define HAS_GETPGRP /* Well, effectively it does . . . */
291#endif
292
293/* These are not exact synonyms, since setpgrp() and getpgrp() may
294 have different behaviors, but perl.h used to define USE_BSDPGRP
295 (prior to 5.003_05) so some extension might depend on it.
296*/
297#if defined(USE_BSD_SETPGRP) || defined(USE_BSD_GETPGRP)
298# ifndef USE_BSDPGRP
299# define USE_BSDPGRP
300# endif
663a0e37
LW
301#endif
302
8ac5a1fe
MH
303/* HP-UX 10.X CMA (Common Multithreaded Architecure) insists that
304 pthread.h must be included before all other header files.
305*/
306#if defined(USE_THREADS) && defined(PTHREAD_H_FIRST)
307# include <pthread.h>
308#endif
309
760ac839
LW
310#ifndef _TYPES_ /* If types.h defines this it's easy. */
311# ifndef major /* Does everyone's types.h define this? */
312# include <sys/types.h>
c07a80fd 313# endif
663a0e37
LW
314#endif
315
760ac839
LW
316#ifdef __cplusplus
317# ifndef I_STDARG
318# define I_STDARG 1
319# endif
320#endif
321
322#ifdef I_STDARG
323# include <stdarg.h>
324#else
325# ifdef I_VARARGS
326# include <varargs.h>
327# endif
328#endif
329
4633a7c4 330#ifdef USE_NEXT_CTYPE
0c30d9ec 331
092bebab
JH
332#if NX_CURRENT_COMPILER_RELEASE >= 500
333# include <bsd/ctypes.h>
334#else
335# if NX_CURRENT_COMPILER_RELEASE >= 400
336# include <objc/NXCType.h>
337# else /* NX_CURRENT_COMPILER_RELEASE < 400 */
338# include <appkit/NXCType.h>
339# endif /* NX_CURRENT_COMPILER_RELEASE >= 400 */
340#endif /* NX_CURRENT_COMPILER_RELEASE >= 500 */
0c30d9ec
PP
341
342#else /* !USE_NEXT_CTYPE */
fe14fcc3 343#include <ctype.h>
0c30d9ec 344#endif /* USE_NEXT_CTYPE */
a0d0e21e
LW
345
346#ifdef METHOD /* Defined by OSF/1 v3.0 by ctype.h */
347#undef METHOD
a0d0e21e
LW
348#endif
349
4633a7c4 350#ifdef I_LOCALE
36477c24 351# include <locale.h>
4633a7c4
LW
352#endif
353
36477c24
PP
354#if !defined(NO_LOCALE) && defined(HAS_SETLOCALE)
355# define USE_LOCALE
356# if !defined(NO_LOCALE_COLLATE) && defined(LC_COLLATE) \
357 && defined(HAS_STRXFRM)
358# define USE_LOCALE_COLLATE
359# endif
360# if !defined(NO_LOCALE_CTYPE) && defined(LC_CTYPE)
361# define USE_LOCALE_CTYPE
362# endif
363# if !defined(NO_LOCALE_NUMERIC) && defined(LC_NUMERIC)
364# define USE_LOCALE_NUMERIC
365# endif
366#endif /* !NO_LOCALE && HAS_SETLOCALE */
a0d0e21e 367
fe14fcc3 368#include <setjmp.h>
79072805 369
a0d0e21e 370#ifdef I_SYS_PARAM
79072805
LW
371# ifdef PARAM_NEEDS_TYPES
372# include <sys/types.h>
373# endif
374# include <sys/param.h>
352d5a3a 375#endif
79072805
LW
376
377
378/* Use all the "standard" definitions? */
a0d0e21e 379#if defined(STANDARD_C) && defined(I_STDLIB)
79072805 380# include <stdlib.h>
ff68c719 381#endif
03a14243 382
cea2e8a9
GS
383#if !defined(PERL_FOR_X2P)
384# include "embed.h"
385#endif
386
c31fac66
GS
387#define MEM_SIZE Size_t
388
55497cff
PP
389/* This comes after <stdlib.h> so we don't try to change the standard
390 * library prototypes; we'll use our own in proto.h instead. */
03a14243 391
4633a7c4 392#ifdef MYMALLOC
86058a2d
GS
393# ifdef PERL_POLLUTE_MALLOC
394# define Perl_malloc malloc
395# define Perl_calloc calloc
396# define Perl_realloc realloc
397# define Perl_mfree free
398# else
399# define EMBEDMYMALLOC /* for compatibility */
400# endif
20ce7b12
GS
401Malloc_t Perl_malloc (MEM_SIZE nbytes);
402Malloc_t Perl_calloc (MEM_SIZE elements, MEM_SIZE size);
403Malloc_t Perl_realloc (Malloc_t where, MEM_SIZE nbytes);
86058a2d
GS
404/* 'mfree' rather than 'free', since there is already a 'perl_free'
405 * that causes clashes with case-insensitive linkers */
20ce7b12 406Free_t Perl_mfree (Malloc_t where);
55497cff 407
651b9576
GS
408# define safemalloc Perl_malloc
409# define safecalloc Perl_calloc
410# define saferealloc Perl_realloc
411# define safefree Perl_mfree
f2517201
GS
412#else /* MYMALLOC */
413# define safemalloc safesysmalloc
414# define safecalloc safesyscalloc
415# define saferealloc safesysrealloc
416# define safefree safesysfree
55497cff 417#endif /* MYMALLOC */
4633a7c4 418
ff68c719
PP
419#if defined(STANDARD_C) && defined(I_STDDEF)
420# include <stddef.h>
71be2cbc 421# define STRUCT_OFFSET(s,m) offsetof(s,m)
ff68c719 422#else
71be2cbc 423# define STRUCT_OFFSET(s,m) (Size_t)(&(((s *)0)->m))
ff68c719
PP
424#endif
425
a0d0e21e
LW
426#if defined(I_STRING) || defined(__cplusplus)
427# include <string.h>
428#else
429# include <strings.h>
430#endif
431
432#if !defined(HAS_STRCHR) && defined(HAS_INDEX) && !defined(strchr)
433#define strchr index
434#define strrchr rindex
435#endif
436
16d20bd9
AD
437#ifdef I_MEMORY
438# include <memory.h>
439#endif
440
fe14fcc3 441#ifdef HAS_MEMCPY
85e6fe83 442# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
fe14fcc3 443# ifndef memcpy
20ce7b12 444 extern char * memcpy (char*, char*, int);
ee0007ab
LW
445# endif
446# endif
447#else
448# ifndef memcpy
449# ifdef HAS_BCOPY
450# define memcpy(d,s,l) bcopy(s,d,l)
451# else
452# define memcpy(d,s,l) my_bcopy(s,d,l)
453# endif
454# endif
455#endif /* HAS_MEMCPY */
fe14fcc3 456
ee0007ab 457#ifdef HAS_MEMSET
85e6fe83 458# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
ee0007ab 459# ifndef memset
20ce7b12 460 extern char *memset (char*, int, int);
ee0007ab
LW
461# endif
462# endif
ee0007ab 463#else
fc36a67e 464# define memset(d,c,l) my_memset(d,c,l)
ee0007ab
LW
465#endif /* HAS_MEMSET */
466
85e6fe83 467#if !defined(HAS_MEMMOVE) && !defined(memmove)
2304df62 468# if defined(HAS_BCOPY) && defined(HAS_SAFE_BCOPY)
79072805
LW
469# define memmove(d,s,l) bcopy(s,d,l)
470# else
2304df62 471# if defined(HAS_MEMCPY) && defined(HAS_SAFE_MEMCPY)
79072805 472# define memmove(d,s,l) memcpy(d,s,l)
ee0007ab 473# else
79072805 474# define memmove(d,s,l) my_bcopy(s,d,l)
ee0007ab 475# endif
352d5a3a 476# endif
d9d8d8de 477#endif
ee0007ab 478
36477c24
PP
479#if defined(mips) && defined(ultrix) && !defined(__STDC__)
480# undef HAS_MEMCMP
481#endif
482
483#if defined(HAS_MEMCMP) && defined(HAS_SANE_MEMCMP)
85e6fe83 484# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
ee0007ab 485# ifndef memcmp
20ce7b12 486 extern int memcmp (char*, char*, int);
ee0007ab
LW
487# endif
488# endif
36477c24
PP
489# ifdef BUGGY_MSC
490 # pragma function(memcmp)
491# endif
ee0007ab
LW
492#else
493# ifndef memcmp
ecfc5424 494# define memcmp my_memcmp
352d5a3a 495# endif
36477c24 496#endif /* HAS_MEMCMP && HAS_SANE_MEMCMP */
8d063cd8 497
fc36a67e 498#ifndef memzero
c635e13b
PP
499# ifdef HAS_MEMSET
500# define memzero(d,l) memset(d,0,l)
79072805 501# else
c635e13b
PP
502# ifdef HAS_BZERO
503# define memzero(d,l) bzero(d,l)
79072805 504# else
fc36a67e 505# define memzero(d,l) my_bzero(d,l)
79072805
LW
506# endif
507# endif
d9d8d8de 508#endif
378cc40b 509
0f27ced1
JH
510#ifndef memchr
511# ifndef HAS_MEMCHR
512# define memchr(s,c,n) ninstr((char*)(s), ((char*)(s)) + n, &(c), &(c) + 1)
513# endif
514#endif
515
36477c24
PP
516#ifndef HAS_BCMP
517# ifndef bcmp
518# define bcmp(s1,s2,l) memcmp(s1,s2,l)
79072805 519# endif
36477c24 520#endif /* !HAS_BCMP */
378cc40b 521
ae986130 522#ifdef I_NETINET_IN
79072805 523# include <netinet/in.h>
ae986130
LW
524#endif
525
28e8609d
JH
526#ifdef I_ARPA_INET
527# include <arpa/inet.h>
528#endif
529
84902520
TB
530#if defined(SF_APPEND) && defined(USE_SFIO) && defined(I_SFIO)
531/* <sfio.h> defines SF_APPEND and <sys/stat.h> might define SF_APPEND
532 * (the neo-BSD seem to do this). */
533# undef SF_APPEND
534#endif
535
1aef975c 536#ifdef I_SYS_STAT
84902520 537# include <sys/stat.h>
1aef975c 538#endif
79072805 539
a0d0e21e
LW
540/* The stat macros for Amdahl UTS, Unisoft System V/88 (and derivatives
541 like UTekV) are broken, sometimes giving false positives. Undefine
542 them here and let the code below set them to proper values.
543
544 The ghs macro stands for GreenHills Software C-1.8.5 which
545 is the C compiler for sysV88 and the various derivatives.
546 This header file bug is corrected in gcc-2.5.8 and later versions.
547 --Kaveh Ghazi (ghazi@noc.rutgers.edu) 10/3/94. */
548
549#if defined(uts) || (defined(m88k) && defined(ghs))
79072805
LW
550# undef S_ISDIR
551# undef S_ISCHR
552# undef S_ISBLK
553# undef S_ISREG
554# undef S_ISFIFO
555# undef S_ISLNK
ee0007ab 556#endif
135863df 557
663a0e37
LW
558#ifdef I_TIME
559# include <time.h>
ffed7fef 560#endif
663a0e37 561
fe14fcc3 562#ifdef I_SYS_TIME
85e6fe83 563# ifdef I_SYS_TIME_KERNEL
663a0e37
LW
564# define KERNEL
565# endif
566# include <sys/time.h>
85e6fe83 567# ifdef I_SYS_TIME_KERNEL
663a0e37
LW
568# undef KERNEL
569# endif
a687059c 570#endif
135863df 571
55497cff 572#if defined(HAS_TIMES) && defined(I_SYS_TIMES)
85e6fe83 573# include <sys/times.h>
d9d8d8de 574#endif
8d063cd8 575
fe14fcc3 576#if defined(HAS_STRERROR) && (!defined(HAS_MKDIR) || !defined(HAS_RMDIR))
79072805 577# undef HAS_STRERROR
663a0e37
LW
578#endif
579
580#include <errno.h>
ed6116ce 581#ifdef HAS_SOCKET
85e6fe83 582# ifdef I_NET_ERRNO
ed6116ce
LW
583# include <net/errno.h>
584# endif
585#endif
f86702cc
PP
586
587#ifdef VMS
588# define SETERRNO(errcode,vmserrcode) \
589 STMT_START { \
590 set_errno(errcode); \
591 set_vaxc_errno(vmserrcode); \
592 } STMT_END
748a9306 593#else
aba27d88 594# define SETERRNO(errcode,vmserrcode) (errno = (errcode))
748a9306 595#endif
ed6116ce 596
38a03e6e
MB
597#ifdef USE_THREADS
598# define ERRSV (thr->errsv)
599# define ERRHV (thr->errhv)
940cb80d
MB
600# define DEFSV THREADSV(0)
601# define SAVE_DEFSV save_threadsv(0)
38a03e6e 602#else
3280af22
NIS
603# define ERRSV GvSV(PL_errgv)
604# define ERRHV GvHV(PL_errgv)
605# define DEFSV GvSV(PL_defgv)
606# define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
38a03e6e
MB
607#endif /* USE_THREADS */
608
55497cff 609#ifndef errno
5ff3f7a4
GS
610 extern int errno; /* ANSI allows errno to be an lvalue expr.
611 * For example in multithreaded environments
612 * something like this might happen:
613 * extern int *_errno(void);
614 * #define errno (*_errno()) */
d9d8d8de 615#endif
663a0e37 616
2304df62 617#ifdef HAS_STRERROR
a0d0e21e 618# ifdef VMS
20ce7b12 619 char *strerror (int,...);
a0d0e21e 620# else
68dc0745 621#ifndef DONT_DECLARE_STD
20ce7b12 622 char *strerror (int);
68dc0745 623#endif
a0d0e21e 624# endif
2304df62
AD
625# ifndef Strerror
626# define Strerror strerror
627# endif
628#else
629# ifdef HAS_SYS_ERRLIST
79072805
LW
630 extern int sys_nerr;
631 extern char *sys_errlist[];
2304df62
AD
632# ifndef Strerror
633# define Strerror(e) \
79072805 634 ((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e])
2304df62 635# endif
79072805 636# endif
35c8bce7 637#endif
663a0e37 638
2304df62 639#ifdef I_SYS_IOCTL
79072805
LW
640# ifndef _IOCTL_
641# include <sys/ioctl.h>
642# endif
a687059c
LW
643#endif
644
ee0007ab 645#if defined(mc300) || defined(mc500) || defined(mc700) || defined(mc6000)
79072805
LW
646# ifdef HAS_SOCKETPAIR
647# undef HAS_SOCKETPAIR
648# endif
2304df62
AD
649# ifdef I_NDBM
650# undef I_NDBM
79072805 651# endif
a687059c
LW
652#endif
653
a687059c 654#if INTSIZE == 2
79072805
LW
655# define htoni htons
656# define ntohi ntohs
a687059c 657#else
79072805
LW
658# define htoni htonl
659# define ntohi ntohl
a687059c
LW
660#endif
661
a0d0e21e 662/* Configure already sets Direntry_t */
35c8bce7 663#if defined(I_DIRENT)
663a0e37 664# include <dirent.h>
8f1f23e8
W
665 /* NeXT needs dirent + sys/dir.h */
666# if defined(I_SYS_DIR) && (defined(NeXT) || defined(__NeXT__))
a0d0e21e
LW
667# include <sys/dir.h>
668# endif
ae986130 669#else
fe14fcc3 670# ifdef I_SYS_NDIR
79a0689e 671# include <sys/ndir.h>
663a0e37 672# else
fe14fcc3 673# ifdef I_SYS_DIR
79a0689e
LW
674# ifdef hp9000s500
675# include <ndir.h> /* may be wrong in the future */
676# else
677# include <sys/dir.h>
678# endif
663a0e37
LW
679# endif
680# endif
4633a7c4 681#endif
a687059c 682
352d5a3a
LW
683#ifdef FPUTS_BOTCH
684/* work around botch in SunOS 4.0.1 and 4.0.2 */
685# ifndef fputs
79072805 686# define fputs(sv,fp) fprintf(fp,"%s",sv)
352d5a3a
LW
687# endif
688#endif
689
c623bd54
LW
690/*
691 * The following gobbledygook brought to you on behalf of __STDC__.
692 * (I could just use #ifndef __STDC__, but this is more bulletproof
693 * in the face of half-implementations.)
694 */
695
696#ifndef S_IFMT
697# ifdef _S_IFMT
698# define S_IFMT _S_IFMT
699# else
700# define S_IFMT 0170000
701# endif
702#endif
703
704#ifndef S_ISDIR
705# define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR)
706#endif
707
708#ifndef S_ISCHR
709# define S_ISCHR(m) ((m & S_IFMT) == S_IFCHR)
710#endif
711
712#ifndef S_ISBLK
fe14fcc3
LW
713# ifdef S_IFBLK
714# define S_ISBLK(m) ((m & S_IFMT) == S_IFBLK)
715# else
716# define S_ISBLK(m) (0)
717# endif
c623bd54
LW
718#endif
719
720#ifndef S_ISREG
721# define S_ISREG(m) ((m & S_IFMT) == S_IFREG)
722#endif
723
724#ifndef S_ISFIFO
fe14fcc3
LW
725# ifdef S_IFIFO
726# define S_ISFIFO(m) ((m & S_IFMT) == S_IFIFO)
727# else
728# define S_ISFIFO(m) (0)
729# endif
c623bd54
LW
730#endif
731
732#ifndef S_ISLNK
733# ifdef _S_ISLNK
734# define S_ISLNK(m) _S_ISLNK(m)
735# else
736# ifdef _S_IFLNK
737# define S_ISLNK(m) ((m & S_IFMT) == _S_IFLNK)
738# else
739# ifdef S_IFLNK
740# define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK)
741# else
742# define S_ISLNK(m) (0)
743# endif
744# endif
745# endif
746#endif
747
748#ifndef S_ISSOCK
749# ifdef _S_ISSOCK
750# define S_ISSOCK(m) _S_ISSOCK(m)
751# else
752# ifdef _S_IFSOCK
753# define S_ISSOCK(m) ((m & S_IFMT) == _S_IFSOCK)
754# else
755# ifdef S_IFSOCK
756# define S_ISSOCK(m) ((m & S_IFMT) == S_IFSOCK)
757# else
758# define S_ISSOCK(m) (0)
759# endif
760# endif
761# endif
762#endif
763
764#ifndef S_IRUSR
765# ifdef S_IREAD
766# define S_IRUSR S_IREAD
767# define S_IWUSR S_IWRITE
768# define S_IXUSR S_IEXEC
769# else
770# define S_IRUSR 0400
771# define S_IWUSR 0200
772# define S_IXUSR 0100
773# endif
774# define S_IRGRP (S_IRUSR>>3)
775# define S_IWGRP (S_IWUSR>>3)
776# define S_IXGRP (S_IXUSR>>3)
777# define S_IROTH (S_IRUSR>>6)
778# define S_IWOTH (S_IWUSR>>6)
779# define S_IXOTH (S_IXUSR>>6)
780#endif
781
782#ifndef S_ISUID
783# define S_ISUID 04000
784#endif
785
786#ifndef S_ISGID
787# define S_ISGID 02000
788#endif
789
79072805
LW
790#ifdef ff_next
791# undef ff_next
352d5a3a
LW
792#endif
793
a0d0e21e 794#if defined(cray) || defined(gould) || defined(i860) || defined(pyr)
45d8adaa
LW
795# define SLOPPYDIVIDE
796#endif
797
748a9306
LW
798#ifdef UV
799#undef UV
800#endif
801
5ff3f7a4
GS
802#ifdef I_INTTYPES
803#include <inttypes.h>
804#endif
805
27d4fb96
PP
806/* XXX QUAD stuff is not currently supported on most systems.
807 Specifically, perl internals don't support long long. Among
808 the many problems is that some compilers support long long,
809 but the underlying library functions (such as sprintf) don't.
810 Some things do work (such as quad pack/unpack on convex);
811 also some systems use long long for the fpos_t typedef. That
812 seems to work too.
813
814 The IV type is supposed to be long enough to hold any integral
815 value or a pointer.
816 --Andy Dougherty August 1996
817*/
818
5ff3f7a4
GS
819/* Much more 64-bit probing added. Now we should get Quad_t
820 in most systems: int64_t, long long, long, int, will do.
821
822 Beware of LP32 systems (ILP32, ILP32LL64). Such systems have been
823 used to sizeof(long) == sizeof(foo*). This is a bad assumption
824 because then IV/UV have been 32 bits, too. Which, in turn means
825 that even if the system has quads (e.g. long long), IV cannot be a
826 quad. Introducing a 64-bit IV (because of long long existing)
85ab1d1d 827 will introduce binary incompatibility.
5ff3f7a4
GS
828
829 Summary: a long long system needs to add -DUSE_LONG_LONG to $ccflags
830 to get quads -- and if its pointers are still 32 bits, this will break
831 binary compatibility. Casting an IV (a long long) to a pointer will
832 truncate half of the IV away.
833
834 --jhi September 1998 */
835
836#if INTSIZE == 4 && LONGSIZE == 4 && PTRSIZE == 4
837# define PERL_ILP32
838# if defined(HAS_LONG_LONG) && LONGLONGSIZE == 8
839# define PERL_ILP32LL64
45d8adaa 840# endif
f86702cc
PP
841#endif
842
5ff3f7a4
GS
843#if LONGSIZE == 8 && PTRSIZE == 8
844# define PERL_LP64
845# if INTSIZE == 8
846# define PERL_ILP64
847# endif
848#endif
849
03145268
SH
850#ifndef Quad_t
851# if LONGSIZE == 8
852# define Quad_t long
e862df63 853# define Uquad_t unsigned long
5ff3f7a4 854# define PERL_QUAD_IS_LONG
03145268
SH
855# endif
856#endif
857
858#ifndef Quad_t
859# if INTSIZE == 8
860# define Quad_t int
e862df63 861# define Uquad_t unsigned int
03145268
SH
862# define PERL_QUAD_IS_INT
863# endif
864#endif
865
866#ifndef Quad_t
867# ifdef USE_LONG_LONG /* See above note about LP32. --jhi */
868# if defined(HAS_LONG_LONG) && LONGLONGSIZE == 8
869# define Quad_t long long
e862df63 870# define Uquad_t unsigned long long
03145268 871# define PERL_QUAD_IS_LONG_LONG
5ff3f7a4 872# endif
03145268
SH
873# endif
874#endif
875
876#ifndef Quad_t
877# ifdef HAS_INT64_T
878# define Quad_t int64_t
879# define Uquad_t uint64_t
880# define PERL_QUAD_IS_INT64_T
881# endif
6ee623d5
GS
882#endif
883
f86702cc
PP
884#ifdef Quad_t
885# define HAS_QUAD
03145268 886# ifndef Uquad_t
e862df63
HB
887 /* Note that if your Quad_t is a typedef (not a #define) you *MUST*
888 * have defined by now Uquad_t yourself because 'unsigned type'
889 * is illegal. */
03145268
SH
890# define Uquad_t unsigned Quad_t
891# endif
5ff3f7a4
GS
892#endif
893
03145268
SH
894#if defined(USE_64_BITS) && defined(HAS_QUAD)
895# ifdef PERL_QUAD_IS_LONG /* LP64 */
896 typedef long IV;
897 typedef unsigned long UV;
898# else
899# ifdef PERL_QUAD_IS_INT /* ILP64 */
900 typedef int IV;
901 typedef unsigned int UV;
902# else
903# ifdef PERL_QUAD_IS_LONG_LONG /* LL64 */
904 typedef long long IV;
905 typedef unsigned long long UV;
906# else
907# ifdef PERL_QUAD_IS_INT64_T /* C9X */
908 typedef int64_t IV;
909 typedef uint64_t UV;
910# endif
911# endif
912# endif
913# endif
5ff3f7a4
GS
914# if defined(PERL_QUAD_IS_INT64_T) && defined(INT64_MAX)
915# define IV_MAX INT64_MAX
916# define IV_MIN INT64_MIN
917# define UV_MAX UINT64_MAX
918# define UV_MIN UINT64_MIN
919# else
920# define IV_MAX PERL_QUAD_MAX
921# define IV_MIN PERL_QUAD_MIN
922# define UV_MAX PERL_UQUAD_MAX
923# define UV_MIN PERL_UQUAD_MIN
924# endif
79072805 925#else
03145268
SH
926 typedef long IV;
927 typedef unsigned long UV;
5ff3f7a4
GS
928# if defined(INT32_MAX) && LONGSIZE == 4
929# define IV_MAX INT32_MAX
930# define IV_MIN INT32_MIN
931# define UV_MAX UINT32_MAX
932# define UV_MIN UINT32_MIN
933# else
934# define IV_MAX PERL_LONG_MAX
935# define IV_MIN PERL_LONG_MIN
936# define UV_MAX PERL_ULONG_MAX
937# define UV_MIN PERL_ULONG_MIN
938# endif
79072805
LW
939#endif
940
760ac839
LW
941/* Previously these definitions used hardcoded figures.
942 * It is hoped these formula are more portable, although
943 * no data one way or another is presently known to me.
944 * The "PERL_" names are used because these calculated constants
945 * do not meet the ANSI requirements for LONG_MAX, etc., which
946 * need to be constants acceptable to #if - kja
947 * define PERL_LONG_MAX 2147483647L
948 * define PERL_LONG_MIN (-LONG_MAX - 1)
949 * define PERL ULONG_MAX 4294967295L
950 */
951
952#ifdef I_LIMITS /* Needed for cast_xxx() functions below. */
953# include <limits.h>
954#else
955#ifdef I_VALUES
956# include <values.h>
957#endif
958#endif
959
99abf803
PP
960/*
961 * Try to figure out max and min values for the integral types. THE CORRECT
962 * SOLUTION TO THIS MESS: ADAPT enquire.c FROM GCC INTO CONFIGURE. The
963 * following hacks are used if neither limits.h or values.h provide them:
964 * U<TYPE>_MAX: for types >= int: ~(unsigned TYPE)0
965 * for types < int: (unsigned TYPE)~(unsigned)0
966 * The argument to ~ must be unsigned so that later signed->unsigned
967 * conversion can't modify the value's bit pattern (e.g. -0 -> +0),
968 * and it must not be smaller than int because ~ does integral promotion.
969 * <type>_MAX: (<type>) (U<type>_MAX >> 1)
970 * <type>_MIN: -<type>_MAX - <is_twos_complement_architecture: (3 & -1) == 3>.
971 * The latter is a hack which happens to work on some machines but
972 * does *not* catch any random system, or things like integer types
973 * with NaN if that is possible.
974 *
975 * All of the types are explicitly cast to prevent accidental loss of
976 * numeric range, and in the hope that they will be less likely to confuse
977 * over-eager optimizers.
978 *
979 */
27d4fb96 980
99abf803
PP
981#define PERL_UCHAR_MIN ((unsigned char)0)
982
983#ifdef UCHAR_MAX
984# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
27d4fb96 985#else
99abf803
PP
986# ifdef MAXUCHAR
987# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
27d4fb96 988# else
99abf803 989# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
27d4fb96
PP
990# endif
991#endif
99abf803
PP
992
993/*
994 * CHAR_MIN and CHAR_MAX are not included here, as the (char) type may be
995 * ambiguous. It may be equivalent to (signed char) or (unsigned char)
996 * depending on local options. Until Configure detects this (or at least
997 * detects whether the "signed" keyword is available) the CHAR ranges
998 * will not be included. UCHAR functions normally.
999 * - kja
1000 */
27d4fb96 1001
99abf803
PP
1002#define PERL_USHORT_MIN ((unsigned short)0)
1003
1004#ifdef USHORT_MAX
1005# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
27d4fb96 1006#else
99abf803
PP
1007# ifdef MAXUSHORT
1008# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
27d4fb96 1009# else
ef2f54b0
CB
1010# ifdef USHRT_MAX
1011# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
1012# else
1013# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
1014# endif
27d4fb96
PP
1015# endif
1016#endif
1017
27d4fb96 1018#ifdef SHORT_MAX
99abf803 1019# define PERL_SHORT_MAX ((short)SHORT_MAX)
27d4fb96
PP
1020#else
1021# ifdef MAXSHORT /* Often used in <values.h> */
99abf803 1022# define PERL_SHORT_MAX ((short)MAXSHORT)
27d4fb96 1023# else
ef2f54b0
CB
1024# ifdef SHRT_MAX
1025# define PERL_SHORT_MAX ((short)SHRT_MAX)
1026# else
1027# define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
1028# endif
27d4fb96
PP
1029# endif
1030#endif
1031
1032#ifdef SHORT_MIN
99abf803 1033# define PERL_SHORT_MIN ((short)SHORT_MIN)
27d4fb96
PP
1034#else
1035# ifdef MINSHORT
99abf803 1036# define PERL_SHORT_MIN ((short)MINSHORT)
27d4fb96 1037# else
ef2f54b0
CB
1038# ifdef SHRT_MIN
1039# define PERL_SHORT_MIN ((short)SHRT_MIN)
1040# else
1041# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
1042# endif
27d4fb96
PP
1043# endif
1044#endif
1045
99abf803
PP
1046#ifdef UINT_MAX
1047# define PERL_UINT_MAX ((unsigned int)UINT_MAX)
27d4fb96 1048#else
99abf803
PP
1049# ifdef MAXUINT
1050# define PERL_UINT_MAX ((unsigned int)MAXUINT)
27d4fb96 1051# else
99abf803 1052# define PERL_UINT_MAX (~(unsigned int)0)
27d4fb96
PP
1053# endif
1054#endif
1055
99abf803 1056#define PERL_UINT_MIN ((unsigned int)0)
27d4fb96
PP
1057
1058#ifdef INT_MAX
99abf803 1059# define PERL_INT_MAX ((int)INT_MAX)
27d4fb96
PP
1060#else
1061# ifdef MAXINT /* Often used in <values.h> */
99abf803 1062# define PERL_INT_MAX ((int)MAXINT)
27d4fb96 1063# else
99abf803 1064# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
27d4fb96
PP
1065# endif
1066#endif
1067
1068#ifdef INT_MIN
99abf803 1069# define PERL_INT_MIN ((int)INT_MIN)
27d4fb96
PP
1070#else
1071# ifdef MININT
99abf803 1072# define PERL_INT_MIN ((int)MININT)
27d4fb96
PP
1073# else
1074# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
1075# endif
1076#endif
1077
99abf803
PP
1078#ifdef ULONG_MAX
1079# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
27d4fb96 1080#else
99abf803
PP
1081# ifdef MAXULONG
1082# define PERL_ULONG_MAX ((unsigned long)MAXULONG)
27d4fb96 1083# else
99abf803 1084# define PERL_ULONG_MAX (~(unsigned long)0)
27d4fb96
PP
1085# endif
1086#endif
1087
99abf803 1088#define PERL_ULONG_MIN ((unsigned long)0L)
27d4fb96 1089
760ac839 1090#ifdef LONG_MAX
99abf803 1091# define PERL_LONG_MAX ((long)LONG_MAX)
760ac839
LW
1092#else
1093# ifdef MAXLONG /* Often used in <values.h> */
99abf803 1094# define PERL_LONG_MAX ((long)MAXLONG)
760ac839 1095# else
99abf803 1096# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
760ac839
LW
1097# endif
1098#endif
1099
1100#ifdef LONG_MIN
99abf803 1101# define PERL_LONG_MIN ((long)LONG_MIN)
760ac839
LW
1102#else
1103# ifdef MINLONG
99abf803 1104# define PERL_LONG_MIN ((long)MINLONG)
760ac839 1105# else
27d4fb96 1106# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
760ac839
LW
1107# endif
1108#endif
1109
99abf803
PP
1110#ifdef HAS_QUAD
1111
1112# ifdef UQUAD_MAX
1113# define PERL_UQUAD_MAX ((UV)UQUAD_MAX)
760ac839 1114# else
99abf803 1115# define PERL_UQUAD_MAX (~(UV)0)
760ac839 1116# endif
760ac839 1117
99abf803 1118# define PERL_UQUAD_MIN ((UV)0)
27d4fb96 1119
27d4fb96 1120# ifdef QUAD_MAX
99abf803 1121# define PERL_QUAD_MAX ((IV)QUAD_MAX)
27d4fb96 1122# else
99abf803 1123# define PERL_QUAD_MAX ((IV) (PERL_UQUAD_MAX >> 1))
27d4fb96
PP
1124# endif
1125
1126# ifdef QUAD_MIN
99abf803 1127# define PERL_QUAD_MIN ((IV)QUAD_MIN)
27d4fb96 1128# else
a6e633de 1129# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
27d4fb96
PP
1130# endif
1131
79072805
LW
1132#endif
1133
ee0007ab 1134typedef MEM_SIZE STRLEN;
450a55e4 1135
79072805
LW
1136typedef struct op OP;
1137typedef struct cop COP;
1138typedef struct unop UNOP;
1139typedef struct binop BINOP;
1140typedef struct listop LISTOP;
1141typedef struct logop LOGOP;
1142typedef struct condop CONDOP;
1143typedef struct pmop PMOP;
1144typedef struct svop SVOP;
1145typedef struct gvop GVOP;
1146typedef struct pvop PVOP;
79072805
LW
1147typedef struct loop LOOP;
1148
1149typedef struct Outrec Outrec;
93a17b20 1150typedef struct interpreter PerlInterpreter;
3e3baf6d
TB
1151#ifndef __BORLANDC__
1152typedef struct ff FF; /* XXX not defined anywhere, should go? */
1153#endif
79072805
LW
1154typedef struct sv SV;
1155typedef struct av AV;
1156typedef struct hv HV;
1157typedef struct cv CV;
378cc40b 1158typedef struct regexp REGEXP;
79072805 1159typedef struct gp GP;
0c30d9ec 1160typedef struct gv GV;
8990e307 1161typedef struct io IO;
c09156bb 1162typedef struct context PERL_CONTEXT;
79072805
LW
1163typedef struct block BLOCK;
1164
1165typedef struct magic MAGIC;
ed6116ce 1166typedef struct xrv XRV;
79072805
LW
1167typedef struct xpv XPV;
1168typedef struct xpviv XPVIV;
ff68c719 1169typedef struct xpvuv XPVUV;
79072805
LW
1170typedef struct xpvnv XPVNV;
1171typedef struct xpvmg XPVMG;
1172typedef struct xpvlv XPVLV;
1173typedef struct xpvav XPVAV;
1174typedef struct xpvhv XPVHV;
1175typedef struct xpvgv XPVGV;
1176typedef struct xpvcv XPVCV;
1177typedef struct xpvbm XPVBM;
1178typedef struct xpvfm XPVFM;
8990e307 1179typedef struct xpvio XPVIO;
79072805
LW
1180typedef struct mgvtbl MGVTBL;
1181typedef union any ANY;
8d063cd8 1182
378cc40b 1183#include "handy.h"
a0d0e21e 1184
03145268
SH
1185/* Some day when we have more 64-bit experience under our belts we may
1186 * be able to merge some of the USE_64_BIT_{FILES,OFFSETS,STDIO,DBM}. At
1187 * the moment (Oct 1998), though, keep them separate. --jhi
1188 */
5ff3f7a4
GS
1189#ifdef USE_64_BITS
1190# ifdef USE_64_BIT_FILES
03145268
SH
1191# ifndef USE_64_BIT_OFFSETS
1192# define USE_64_BIT_OFFSETS
5ff3f7a4
GS
1193# endif
1194# ifndef USE_64_BIT_STDIO
1195# define USE_64_BIT_STDIO
1196# endif
1197# ifndef USE_64_BIT_DBM
1198# define USE_64_BIT_DBM
1199# endif
1200# endif
03145268
SH
1201/* Mention LSEEKSIZE here to get it included in %Config. */
1202# ifdef USE_64_BIT_OFFSETS
5ff3f7a4
GS
1203# ifdef HAS_FSTAT64
1204# define fstat fstat64
1205# endif
1206# ifdef HAS_FTRUNCATE64
1207# define ftruncate ftruncate64
1208# endif
1209# ifdef HAS_LSEEK64
1210# define lseek lseek64
1211# ifdef HAS_OFF64_T
1212# undef Off_t
1213# define Off_t off64_t
1214# endif
1215# endif
1216# ifdef HAS_LSTAT64
1217# define lstat lstat64
1218# endif
1219 /* Some systems have open64() in libc but use that only
1220 * for true LP64 mode, in mixed mode (ILP32LL64, for example)
85ab1d1d
JH
1221 * they use the vanilla open(). Such systems should undefine
1222 * d_open64 in their hints files. --jhi */
1223# if defined(HAS_OPEN64)
5ff3f7a4
GS
1224# define open open64
1225# endif
1226# ifdef HAS_OPENDIR64
1227# define opendir opendir64
1228# endif
1229# ifdef HAS_READDIR64
1230# define readdir readdir64
1231# ifdef HAS_STRUCT_DIRENT64
1232# define dirent dirent64
1233# endif
1234# endif
1235# ifdef HAS_SEEKDIR64
1236# define seekdir seekdir64
1237# endif
1238# ifdef HAS_STAT64
1239# define stat stat64 /* Affects also struct stat, hopefully okay. */
1240# endif
1241# ifdef HAS_TELLDIR64
1242# define telldir telldir64
1243# endif
1244# ifdef HAS_TRUNCATE64
1245# define truncate truncate64
1246# endif
1247 /* flock is not #defined here to be flock64 because it seems
1248 that a system may have struct flock64 but still use flock()
1249 and not flock64(). The actual flocking code in pp_sys.c
1250 must be changed. Also lockf and lockf64 must be dealt
1251 with in pp_sys.c. --jhi */
1252# endif
1253# ifdef USE_64_BIT_STDIO
1254# ifdef HAS_FGETPOS64
1255# define fgetpos fgetpos64
1256# endif
1257# ifdef HAS_FOPEN64
1258# define fopen fopen64
1259# endif
1260# ifdef HAS_FREOPEN64
1261# define freopen freopen64
1262# endif
1263# ifdef HAS_FSEEK64
1264# define fseek fseek64
1265# endif
1266# ifdef HAS_FSEEKO64
1267# define fseeko fseeko64
1268# endif
1269# ifdef HAS_FSETPOS64
1270# define fsetpos fsetpos64
1271# endif
1272# ifdef HAS_FTELL64
1273# define ftell ftell64
1274# endif
1275# ifdef HAS_FTELLO64
1276# define ftello ftello64
1277# endif
1278# ifdef HAS_TMPFILE64
1279# define tmpfile tmpfile64
1280# endif
1281# endif
1282# ifdef USE_64_BIT_DBM
1283# ifdef HAS_DBMINIT64
1284# define dbminit dbminit64
1285# endif
1286# ifdef HAS_DBMCLOSE64
1287# define dbmclose dbmclose64
1288# endif
1289# ifdef HAS_FETCH64
1290# define fetch fetch64
1291# endif
1292# ifdef HAS_DELETE64
1293# define delete delete64
1294# endif
1295# ifdef HAS_STORE64
1296# define store store64
1297# endif
1298# ifdef HAS_FIRSTKEY64
1299# define firstkey firstkey64
1300# endif
1301# ifdef HAS_NEXTKEY64
1302# define nextkey nextkey64
1303# endif
1304# endif
1305#endif
1306
6f71a643
JH
1307#if defined(__OPEN_VM)
1308# include "vmesa/vmesaish.h"
1309#endif
1310
748a9306 1311#ifdef DOSISH
4633a7c4
LW
1312# if defined(OS2)
1313# include "os2ish.h"
1314# else
748a9306 1315# include "dosish.h"
4633a7c4 1316# endif
a0d0e21e 1317#else
748a9306
LW
1318# if defined(VMS)
1319# include "vmsish.h"
1320# else
0c30d9ec
PP
1321# if defined(PLAN9)
1322# include "./plan9/plan9ish.h"
1323# else
1d84e8df
JH
1324# if defined(MPE)
1325# include "mpeix/mpeixish.h"
1326# else
495c5fdc
GP
1327# if defined(__VOS__)
1328# include "vosish.h"
1329# else
6f71a643 1330# include "unixish.h"
495c5fdc 1331# endif
1d84e8df 1332# endif
0c30d9ec 1333# endif
748a9306 1334# endif
32f822de
GS
1335#endif
1336
0f31cffe
GS
1337#ifndef MAXPATHLEN
1338# ifdef PATH_MAX
b990c8b2
JH
1339# ifdef _POSIX_PATH_MAX
1340# if PATH_MAX > _POSIX_PATH_MAX
1341/* MAXPATHLEN is supposed to include the final null character,
1342 * as opposed to PATH_MAX and _POSIX_PATH_MAX. */
1343# define MAXPATHLEN (PATH_MAX+1)
1344# else
1345# define MAXPATHLEN (_POSIX_PATH_MAX+1)
1346# endif
1347# else
1348# define MAXPATHLEN (PATH_MAX+1)
1349# endif
0f31cffe 1350# else
b990c8b2
JH
1351# ifdef _POSIX_PATH_MAX
1352# define MAXPATHLEN (_POSIX_PATH_MAX+1)
1353# else
1354# define MAXPATHLEN 1024 /* Err on the large side. */
1355# endif
0f31cffe
GS
1356# endif
1357#endif
1358
ac4c12e7
GS
1359#ifndef FUNC_NAME_TO_PTR
1360#define FUNC_NAME_TO_PTR(name) name
1361#endif
1362
32f822de 1363/*
dd96f567
IZ
1364 * USE_THREADS needs to be after unixish.h as <pthread.h> includes
1365 * <sys/signal.h> which defines NSIG - which will stop inclusion of <signal.h>
32f822de
GS
1366 * this results in many functions being undeclared which bothers C++
1367 * May make sense to have threads after "*ish.h" anyway
1368 */
1369
1370#ifdef USE_THREADS
79d59c5f
GS
1371 /* pending resolution of licensing issues, we avoid the erstwhile
1372 * atomic.h everywhere */
1373# define EMULATE_ATOMIC_REFCOUNTS
1374
32f822de
GS
1375# ifdef FAKE_THREADS
1376# include "fakethr.h"
1377# else
1378# ifdef WIN32
1379# include <win32thread.h>
1380# else
dd96f567
IZ
1381# ifdef OS2
1382# include "os2thread.h"
1383# else
7f3d1cf1 1384# ifdef I_MACH_CTHREADS
bdd66968 1385# include <mach/cthreads.h>
8f1f23e8 1386# if (defined(NeXT) || defined(__NeXT__)) && defined(PERL_POLLUTE_MALLOC)
772fe5b3
HM
1387# define MUTEX_INIT_CALLS_MALLOC
1388# endif
7f3d1cf1
BH
1389typedef cthread_t perl_os_thread;
1390typedef mutex_t perl_mutex;
1391typedef condition_t perl_cond;
1392typedef void * perl_key;
1393# else /* Posix threads */
1394# include <pthread.h>
1395typedef pthread_t perl_os_thread;
1396typedef pthread_mutex_t perl_mutex;
1397typedef pthread_cond_t perl_cond;
1398typedef pthread_key_t perl_key;
1399# endif /* I_MACH_CTHREADS */
dd96f567 1400# endif /* OS2 */
32f822de
GS
1401# endif /* WIN32 */
1402# endif /* FAKE_THREADS */
1403#endif /* USE_THREADS */
3fc1aec6 1404
68dc0745 1405#ifdef VMS
6b88bc9c 1406# define STATUS_NATIVE PL_statusvalue_vms
68dc0745 1407# define STATUS_NATIVE_EXPORT \
6b88bc9c 1408 ((I32)PL_statusvalue_vms == -1 ? 44 : PL_statusvalue_vms)
68dc0745
PP
1409# define STATUS_NATIVE_SET(n) \
1410 STMT_START { \
6b88bc9c
GS
1411 PL_statusvalue_vms = (n); \
1412 if ((I32)PL_statusvalue_vms == -1) \
3280af22 1413 PL_statusvalue = -1; \
6b88bc9c 1414 else if (PL_statusvalue_vms & STS$M_SUCCESS) \
3280af22 1415 PL_statusvalue = 0; \
6b88bc9c
GS
1416 else if ((PL_statusvalue_vms & STS$M_SEVERITY) == 0) \
1417 PL_statusvalue = 1 << 8; \
68dc0745 1418 else \
6b88bc9c 1419 PL_statusvalue = (PL_statusvalue_vms & STS$M_SEVERITY) << 8; \
68dc0745 1420 } STMT_END
3280af22 1421# define STATUS_POSIX PL_statusvalue
68dc0745
PP
1422# ifdef VMSISH_STATUS
1423# define STATUS_CURRENT (VMSISH_STATUS ? STATUS_NATIVE : STATUS_POSIX)
1424# else
1425# define STATUS_CURRENT STATUS_POSIX
1426# endif
1427# define STATUS_POSIX_SET(n) \
1428 STMT_START { \
3280af22
NIS
1429 PL_statusvalue = (n); \
1430 if (PL_statusvalue != -1) { \
1431 PL_statusvalue &= 0xFFFF; \
6b88bc9c 1432 PL_statusvalue_vms = PL_statusvalue ? 44 : 1; \
68dc0745 1433 } \
6b88bc9c 1434 else PL_statusvalue_vms = -1; \
68dc0745 1435 } STMT_END
6b88bc9c
GS
1436# define STATUS_ALL_SUCCESS (PL_statusvalue = 0, PL_statusvalue_vms = 1)
1437# define STATUS_ALL_FAILURE (PL_statusvalue = 1, PL_statusvalue_vms = 44)
68dc0745
PP
1438#else
1439# define STATUS_NATIVE STATUS_POSIX
1440# define STATUS_NATIVE_EXPORT STATUS_POSIX
1441# define STATUS_NATIVE_SET STATUS_POSIX_SET
3280af22 1442# define STATUS_POSIX PL_statusvalue
68dc0745
PP
1443# define STATUS_POSIX_SET(n) \
1444 STMT_START { \
3280af22
NIS
1445 PL_statusvalue = (n); \
1446 if (PL_statusvalue != -1) \
1447 PL_statusvalue &= 0xFFFF; \
68dc0745
PP
1448 } STMT_END
1449# define STATUS_CURRENT STATUS_POSIX
3280af22
NIS
1450# define STATUS_ALL_SUCCESS (PL_statusvalue = 0)
1451# define STATUS_ALL_FAILURE (PL_statusvalue = 1)
68dc0745
PP
1452#endif
1453
45bc9206
GS
1454/* This defines a way to flush all output buffers. This may be a
1455 * performance issue, so we allow people to disable it.
1456 * XXX the default needs a Configure test, as it may not work everywhere.
1457 */
1458#ifndef PERL_FLUSHALL_FOR_CHILD
767df6a1 1459# if defined(FFLUSH_NULL) || defined(USE_SFIO)
66fe083f 1460# define PERL_FLUSHALL_FOR_CHILD PerlIO_flush((PerlIO*)NULL)
767df6a1
JH
1461# else
1462# ifdef FFLUSH_ALL
1463# define PERL_FLUSHALL_FOR_CHILD my_fflush_all()
e2dbf222
GS
1464# else
1465# define PERL_FLUSHALL_FOR_CHILD (void)0
767df6a1 1466# endif
66fe083f 1467# endif
45bc9206
GS
1468#endif
1469
3fc1aec6
PP
1470/* Some unistd.h's give a prototype for pause() even though
1471 HAS_PAUSE ends up undefined. This causes the #define
1472 below to be rejected by the compmiler. Sigh.
1473*/
1474#ifdef HAS_PAUSE
1475#define Pause pause
1476#else
1477#define Pause() sleep((32767<<16)+32767)
748a9306
LW
1478#endif
1479
1480#ifndef IOCPARM_LEN
1481# ifdef IOCPARM_MASK
1482 /* on BSDish systes we're safe */
1483# define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK)
1484# else
1485 /* otherwise guess at what's safe */
1486# define IOCPARM_LEN(x) 256
1487# endif
a0d0e21e
LW
1488#endif
1489
521e0776 1490#if defined(CYGWIN32)
521e0776
GS
1491/* USEMYBINMODE
1492 * This symbol, if defined, indicates that the program should
1493 * use the routine my_binmode(FILE *fp, char iotype) to insure
1494 * that a file is in "binary" mode -- that is, that no translation
1495 * of bytes occurs on read or write operations.
1496 */
1497# define USEMYBINMODE / **/
1498# define my_binmode(fp, iotype) \
1499 (PerlLIO_setmode(PerlIO_fileno(fp), O_BINARY) != -1 ? TRUE : NULL)
5aabfad6
PP
1500#endif
1501
cea2e8a9
GS
1502#ifdef PERL_IMPLICIT_CONTEXT
1503# ifdef USE_THREADS
1504struct perl_thread;
73c4f7a1 1505# define pTHX register struct perl_thread *thr
41cd3736
GS
1506# define aTHX thr
1507# define dTHXa(a) pTHX = (struct perl_thread *)a
1508# define dTHX dTHXa(SvPVX(PL_thrsv))
1509# define dTHR dNOOP
cea2e8a9
GS
1510# else
1511# define MULTIPLICITY
73c4f7a1 1512# define pTHX register PerlInterpreter *my_perl
41cd3736
GS
1513# define aTHX my_perl
1514# define dTHXa(a) pTHX = (PerlInterpreter *)a
1515# define dTHX dTHXa(PL_curinterp)
cea2e8a9 1516# endif
41cd3736
GS
1517# define pTHX_ pTHX,
1518# define _pTHX ,pTHX
1519# define aTHX_ aTHX,
1520# define _aTHX ,aTHX
cea2e8a9
GS
1521#endif
1522
864dbfa3 1523#ifndef pTHX
41cd3736 1524# define pTHX void
864dbfa3
GS
1525# define pTHX_
1526# define _pTHX
864dbfa3
GS
1527# define aTHX
1528# define aTHX_
1529# define _aTHX
41cd3736
GS
1530# define dTHXa(a) dNOOP
1531# define dTHX dNOOP
864dbfa3
GS
1532#endif
1533
cea2e8a9
GS
1534#define WITH_THX(s) STMT_START { dTHX; s; } STMT_END
1535
864dbfa3
GS
1536#ifndef STATIC
1537# define STATIC static
1538#endif
1539
cea2e8a9
GS
1540#ifdef UNION_ANY_DEFINITION
1541UNION_ANY_DEFINITION;
1542#else
1543union any {
1544 void* any_ptr;
1545 I32 any_i32;
1546 IV any_iv;
1547 long any_long;
1548 void (CPERLscope(*any_dptr)) (pTHX_ void*);
1549};
1550#endif
1551
1552#ifdef USE_THREADS
1553#define ARGSproto struct perl_thread *thr
1554#else
1555#define ARGSproto
1556#endif /* USE_THREADS */
1557
1558#ifdef PERL_OBJECT
1559typedef I32 (*filter_t) (CPerlObj*, int, SV *, int);
1560#else
1561typedef I32 (*filter_t) (pTHX_ int, SV *, int);
1562#endif
1563
1564#define FILTER_READ(idx, sv, len) filter_read(idx, sv, len)
1565#define FILTER_DATA(idx) (AvARRAY(PL_rsfp_filters)[idx])
1566#define FILTER_ISREADER(idx) (idx >= AvFILLp(PL_rsfp_filters))
1567
4f63d024
GS
1568#ifdef WIN32
1569#include "win32.h"
1570#endif
1571
1572#include "iperlsys.h"
378cc40b 1573#include "regexp.h"
79072805 1574#include "sv.h"
378cc40b 1575#include "util.h"
8d063cd8 1576#include "form.h"
79072805
LW
1577#include "gv.h"
1578#include "cv.h"
22c35a8c 1579#ifndef PERL_OBJECT
79072805 1580#include "opcode.h"
22c35a8c 1581#endif
79072805
LW
1582#include "op.h"
1583#include "cop.h"
1584#include "av.h"
1585#include "hv.h"
1586#include "mg.h"
1587#include "scope.h"
599cee73 1588#include "warning.h"
a0ed51b3 1589#include "utf8.h"
8d063cd8 1590
7fae4e64
GS
1591/* Current curly descriptor */
1592typedef struct curcur CURCUR;
1593struct curcur {
1594 int parenfloor; /* how far back to strip paren data */
1595 int cur; /* how many instances of scan we've matched */
1596 int min; /* the minimal number of scans to match */
1597 int max; /* the maximal number of scans to match */
1598 int minmod; /* whether to work our way up or down */
1599 regnode * scan; /* the thing to match */
1600 regnode * next; /* what has to match after it */
1601 char * lastloc; /* where we started matching this scan */
1602 CURCUR * oldcc; /* current curly before we started this one */
1603};
1604
1605typedef struct _sublex_info SUBLEXINFO;
1606struct _sublex_info {
1607 I32 super_state; /* lexer state to save */
1608 I32 sub_inwhat; /* "lex_inwhat" to use */
1609 OP *sub_op; /* "lex_op" to use */
0244c3a4
GS
1610 char *super_bufptr; /* PL_bufptr that was */
1611 char *super_bufend; /* PL_bufend that was */
7fae4e64
GS
1612};
1613
455ece5e 1614typedef struct magic_state MGS; /* struct magic_state defined in mg.c */
76e3520e 1615
864dbfa3
GS
1616/* Length of a variant. */
1617
76e3520e
GS
1618typedef struct {
1619 I32 len_min;
1620 I32 len_delta;
1621 I32 pos_min;
1622 I32 pos_delta;
1623 SV *last_found;
1624 I32 last_end; /* min value, <0 unless valid. */
1625 I32 last_start_min;
1626 I32 last_start_max;
1627 SV **longest; /* Either &l_fixed, or &l_float. */
1628 SV *longest_fixed;
1629 I32 offset_fixed;
1630 SV *longest_float;
1631 I32 offset_float_min;
1632 I32 offset_float_max;
1633 I32 flags;
1634} scan_data_t;
1635
1636typedef I32 CHECKPOINT;
76e3520e 1637
450a55e4 1638#if defined(iAPX286) || defined(M_I286) || defined(I80286)
a687059c
LW
1639# define I286
1640#endif
1641
fe14fcc3
LW
1642#if defined(htonl) && !defined(HAS_HTONL)
1643#define HAS_HTONL
ae986130 1644#endif
fe14fcc3
LW
1645#if defined(htons) && !defined(HAS_HTONS)
1646#define HAS_HTONS
ae986130 1647#endif
fe14fcc3
LW
1648#if defined(ntohl) && !defined(HAS_NTOHL)
1649#define HAS_NTOHL
ae986130 1650#endif
fe14fcc3
LW
1651#if defined(ntohs) && !defined(HAS_NTOHS)
1652#define HAS_NTOHS
ae986130 1653#endif
fe14fcc3 1654#ifndef HAS_HTONL
d9d8d8de 1655#if (BYTEORDER & 0xffff) != 0x4321
fe14fcc3
LW
1656#define HAS_HTONS
1657#define HAS_HTONL
1658#define HAS_NTOHS
1659#define HAS_NTOHL
a687059c
LW
1660#define MYSWAP
1661#define htons my_swap
1662#define htonl my_htonl
1663#define ntohs my_swap
1664#define ntohl my_ntohl
1665#endif
1666#else
d9d8d8de 1667#if (BYTEORDER & 0xffff) == 0x4321
fe14fcc3
LW
1668#undef HAS_HTONS
1669#undef HAS_HTONL
1670#undef HAS_NTOHS
1671#undef HAS_NTOHL
a687059c
LW
1672#endif
1673#endif
1674
988174c1
LW
1675/*
1676 * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
1677 * -DWS
1678 */
1679#if BYTEORDER != 0x1234
1680# define HAS_VTOHL
1681# define HAS_VTOHS
1682# define HAS_HTOVL
1683# define HAS_HTOVS
c67712b2 1684# if BYTEORDER == 0x4321 || BYTEORDER == 0x87654321
988174c1
LW
1685# define vtohl(x) ((((x)&0xFF)<<24) \
1686 +(((x)>>24)&0xFF) \
1687 +(((x)&0x0000FF00)<<8) \
1688 +(((x)&0x00FF0000)>>8) )
1689# define vtohs(x) ((((x)&0xFF)<<8) + (((x)>>8)&0xFF))
1690# define htovl(x) vtohl(x)
1691# define htovs(x) vtohs(x)
1692# endif
1693 /* otherwise default to functions in util.c */
1694#endif
1695
0f85fab0 1696#ifdef CASTNEGFLOAT
79072805 1697#define U_S(what) ((U16)(what))
0f85fab0 1698#define U_I(what) ((unsigned int)(what))
79072805 1699#define U_L(what) ((U32)(what))
0f85fab0 1700#else
232e078e
AD
1701#define U_S(what) ((U16)cast_ulong((double)(what)))
1702#define U_I(what) ((unsigned int)cast_ulong((double)(what)))
1703#define U_L(what) (cast_ulong((double)(what)))
ee0007ab
LW
1704#endif
1705
ed6116ce
LW
1706#ifdef CASTI32
1707#define I_32(what) ((I32)(what))
a0d0e21e 1708#define I_V(what) ((IV)(what))
5d94fbed 1709#define U_V(what) ((UV)(what))
ed6116ce 1710#else
a6e633de
PP
1711#define I_32(what) (cast_i32((double)(what)))
1712#define I_V(what) (cast_iv((double)(what)))
5d94fbed 1713#define U_V(what) (cast_uv((double)(what)))
ed6116ce
LW
1714#endif
1715
25da4f38
IZ
1716/* Used with UV/IV arguments: */
1717 /* XXXX: need to speed it up */
1718#define CLUMP_2UV(iv) ((iv) < 0 ? 0 : (UV)(iv))
1719#define CLUMP_2IV(uv) ((uv) > (UV)IV_MAX ? IV_MAX : (IV)(uv))
1720
79072805
LW
1721struct Outrec {
1722 I32 o_lines;
d9d8d8de 1723 char *o_str;
79072805 1724 U32 o_len;
8d063cd8
LW
1725};
1726
352d5a3a
LW
1727#ifndef MAXSYSFD
1728# define MAXSYSFD 2
1729#endif
ee0007ab 1730
f82b3d41
PP
1731#ifndef TMPPATH
1732# define TMPPATH "/tmp/perl-eXXXXXX"
a0d0e21e 1733#endif
79072805
LW
1734
1735#ifndef __cplusplus
20ce7b12
GS
1736Uid_t getuid (void);
1737Uid_t geteuid (void);
1738Gid_t getgid (void);
1739Gid_t getegid (void);
79072805 1740#endif
8d063cd8 1741
0c30d9ec 1742#ifndef Perl_debug_log
760ac839 1743#define Perl_debug_log PerlIO_stderr()
0c30d9ec 1744#endif
3967c732
JD
1745
1746#ifdef DEBUGGING
9d116dd7 1747#undef YYDEBUG
d96024cf 1748#define YYDEBUG 1
79072805 1749#define DEB(a) a
3280af22
NIS
1750#define DEBUG(a) if (PL_debug) a
1751#define DEBUG_p(a) if (PL_debug & 1) a
1752#define DEBUG_s(a) if (PL_debug & 2) a
1753#define DEBUG_l(a) if (PL_debug & 4) a
1754#define DEBUG_t(a) if (PL_debug & 8) a
1755#define DEBUG_o(a) if (PL_debug & 16) a
1756#define DEBUG_c(a) if (PL_debug & 32) a
1757#define DEBUG_P(a) if (PL_debug & 64) a
0672f40e 1758# if defined(PERL_OBJECT)
c850101c
JD
1759# define DEBUG_m(a) if (PL_debug & 128) a
1760# else
1761# define DEBUG_m(a) if (PL_curinterp && PL_debug & 128) a
1762# endif
3280af22
NIS
1763#define DEBUG_f(a) if (PL_debug & 256) a
1764#define DEBUG_r(a) if (PL_debug & 512) a
1765#define DEBUG_x(a) if (PL_debug & 1024) a
1766#define DEBUG_u(a) if (PL_debug & 2048) a
1767#define DEBUG_L(a) if (PL_debug & 4096) a
1768#define DEBUG_H(a) if (PL_debug & 8192) a
1769#define DEBUG_X(a) if (PL_debug & 16384) a
1770#define DEBUG_D(a) if (PL_debug & 32768) a
8b73bbec
IZ
1771# ifdef USE_THREADS
1772# define DEBUG_S(a) if (PL_debug & (1<<16)) a
1773# else
1774# define DEBUG_S(a)
1775# endif
79072805
LW
1776#else
1777#define DEB(a)
1778#define DEBUG(a)
1779#define DEBUG_p(a)
1780#define DEBUG_s(a)
1781#define DEBUG_l(a)
1782#define DEBUG_t(a)
1783#define DEBUG_o(a)
1784#define DEBUG_c(a)
1785#define DEBUG_P(a)
1786#define DEBUG_m(a)
1787#define DEBUG_f(a)
1788#define DEBUG_r(a)
1789#define DEBUG_x(a)
1790#define DEBUG_u(a)
8b73bbec 1791#define DEBUG_S(a)
79072805
LW
1792#define DEBUG_H(a)
1793#define DEBUG_X(a)
8990e307 1794#define DEBUG_D(a)
8b73bbec 1795#define DEBUG_S(a)
8d063cd8 1796#endif
fe14fcc3 1797#define YYMAXDEPTH 300
8d063cd8 1798
a6e633de 1799#ifndef assert /* <assert.h> might have been included somehow */
79072805
LW
1800#define assert(what) DEB( { \
1801 if (!(what)) { \
cea2e8a9 1802 Perl_croak(aTHX_ "Assertion failed: file \"%s\", line %d", \
79072805 1803 __FILE__, __LINE__); \
cea2e8a9 1804 PerlProc_exit(1); \
79072805 1805 }})
a6e633de 1806#endif
8d063cd8 1807
450a55e4 1808struct ufuncs {
20ce7b12
GS
1809 I32 (*uf_val)(IV, SV*);
1810 I32 (*uf_set)(IV, SV*);
a0d0e21e 1811 IV uf_index;
450a55e4
LW
1812};
1813
fe14fcc3 1814/* Fix these up for __STDC__ */
68dc0745 1815#ifndef DONT_DECLARE_STD
20ce7b12
GS
1816char *mktemp (char*);
1817double atof (const char*);
a0d0e21e 1818#endif
79072805 1819
352d5a3a 1820#ifndef STANDARD_C
fe14fcc3 1821/* All of these are in stdlib.h or time.h for ANSI C */
85e6fe83 1822Time_t time();
8d063cd8 1823struct tm *gmtime(), *localtime();
092bebab 1824#if defined(OEMVS) || defined(__OPEN_VM)
9d116dd7
JH
1825char *(strchr)(), *(strrchr)();
1826char *(strcpy)(), *(strcat)();
1827#else
93a17b20 1828char *strchr(), *strrchr();
378cc40b 1829char *strcpy(), *strcat();
9d116dd7 1830#endif
352d5a3a 1831#endif /* ! STANDARD_C */
8d063cd8 1832
79072805
LW
1833
1834#ifdef I_MATH
1835# include <math.h>
1836#else
32f822de 1837START_EXTERN_C
20ce7b12
GS
1838 double exp (double);
1839 double log (double);
1840 double log10 (double);
1841 double sqrt (double);
1842 double frexp (double,int*);
1843 double ldexp (double,int);
1844 double modf (double,double*);
1845 double sin (double);
1846 double cos (double);
1847 double atan2 (double,double);
1848 double pow (double,double);
32f822de 1849END_EXTERN_C
79072805
LW
1850#endif
1851
a0d0e21e 1852#ifndef __cplusplus
8f1f23e8 1853# if defined(NeXT) || defined(__NeXT__) /* or whatever catches all NeXTs */
3fc1aec6 1854char *crypt (); /* Maybe more hosts will need the unprototyped version */
26618a56
GS
1855# else
1856# if !defined(WIN32) || !defined(HAVE_DES_FCRYPT)
20ce7b12 1857char *crypt (const char*, const char*);
26618a56 1858# endif /* !WIN32 && !HAVE_CRYPT_SOURCE */
8f1f23e8 1859# endif /* !NeXT && !__NeXT__ */
26618a56
GS
1860# ifndef DONT_DECLARE_STD
1861# ifndef getenv
20ce7b12 1862char *getenv (const char*);
26618a56 1863# endif /* !getenv */
20ce7b12 1864Off_t lseek (int,Off_t,int);
26618a56 1865# endif /* !DONT_DECLARE_STD */
20ce7b12 1866char *getlogin (void);
26618a56 1867#endif /* !__cplusplus */
79072805 1868
16d20bd9 1869#ifdef UNLINK_ALL_VERSIONS /* Currently only makes sense for VMS */
378cc40b 1870#define UNLINK unlnk
20ce7b12 1871I32 unlnk (char*);
8d063cd8 1872#else
80252599 1873#define UNLINK PerlLIO_unlink
8d063cd8 1874#endif
a687059c 1875
fe14fcc3 1876#ifndef HAS_SETREUID
85e6fe83
LW
1877# ifdef HAS_SETRESUID
1878# define setreuid(r,e) setresuid(r,e,(Uid_t)-1)
1879# define HAS_SETREUID
1880# endif
a687059c 1881#endif
fe14fcc3 1882#ifndef HAS_SETREGID
85e6fe83
LW
1883# ifdef HAS_SETRESGID
1884# define setregid(r,e) setresgid(r,e,(Gid_t)-1)
1885# define HAS_SETREGID
1886# endif
a687059c 1887#endif
ee0007ab 1888
20ce7b12 1889typedef Signal_t (*Sighandler_t) (int);
ff68c719
PP
1890
1891#ifdef HAS_SIGACTION
1892typedef struct sigaction Sigsave_t;
1893#else
1894typedef Sighandler_t Sigsave_t;
1895#endif
1896
ee0007ab
LW
1897#define SCAN_DEF 0
1898#define SCAN_TR 1
1899#define SCAN_REPL 2
79072805
LW
1900
1901#ifdef DEBUGGING
4633a7c4 1902# ifndef register
a0d0e21e
LW
1903# define register
1904# endif
1905# define PAD_SV(po) pad_sv(po)
cea2e8a9 1906# define RUNOPS_DEFAULT Perl_runops_debug
79072805 1907#else
6b88bc9c 1908# define PAD_SV(po) PL_curpad[po]
cea2e8a9 1909# define RUNOPS_DEFAULT Perl_runops_standard
79072805
LW
1910#endif
1911
18f739ee 1912#ifdef MYMALLOC
772fe5b3 1913# ifdef MUTEX_INIT_CALLS_MALLOC
3541dd58
HM
1914# define MALLOC_INIT \
1915 STMT_START { \
1916 PL_malloc_mutex = NULL; \
1917 MUTEX_INIT(&PL_malloc_mutex); \
1918 } STMT_END
1919# define MALLOC_TERM \
1920 STMT_START { \
1921 perl_mutex tmp = PL_malloc_mutex; \
1922 PL_malloc_mutex = NULL; \
1923 MUTEX_DESTROY(&tmp); \
1924 } STMT_END
1925# else
1926# define MALLOC_INIT MUTEX_INIT(&PL_malloc_mutex)
1927# define MALLOC_TERM MUTEX_DESTROY(&PL_malloc_mutex)
1928# endif
18f739ee
IZ
1929#else
1930# define MALLOC_INIT
1931# define MALLOC_TERM
1932#endif
1933
b6d9d515 1934
73c4f7a1
GS
1935#ifdef PERL_OBJECT
1936typedef int (CPerlObj::*runops_proc_t) (void);
1937#else
cea2e8a9 1938typedef int (*runops_proc_t) (pTHX);
22c35a8c
GS
1939#endif
1940
940cb80d 1941/* _ (for $_) must be first in the following list (DEFSV requires it) */
54b9620d 1942#define THREADSV_NAMES "_123456789&`'+/.,\\\";^-%=|~:\001\005!@"
a863c7d1 1943
8f1f23e8
W
1944/* NeXT has problems with crt0.o globals */
1945#if defined(__DYNAMIC__) && \
1946 (defined(NeXT) || defined(__NeXT__) || defined(__APPLE__))
1947# if defined(NeXT) || defined(__NeXT)
1948# include <mach-o/dyld.h>
1949# define environ (*environ_pointer)
0c30d9ec 1950EXT char *** environ_pointer;
8f1f23e8
W
1951# else
1952# if defined(__APPLE__)
1953# include <crt_externs.h> /* for the env array */
1954# define environ (*_NSGetEnviron())
1955# endif
0c30d9ec 1956# endif
8f1f23e8
W
1957#else
1958 /* VMS and some other platforms don't use the environ array */
a6c40364
GS
1959# if !defined(VMS)
1960# if !defined(DONT_DECLARE_STD) || \
1961 (defined(__svr4__) && defined(__GNUC__) && defined(sun)) || \
1962 defined(__sgi) || \
1963 defined(__DGUX)
8f1f23e8 1964extern char ** environ; /* environment variables supplied via exec */
a6c40364 1965# endif
8f1f23e8
W
1966# endif
1967#endif
79072805 1968
73c4f7a1
GS
1969START_EXTERN_C
1970
79072805 1971/* handy constants */
22c35a8c 1972EXTCONST char PL_warn_uninit[]
a0d0e21e 1973 INIT("Use of uninitialized value");
22c35a8c 1974EXTCONST char PL_warn_nosemi[]
463ee0b2 1975 INIT("Semicolon seems to be missing");
22c35a8c 1976EXTCONST char PL_warn_reserved[]
463ee0b2 1977 INIT("Unquoted string \"%s\" may clash with future reserved word");
22c35a8c 1978EXTCONST char PL_warn_nl[]
93a17b20 1979 INIT("Unsuccessful %s on filename containing newline");
22c35a8c 1980EXTCONST char PL_no_wrongref[]
a0d0e21e 1981 INIT("Can't use %s ref as %s ref");
22c35a8c 1982EXTCONST char PL_no_symref[]
748a9306 1983 INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
22c35a8c 1984EXTCONST char PL_no_usym[]
8990e307 1985 INIT("Can't use an undefined value as %s reference");
22c35a8c 1986EXTCONST char PL_no_aelem[]
93a17b20 1987 INIT("Modification of non-creatable array value attempted, subscript %d");
22c35a8c 1988EXTCONST char PL_no_helem[]
93a17b20 1989 INIT("Modification of non-creatable hash value attempted, subscript \"%s\"");
22c35a8c 1990EXTCONST char PL_no_modify[]
93a17b20 1991 INIT("Modification of a read-only value attempted");
22c35a8c 1992EXTCONST char PL_no_mem[]
93a17b20 1993 INIT("Out of memory!\n");
22c35a8c 1994EXTCONST char PL_no_security[]
463ee0b2 1995 INIT("Insecure dependency in %s%s");
22c35a8c 1996EXTCONST char PL_no_sock_func[]
93a17b20 1997 INIT("Unsupported socket function \"%s\" called");
22c35a8c 1998EXTCONST char PL_no_dir_func[]
93a17b20 1999 INIT("Unsupported directory function \"%s\" called");
22c35a8c 2000EXTCONST char PL_no_func[]
93a17b20 2001 INIT("The %s function is unimplemented");
22c35a8c 2002EXTCONST char PL_no_myglob[]
748a9306 2003 INIT("\"my\" variable %s can't be in a package");
93a17b20 2004
7575fa06 2005EXTCONST char PL_uuemap[65]
80252599
GS
2006 INIT("`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_");
2007
2008
79072805 2009#ifdef DOINIT
22c35a8c
GS
2010EXT char *PL_sig_name[] = { SIG_NAME };
2011EXT int PL_sig_num[] = { SIG_NUM };
2012EXT SV * PL_psig_ptr[sizeof(PL_sig_num)/sizeof(*PL_sig_num)];
2013EXT SV * PL_psig_name[sizeof(PL_sig_num)/sizeof(*PL_sig_num)];
79072805 2014#else
22c35a8c
GS
2015EXT char *PL_sig_name[];
2016EXT int PL_sig_num[];
2017EXT SV * PL_psig_ptr[];
2018EXT SV * PL_psig_name[];
79072805
LW
2019#endif
2020
bbce6d69
PP
2021/* fast case folding tables */
2022
79072805 2023#ifdef DOINIT
9d116dd7 2024#ifdef EBCDIC
22c35a8c 2025EXT unsigned char PL_fold[] = { /* fast EBCDIC case folding table */
9d116dd7
JH
2026 0, 1, 2, 3, 4, 5, 6, 7,
2027 8, 9, 10, 11, 12, 13, 14, 15,
2028 16, 17, 18, 19, 20, 21, 22, 23,
2029 24, 25, 26, 27, 28, 29, 30, 31,
2030 32, 33, 34, 35, 36, 37, 38, 39,
2031 40, 41, 42, 43, 44, 45, 46, 47,
2032 48, 49, 50, 51, 52, 53, 54, 55,
2033 56, 57, 58, 59, 60, 61, 62, 63,
2034 64, 65, 66, 67, 68, 69, 70, 71,
2035 72, 73, 74, 75, 76, 77, 78, 79,
2036 80, 81, 82, 83, 84, 85, 86, 87,
2037 88, 89, 90, 91, 92, 93, 94, 95,
2038 96, 97, 98, 99, 100, 101, 102, 103,
2039 104, 105, 106, 107, 108, 109, 110, 111,
2040 112, 113, 114, 115, 116, 117, 118, 119,
2041 120, 121, 122, 123, 124, 125, 126, 127,
2042 128, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
2043 'H', 'I', 138, 139, 140, 141, 142, 143,
2044 144, 'J', 'K', 'L', 'M', 'N', 'O', 'P',
2045 'Q', 'R', 154, 155, 156, 157, 158, 159,
2046 160, 161, 'S', 'T', 'U', 'V', 'W', 'X',
2047 'Y', 'Z', 170, 171, 172, 173, 174, 175,
2048 176, 177, 178, 179, 180, 181, 182, 183,
2049 184, 185, 186, 187, 188, 189, 190, 191,
2050 192, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
2051 'h', 'i', 202, 203, 204, 205, 206, 207,
2052 208, 'j', 'k', 'l', 'm', 'n', 'o', 'p',
2053 'q', 'r', 218, 219, 220, 221, 222, 223,
2054 224, 225, 's', 't', 'u', 'v', 'w', 'x',
2055 'y', 'z', 234, 235, 236, 237, 238, 239,
2056 240, 241, 242, 243, 244, 245, 246, 247,
2057 248, 249, 250, 251, 252, 253, 254, 255
2058};
2059#else /* ascii rather than ebcdic */
22c35a8c 2060EXTCONST unsigned char PL_fold[] = {
79072805
LW
2061 0, 1, 2, 3, 4, 5, 6, 7,
2062 8, 9, 10, 11, 12, 13, 14, 15,
2063 16, 17, 18, 19, 20, 21, 22, 23,
2064 24, 25, 26, 27, 28, 29, 30, 31,
2065 32, 33, 34, 35, 36, 37, 38, 39,
2066 40, 41, 42, 43, 44, 45, 46, 47,
2067 48, 49, 50, 51, 52, 53, 54, 55,
2068 56, 57, 58, 59, 60, 61, 62, 63,
2069 64, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
2070 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
2071 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
2072 'x', 'y', 'z', 91, 92, 93, 94, 95,
2073 96, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
2074 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
2075 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
2076 'X', 'Y', 'Z', 123, 124, 125, 126, 127,
2077 128, 129, 130, 131, 132, 133, 134, 135,
2078 136, 137, 138, 139, 140, 141, 142, 143,
2079 144, 145, 146, 147, 148, 149, 150, 151,
2080 152, 153, 154, 155, 156, 157, 158, 159,
2081 160, 161, 162, 163, 164, 165, 166, 167,
2082 168, 169, 170, 171, 172, 173, 174, 175,
2083 176, 177, 178, 179, 180, 181, 182, 183,
2084 184, 185, 186, 187, 188, 189, 190, 191,
2085 192, 193, 194, 195, 196, 197, 198, 199,
2086 200, 201, 202, 203, 204, 205, 206, 207,
2087 208, 209, 210, 211, 212, 213, 214, 215,
2088 216, 217, 218, 219, 220, 221, 222, 223,
2089 224, 225, 226, 227, 228, 229, 230, 231,
2090 232, 233, 234, 235, 236, 237, 238, 239,
2091 240, 241, 242, 243, 244, 245, 246, 247,
2092 248, 249, 250, 251, 252, 253, 254, 255
2093};
9d116dd7 2094#endif /* !EBCDIC */
79072805 2095#else
22c35a8c 2096EXTCONST unsigned char PL_fold[];
79072805
LW
2097#endif
2098
2099#ifdef DOINIT
22c35a8c 2100EXT unsigned char PL_fold_locale[] = {
79072805
LW
2101 0, 1, 2, 3, 4, 5, 6, 7,
2102 8, 9, 10, 11, 12, 13, 14, 15,
2103 16, 17, 18, 19, 20, 21, 22, 23,
2104 24, 25, 26, 27, 28, 29, 30, 31,
2105 32, 33, 34, 35, 36, 37, 38, 39,
2106 40, 41, 42, 43, 44, 45, 46, 47,
2107 48, 49, 50, 51, 52, 53, 54, 55,
2108 56, 57, 58, 59, 60, 61, 62, 63,
2109 64, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
2110 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
2111 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
2112 'x', 'y', 'z', 91, 92, 93, 94, 95,
2113 96, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
2114 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
2115 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
2116 'X', 'Y', 'Z', 123, 124, 125, 126, 127,
2117 128, 129, 130, 131, 132, 133, 134, 135,
2118 136, 137, 138, 139, 140, 141, 142, 143,
2119 144, 145, 146, 147, 148, 149, 150, 151,
2120 152, 153, 154, 155, 156, 157, 158, 159,
2121 160, 161, 162, 163, 164, 165, 166, 167,
2122 168, 169, 170, 171, 172, 173, 174, 175,
2123 176, 177, 178, 179, 180, 181, 182, 183,
2124 184, 185, 186, 187, 188, 189, 190, 191,
2125 192, 193, 194, 195, 196, 197, 198, 199,
2126 200, 201, 202, 203, 204, 205, 206, 207,
2127 208, 209, 210, 211, 212, 213, 214, 215,
2128 216, 217, 218, 219, 220, 221, 222, 223,
2129 224, 225, 226, 227, 228, 229, 230, 231,
2130 232, 233, 234, 235, 236, 237, 238, 239,
2131 240, 241, 242, 243, 244, 245, 246, 247,
2132 248, 249, 250, 251, 252, 253, 254, 255
2133};
2134#else
22c35a8c 2135EXT unsigned char PL_fold_locale[];
79072805
LW
2136#endif
2137
2138#ifdef DOINIT
9d116dd7 2139#ifdef EBCDIC
22c35a8c 2140EXT unsigned char PL_freq[] = {/* EBCDIC frequencies for mixed English/C */
9d116dd7
JH
2141 1, 2, 84, 151, 154, 155, 156, 157,
2142 165, 246, 250, 3, 158, 7, 18, 29,
2143 40, 51, 62, 73, 85, 96, 107, 118,
2144 129, 140, 147, 148, 149, 150, 152, 153,
2145 255, 6, 8, 9, 10, 11, 12, 13,
2146 14, 15, 24, 25, 26, 27, 28, 226,
2147 29, 30, 31, 32, 33, 43, 44, 45,
2148 46, 47, 48, 49, 50, 76, 77, 78,
2149 79, 80, 81, 82, 83, 84, 85, 86,
2150 87, 94, 95, 234, 181, 233, 187, 190,
2151 180, 96, 97, 98, 99, 100, 101, 102,
2152 104, 112, 182, 174, 236, 232, 229, 103,
2153 228, 226, 114, 115, 116, 117, 118, 119,
2154 120, 121, 122, 235, 176, 230, 194, 162,
2155 130, 131, 132, 133, 134, 135, 136, 137,
2156 138, 139, 201, 205, 163, 217, 220, 224,
2157 5, 248, 227, 244, 242, 255, 241, 231,
2158 240, 253, 16, 197, 19, 20, 21, 187,
2159 23, 169, 210, 245, 237, 249, 247, 239,
2160 168, 252, 34, 196, 36, 37, 38, 39,
2161 41, 42, 251, 254, 238, 223, 221, 213,
2162 225, 177, 52, 53, 54, 55, 56, 57,
2163 58, 59, 60, 61, 63, 64, 65, 66,
2164 67, 68, 69, 70, 71, 72, 74, 75,
2165 205, 208, 186, 202, 200, 218, 198, 179,
2166 178, 214, 88, 89, 90, 91, 92, 93,
2167 217, 166, 170, 207, 199, 209, 206, 204,
2168 160, 212, 105, 106, 108, 109, 110, 111,
2169 203, 113, 216, 215, 192, 175, 193, 243,
2170 172, 161, 123, 124, 125, 126, 127, 128,
2171 222, 219, 211, 195, 188, 193, 185, 184,
2172 191, 183, 141, 142, 143, 144, 145, 146
2173};
2174#else /* ascii rather than ebcdic */
22c35a8c 2175EXTCONST unsigned char PL_freq[] = { /* letter frequencies for mixed English/C */
79072805
LW
2176 1, 2, 84, 151, 154, 155, 156, 157,
2177 165, 246, 250, 3, 158, 7, 18, 29,
2178 40, 51, 62, 73, 85, 96, 107, 118,
2179 129, 140, 147, 148, 149, 150, 152, 153,
2180 255, 182, 224, 205, 174, 176, 180, 217,
2181 233, 232, 236, 187, 235, 228, 234, 226,
2182 222, 219, 211, 195, 188, 193, 185, 184,
2183 191, 183, 201, 229, 181, 220, 194, 162,
2184 163, 208, 186, 202, 200, 218, 198, 179,
2185 178, 214, 166, 170, 207, 199, 209, 206,
2186 204, 160, 212, 216, 215, 192, 175, 173,
2187 243, 172, 161, 190, 203, 189, 164, 230,
2188 167, 248, 227, 244, 242, 255, 241, 231,
2189 240, 253, 169, 210, 245, 237, 249, 247,
2190 239, 168, 252, 251, 254, 238, 223, 221,
2191 213, 225, 177, 197, 171, 196, 159, 4,
2192 5, 6, 8, 9, 10, 11, 12, 13,
2193 14, 15, 16, 17, 19, 20, 21, 22,
2194 23, 24, 25, 26, 27, 28, 30, 31,
2195 32, 33, 34, 35, 36, 37, 38, 39,
2196 41, 42, 43, 44, 45, 46, 47, 48,
2197 49, 50, 52, 53, 54, 55, 56, 57,
2198 58, 59, 60, 61, 63, 64, 65, 66,
2199 67, 68, 69, 70, 71, 72, 74, 75,
2200 76, 77, 78, 79, 80, 81, 82, 83,
2201 86, 87, 88, 89, 90, 91, 92, 93,
2202 94, 95, 97, 98, 99, 100, 101, 102,
2203 103, 104, 105, 106, 108, 109, 110, 111,
2204 112, 113, 114, 115, 116, 117, 119, 120,
2205 121, 122, 123, 124, 125, 126, 127, 128,
2206 130, 131, 132, 133, 134, 135, 136, 137,
2207 138, 139, 141, 142, 143, 144, 145, 146
2208};
9d116dd7 2209#endif
79072805 2210#else
22c35a8c 2211EXTCONST unsigned char PL_freq[];
79072805
LW
2212#endif
2213
8990e307
LW
2214#ifdef DEBUGGING
2215#ifdef DOINIT
22c35a8c 2216EXTCONST char* PL_block_type[] = {
8990e307
LW
2217 "NULL",
2218 "SUB",
2219 "EVAL",
2220 "LOOP",
2221 "SUBST",
2222 "BLOCK",
2223};
2224#else
22c35a8c 2225EXTCONST char* PL_block_type[];
8990e307
LW
2226#endif
2227#endif
2228
73c4f7a1
GS
2229END_EXTERN_C
2230
79072805
LW
2231/*****************************************************************************/
2232/* This lexer/parser stuff is currently global since yacc is hard to reenter */
2233/*****************************************************************************/
8990e307 2234/* XXX This needs to be revisited, since BEGIN makes yacc re-enter... */
79072805 2235
a0d0e21e
LW
2236#include "perly.h"
2237
fb73857a
PP
2238#define LEX_NOTPARSING 11 /* borrowed from toke.c */
2239
79072805
LW
2240typedef enum {
2241 XOPERATOR,
2242 XTERM,
79072805 2243 XREF,
8990e307 2244 XSTATE,
a0d0e21e
LW
2245 XBLOCK,
2246 XTERMBLOCK
79072805
LW
2247} expectation;
2248
dc9e4912
GS
2249enum { /* pass one of these to get_vtbl */
2250 want_vtbl_sv,
2251 want_vtbl_env,
2252 want_vtbl_envelem,
2253 want_vtbl_sig,
2254 want_vtbl_sigelem,
2255 want_vtbl_pack,
2256 want_vtbl_packelem,
2257 want_vtbl_dbline,
2258 want_vtbl_isa,
2259 want_vtbl_isaelem,
2260 want_vtbl_arylen,
2261 want_vtbl_glob,
2262 want_vtbl_mglob,
2263 want_vtbl_nkeys,
2264 want_vtbl_taint,
2265 want_vtbl_substr,
2266 want_vtbl_vec,
2267 want_vtbl_pos,
2268 want_vtbl_bm,
2269 want_vtbl_fm,
2270 want_vtbl_uvar,
2271 want_vtbl_defelem,
2272 want_vtbl_regexp,
2273 want_vtbl_collxfrm,
2274 want_vtbl_amagic,
2275 want_vtbl_amagicelem,
2276#ifdef USE_THREADS
2277 want_vtbl_mutex,
2278#endif
2279 want_vtbl_regdata,
810b8aa5
GS
2280 want_vtbl_regdatum,
2281 want_vtbl_backref
dc9e4912
GS
2282};
2283
85e6fe83
LW
2284 /* Note: the lowest 8 bits are reserved for
2285 stuffing into op->op_private */
f3aa04c2 2286#define HINT_PRIVATE_MASK 0x000000ff
85e6fe83
LW
2287#define HINT_INTEGER 0x00000001
2288#define HINT_STRICT_REFS 0x00000002
a0ed51b3
LW
2289/* #define HINT_notused4 0x00000004 */
2290#define HINT_UTF8 0x00000008
2291/* #define HINT_notused10 0x00000010 */
2292 /* Note: 20,40,80 used for NATIVE_HINTS */
85e6fe83
LW
2293
2294#define HINT_BLOCK_SCOPE 0x00000100
2295#define HINT_STRICT_SUBS 0x00000200
2296#define HINT_STRICT_VARS 0x00000400
bbce6d69 2297#define HINT_LOCALE 0x00000800
85e6fe83 2298
b3ac6de7
IZ
2299#define HINT_NEW_INTEGER 0x00001000
2300#define HINT_NEW_FLOAT 0x00002000
2301#define HINT_NEW_BINARY 0x00004000
2302#define HINT_NEW_STRING 0x00008000
2303#define HINT_NEW_RE 0x00010000
2304#define HINT_LOCALIZE_HH 0x00020000 /* %^H needs to be copied */
2305
b3eb6a9b 2306#define HINT_RE_TAINT 0x00100000
e4d48cc9 2307#define HINT_RE_EVAL 0x00200000
b3eb6a9b 2308
5ff3f7a4
GS
2309#define HINT_FILETEST_ACCESS 0x00400000
2310
d4cce5f1
NIS
2311/* Various states of an input record separator SV (rs, nrs) */
2312#define RsSNARF(sv) (! SvOK(sv))
2313#define RsSIMPLE(sv) (SvOK(sv) && SvCUR(sv))
2314#define RsPARA(sv) (SvOK(sv) && ! SvCUR(sv))
5b2b9c68 2315#define RsRECORD(sv) (SvROK(sv) && (SvIV(SvRV(sv)) > 0))
79072805 2316
56953603 2317/* Enable variables which are pointers to functions */
15e52e56 2318#ifdef PERL_OBJECT
20ce7b12
GS
2319typedef regexp*(CPerlObj::*regcomp_t) (char* exp, char* xend, PMOP* pm);
2320typedef I32 (CPerlObj::*regexec_t) (regexp* prog, char* stringarg,
2321 char* strend, char* strbeg,
2322 I32 minend, SV* screamer, void* data,
2323 U32 flags);
15e52e56 2324#else
cea2e8a9
GS
2325typedef regexp*(*regcomp_t) (pTHX_ char* exp, char* xend, PMOP* pm);
2326typedef I32 (*regexec_t) (pTHX_ regexp* prog, char* stringarg, char* strend, char*
20ce7b12
GS
2327 strbeg, I32 minend, SV* screamer, void* data,
2328 U32 flags);
56953603 2329
15e52e56
GS
2330#endif
2331
22239a37
NIS
2332/* Set up PERLVAR macros for populating structs */
2333#define PERLVAR(var,type) type var;
2334#define PERLVARI(var,type,init) type var;
3fe35a81 2335#define PERLVARIC(var,type,init) type var;
22239a37 2336
58a50f62
GS
2337/* Interpreter exitlist entry */
2338typedef struct exitlistentry {
2339#ifdef PERL_OBJECT
20ce7b12 2340 void (*fn) (CPerlObj*, void*);
58a50f62 2341#else
cea2e8a9 2342 void (*fn) (pTHX_ void*);
58a50f62
GS
2343#endif
2344 void *ptr;
2345} PerlExitListEntry;
2346
76e3520e 2347#ifdef PERL_OBJECT
20ce7b12 2348extern "C" CPerlObj* perl_alloc (IPerlMem*, IPerlEnv*, IPerlStdIO*, IPerlLIO*, IPerlDir*, IPerlSock*, IPerlProc*);
76e3520e 2349
76e3520e
GS
2350#undef EXT
2351#define EXT
2352#undef EXTCONST
2353#define EXTCONST
2354#undef INIT
2355#define INIT(x)
2356
2357class CPerlObj {
2358public:
2359 CPerlObj(IPerlMem*, IPerlEnv*, IPerlStdIO*, IPerlLIO*, IPerlDir*, IPerlSock*, IPerlProc*);
2360 void Init(void);
2361 void* operator new(size_t nSize, IPerlMem *pvtbl);
2362#endif /* PERL_OBJECT */
2363
22239a37
NIS
2364#ifdef PERL_GLOBAL_STRUCT
2365struct perl_vars {
2366#include "perlvars.h"
2367};
2368
2369#ifdef PERL_CORE
533c011a
NIS
2370EXT struct perl_vars PL_Vars;
2371EXT struct perl_vars *PL_VarsPtr INIT(&PL_Vars);
2372#else /* PERL_CORE */
8736538c 2373#if !defined(__GNUC__) || !(defined(WIN32) || defined(CYGWIN32))
22239a37 2374EXT
533c011a
NIS
2375#endif /* WIN32 */
2376struct perl_vars *PL_VarsPtr;
2377#define PL_Vars (*((PL_VarsPtr) ? PL_VarsPtr : (PL_VarsPtr = Perl_GetVars())))
2378#endif /* PERL_CORE */
22239a37
NIS
2379#endif /* PERL_GLOBAL_STRUCT */
2380
8990e307 2381#ifdef MULTIPLICITY
d4cce5f1
NIS
2382/* If we have multiple interpreters define a struct
2383 holding variables which must be per-interpreter
2384 If we don't have threads anything that would have
2385 be per-thread is per-interpreter.
2386*/
2387
79072805 2388struct interpreter {
d4cce5f1 2389#include "thrdvar.h"
d4cce5f1 2390#include "intrpvar.h"
49f531da 2391};
d4cce5f1 2392
79072805 2393#else
49f531da
NIS
2394struct interpreter {
2395 char broiled;
2396};
79072805
LW
2397#endif
2398
d4cce5f1
NIS
2399#ifdef USE_THREADS
2400/* If we have threads define a struct with all the variables
2401 * that have to be per-thread
49f531da 2402 */
8023c3ce 2403
79072805 2404
49f531da 2405struct perl_thread {
49f531da 2406#include "thrdvar.h"
79072805 2407};
d4cce5f1 2408
22fae026
TM
2409typedef struct perl_thread *Thread;
2410
2411#else
2412typedef void *Thread;
22239a37
NIS
2413#endif
2414
2415/* Done with PERLVAR macros for now ... */
d4cce5f1
NIS
2416#undef PERLVAR
2417#undef PERLVARI
3fe35a81 2418#undef PERLVARIC
79072805 2419
22239a37 2420#include "thread.h"
79072805 2421#include "pp.h"
864dbfa3
GS
2422
2423#ifndef PERL_CALLCONV
2424# define PERL_CALLCONV
2425#endif
2426
2427#ifdef PERL_OBJECT
2428# define VIRTUAL virtual PERL_CALLCONV
2429#else
2430# define VIRTUAL PERL_CALLCONV
2431START_EXTERN_C
2432#endif
2433
2434#ifndef NEXT30_NO_ATTRIBUTE
2435# ifndef HASATTRIBUTE /* disable GNU-cc attribute checking? */
2436# ifdef __attribute__ /* Avoid possible redefinition errors */
2437# undef __attribute__
2438# endif
2439# define __attribute__(attr)
2440# endif
2441#endif
2442
2443#ifdef USE_PURE_BISON
2444int Perl_yylex(pTHX_ YYSTYPE *lvalp, int *lcharp);
2445#endif
2446
2447typedef void (*DESTRUCTORFUNC_t) (pTHX_ void*);
2448typedef void (*SVFUNC_t) (pTHX_ SV*);
2449typedef I32 (*SVCOMPARE_t) (pTHX_ SV*, SV*);
2450typedef void (*XSINIT_t) (pTHX);
2451typedef void (*ATEXIT_t) (pTHX_ void*);
2452typedef void (*XSUBADDR_t) (pTHX_ CV *);
2453
79072805
LW
2454#include "proto.h"
2455
864dbfa3
GS
2456#include "pp_proto.h"
2457
2458#ifndef PERL_OBJECT
2459END_EXTERN_C
2460#endif
2461
d4cce5f1
NIS
2462/* The following must follow proto.h as #defines mess up syntax */
2463
22c35a8c
GS
2464#if !defined(PERL_FOR_X2P)
2465# include "embedvar.h"
2466#endif
d4cce5f1
NIS
2467
2468/* Now include all the 'global' variables
2469 * If we don't have threads or multiple interpreters
2470 * these include variables that would have been their struct-s
2471 */
533c011a
NIS
2472
2473#define PERLVAR(var,type) EXT type PL_##var;
2474#define PERLVARI(var,type,init) EXT type PL_##var INIT(init);
2475#define PERLVARIC(var,type,init) EXTCONST type PL_##var INIT(init);
d4cce5f1 2476
22239a37 2477#ifndef PERL_GLOBAL_STRUCT
73c4f7a1 2478START_EXTERN_C
d4cce5f1 2479#include "perlvars.h"
73c4f7a1 2480END_EXTERN_C
22239a37 2481#endif
d4cce5f1
NIS
2482
2483#ifndef MULTIPLICITY
d4cce5f1 2484
066ef5b5
GS
2485# include "intrpvar.h"
2486# ifndef USE_THREADS
2487# include "thrdvar.h"
2488# endif
d4cce5f1 2489
22239a37
NIS
2490#endif
2491
76e3520e 2492#ifdef PERL_OBJECT
d0c1b099
GS
2493/*
2494 * The following is a buffer where new variables must
2495 * be defined to maintain binary compatibility with PERL_OBJECT
2496 * for 5.005
2497 */
2498PERLVAR(object_compatibility[30], char)
76e3520e
GS
2499};
2500
22c35a8c
GS
2501# include "embed.h"
2502# if defined(WIN32) && !defined(WIN32IO_IS_STDIO)
2503# define errno CPerlObj::ErrorNo()
2504# endif
76e3520e 2505
22c35a8c
GS
2506# ifdef DOINIT
2507# include "INTERN.h"
2508# else
2509# include "EXTERN.h"
2510# endif
2511
2512/* this has structure inits, so it cannot be included before here */
2513# include "opcode.h"
2514
2515#endif /* PERL_OBJECT */
22239a37 2516
d4cce5f1
NIS
2517#undef PERLVAR
2518#undef PERLVARI
0f3f18a6 2519#undef PERLVARIC
79072805 2520
73c4f7a1
GS
2521START_EXTERN_C
2522
79072805 2523#ifdef DOINIT
bbce6d69 2524
cea2e8a9
GS
2525EXT MGVTBL PL_vtbl_sv = {Perl_magic_get,
2526 Perl_magic_set,
2527 Perl_magic_len,
463ee0b2 2528 0, 0};
cea2e8a9
GS
2529EXT MGVTBL PL_vtbl_env = {0, Perl_magic_set_all_env,
2530 0, Perl_magic_clear_all_env,
66b1d557 2531 0};
cea2e8a9
GS
2532EXT MGVTBL PL_vtbl_envelem = {0, Perl_magic_setenv,
2533 0, Perl_magic_clearenv,
85e6fe83 2534 0};
22c35a8c 2535EXT MGVTBL PL_vtbl_sig = {0, 0, 0, 0, 0};
cea2e8a9
GS
2536EXT MGVTBL PL_vtbl_sigelem = {Perl_magic_getsig,
2537 Perl_magic_setsig,
2538 0, Perl_magic_clearsig,
0c30d9ec 2539 0};
cea2e8a9 2540EXT MGVTBL PL_vtbl_pack = {0, 0, Perl_magic_sizepack, Perl_magic_wipepack,
a0d0e21e 2541 0};
cea2e8a9
GS
2542EXT MGVTBL PL_vtbl_packelem = {Perl_magic_getpack,
2543 Perl_magic_setpack,
2544 0, Perl_magic_clearpack,
463ee0b2 2545 0};
cea2e8a9 2546EXT MGVTBL PL_vtbl_dbline = {0, Perl_magic_setdbline,
463ee0b2 2547 0, 0, 0};
cea2e8a9
GS
2548EXT MGVTBL PL_vtbl_isa = {0, Perl_magic_setisa,
2549 0, Perl_magic_setisa,
fb73857a 2550 0};
cea2e8a9 2551EXT MGVTBL PL_vtbl_isaelem = {0, Perl_magic_setisa,
463ee0b2 2552 0, 0, 0};
cea2e8a9
GS
2553EXT MGVTBL PL_vtbl_arylen = {Perl_magic_getarylen,
2554 Perl_magic_setarylen,
463ee0b2 2555 0, 0, 0};
cea2e8a9
GS
2556EXT MGVTBL PL_vtbl_glob = {Perl_magic_getglob,
2557 Perl_magic_setglob,
463ee0b2 2558 0, 0, 0};
cea2e8a9 2559EXT MGVTBL PL_vtbl_mglob = {0, Perl_magic_setmglob,
463ee0b2 2560 0, 0, 0};
cea2e8a9
GS
2561EXT MGVTBL PL_vtbl_nkeys = {Perl_magic_getnkeys,
2562 Perl_magic_setnkeys,
99abf803 2563 0, 0, 0};
cea2e8a9 2564EXT MGVTBL PL_vtbl_taint = {Perl_magic_gettaint,Perl_magic_settaint,
463ee0b2 2565 0, 0, 0};
cea2e8a9 2566EXT MGVTBL PL_vtbl_substr = {Perl_magic_getsubstr, Perl_magic_setsubstr,
463ee0b2 2567 0, 0, 0};
cea2e8a9
GS
2568EXT MGVTBL PL_vtbl_vec = {Perl_magic_getvec,
2569 Perl_magic_setvec,
463ee0b2 2570 0, 0, 0};
cea2e8a9
GS
2571EXT MGVTBL PL_vtbl_pos = {Perl_magic_getpos,
2572 Perl_magic_setpos,
a0d0e21e 2573 0, 0, 0};
cea2e8a9 2574EXT MGVTBL PL_vtbl_bm = {0, Perl_magic_setbm,
463ee0b2 2575 0, 0, 0};
cea2e8a9 2576EXT MGVTBL PL_vtbl_fm = {0, Perl_magic_setfm,
55497cff 2577 0, 0, 0};
cea2e8a9
GS
2578EXT MGVTBL PL_vtbl_uvar = {Perl_magic_getuvar,
2579 Perl_magic_setuvar,
463ee0b2 2580 0, 0, 0};
f93b4edd 2581#ifdef USE_THREADS
cea2e8a9 2582EXT MGVTBL PL_vtbl_mutex = {0, 0, 0, 0, Perl_magic_mutexfree};
f93b4edd 2583#endif /* USE_THREADS */
cea2e8a9 2584EXT MGVTBL PL_vtbl_defelem = {Perl_magic_getdefelem,Perl_magic_setdefelem,
02270b4e 2585 0, 0, 0};
a0d0e21e 2586
cea2e8a9
GS
2587EXT MGVTBL PL_vtbl_regexp = {0,0,0,0, Perl_magic_freeregexp};
2588EXT MGVTBL PL_vtbl_regdata = {0, 0, Perl_magic_regdata_cnt, 0, 0};
2589EXT MGVTBL PL_vtbl_regdatum = {Perl_magic_regdatum_get, 0, 0, 0, 0};
c277df42 2590
36477c24 2591#ifdef USE_LOCALE_COLLATE
22c35a8c 2592EXT MGVTBL PL_vtbl_collxfrm = {0,
cea2e8a9 2593 Perl_magic_setcollxfrm,
bbce6d69
PP
2594 0, 0, 0};
2595#endif
a0d0e21e 2596
cea2e8a9
GS
2597EXT MGVTBL PL_vtbl_amagic = {0, Perl_magic_setamagic,
2598 0, 0, Perl_magic_setamagic};
2599EXT MGVTBL PL_vtbl_amagicelem = {0, Perl_magic_setamagic,
2600 0, 0, Perl_magic_setamagic};
a0d0e21e 2601
810b8aa5 2602EXT MGVTBL PL_vtbl_backref = {0, 0,
cea2e8a9 2603 0, 0, Perl_magic_killbackrefs};
810b8aa5 2604
bbce6d69
PP
2605#else /* !DOINIT */
2606
22c35a8c
GS
2607EXT MGVTBL PL_vtbl_sv;
2608EXT MGVTBL PL_vtbl_env;
2609EXT MGVTBL PL_vtbl_envelem;
2610EXT MGVTBL PL_vtbl_sig;
2611EXT MGVTBL PL_vtbl_sigelem;
2612EXT MGVTBL PL_vtbl_pack;
2613EXT MGVTBL PL_vtbl_packelem;
2614EXT MGVTBL PL_vtbl_dbline;
2615EXT MGVTBL PL_vtbl_isa;
2616EXT MGVTBL PL_vtbl_isaelem;
2617EXT MGVTBL PL_vtbl_arylen;
2618EXT MGVTBL PL_vtbl_glob;
2619EXT MGVTBL PL_vtbl_mglob;
2620EXT MGVTBL PL_vtbl_nkeys;
2621EXT MGVTBL PL_vtbl_taint;
2622EXT MGVTBL PL_vtbl_substr;
2623EXT MGVTBL PL_vtbl_vec;
2624EXT MGVTBL PL_vtbl_pos;
2625EXT MGVTBL PL_vtbl_bm;
2626EXT MGVTBL PL_vtbl_fm;
2627EXT MGVTBL PL_vtbl_uvar;
a0d0e21e 2628
f93b4edd 2629#ifdef USE_THREADS
22c35a8c 2630EXT MGVTBL PL_vtbl_mutex;
f93b4edd
MB
2631#endif /* USE_THREADS */
2632
22c35a8c
GS
2633EXT MGVTBL PL_vtbl_defelem;
2634EXT MGVTBL PL_vtbl_regexp;
2635EXT MGVTBL PL_vtbl_regdata;
2636EXT MGVTBL PL_vtbl_regdatum;
a0d0e21e 2637
36477c24 2638#ifdef USE_LOCALE_COLLATE
22c35a8c 2639EXT MGVTBL PL_vtbl_collxfrm;
bbce6d69 2640#endif
a0d0e21e 2641
22c35a8c
GS
2642EXT MGVTBL PL_vtbl_amagic;
2643EXT MGVTBL PL_vtbl_amagicelem;
a0d0e21e 2644
810b8aa5
GS
2645EXT MGVTBL PL_vtbl_backref;
2646
bbce6d69 2647#endif /* !DOINIT */
85e6fe83 2648
f5284f61
IZ
2649enum {
2650 fallback_amg, abs_amg,
2651 bool__amg, nomethod_amg,
2652 string_amg, numer_amg,
2653 add_amg, add_ass_amg,
2654 subtr_amg, subtr_ass_amg,
2655 mult_amg, mult_ass_amg,
2656 div_amg, div_ass_amg,
2657 modulo_amg, modulo_ass_amg,
2658 pow_amg, pow_ass_amg,
2659 lshift_amg, lshift_ass_amg,
2660 rshift_amg, rshift_ass_amg,
2661 band_amg, band_ass_amg,
2662 bor_amg, bor_ass_amg,
2663 bxor_amg, bxor_ass_amg,
2664 lt_amg, le_amg,
2665 gt_amg, ge_amg,
2666 eq_amg, ne_amg,
2667 ncmp_amg, scmp_amg,
2668 slt_amg, sle_amg,
2669 sgt_amg, sge_amg,
2670 seq_amg, sne_amg,
2671 not_amg, compl_amg,
2672 inc_amg, dec_amg,
2673 atan2_amg, cos_amg,
2674 sin_amg, exp_amg,
2675 log_amg, sqrt_amg,
2676 repeat_amg, repeat_ass_amg,
2677 concat_amg, concat_ass_amg,
2678 copy_amg, neg_amg,
2679 to_sv_amg, to_av_amg,
2680 to_hv_amg, to_gv_amg,
2681 to_cv_amg, iter_amg,
64a0062a
JH
2682 max_amg_code
2683 /* Do not leave a trailing comma here. C9X allows it, C89 doesn't. */
f5284f61
IZ
2684};
2685
2686#define NofAMmeth max_amg_code
2687
a0d0e21e 2688#ifdef DOINIT
22c35a8c 2689EXTCONST char * PL_AMG_names[NofAMmeth] = {
a6006777
PP
2690 "fallback", "abs", /* "fallback" should be the first. */
2691 "bool", "nomethod",
2692 "\"\"", "0+",
2693 "+", "+=",
2694 "-", "-=",
2695 "*", "*=",
2696 "/", "/=",
2697 "%", "%=",
2698 "**", "**=",
2699 "<<", "<<=",
2700 ">>", ">>=",
2701 "&", "&=",
2702 "|", "|=",
2703 "^", "^=",
2704 "<", "<=",
2705 ">", ">=",
2706 "==", "!=",
2707 "<=>", "cmp",
2708 "lt", "le",
2709 "gt", "ge",
2710 "eq", "ne",
2711 "!", "~",
2712 "++", "--",
2713 "atan2", "cos",
2714 "sin", "exp",
2715 "log", "sqrt",
2716 "x", "x=",
2717 ".", ".=",
f5284f61
IZ
2718 "=", "neg",
2719 "${}", "@{}",
2720 "%{}", "*{}",
2721 "&{}", "<>",
a0d0e21e
LW
2722};
2723#else
22c35a8c 2724EXTCONST char * PL_AMG_names[NofAMmeth];
a0d0e21e
LW
2725#endif /* def INITAMAGIC */
2726
73c4f7a1
GS
2727END_EXTERN_C
2728
a6006777 2729struct am_table {
a0d0e21e
LW
2730 long was_ok_sub;
2731 long was_ok_am;
a6006777
PP
2732 U32 flags;
2733 CV* table[NofAMmeth];
a0d0e21e
LW
2734 long fallback;
2735};
a6006777
PP
2736struct am_table_short {
2737 long was_ok_sub;
2738 long was_ok_am;
2739 U32 flags;
2740};
a0d0e21e 2741typedef struct am_table AMT;
a6006777 2742typedef struct am_table_short AMTS;
a0d0e21e
LW
2743
2744#define AMGfallNEVER 1
2745#define AMGfallNO 2
2746#define AMGfallYES 3
2747
a6006777
PP
2748#define AMTf_AMAGIC 1
2749#define AMT_AMAGIC(amt) ((amt)->flags & AMTf_AMAGIC)
2750#define AMT_AMAGIC_on(amt) ((amt)->flags |= AMTf_AMAGIC)
2751#define AMT_AMAGIC_off(amt) ((amt)->flags &= ~AMTf_AMAGIC)
2752
c0315cdf
JH
2753
2754/*
2755 * some compilers like to redefine cos et alia as faster
2756 * (and less accurate?) versions called F_cos et cetera (Quidquid
2757 * latine dictum sit, altum viditur.) This trick collides with
2758 * the Perl overloading (amg). The following #defines fool both.
2759 */
2760
2761#ifdef _FASTMATH
2762# ifdef atan2
2763# define F_atan2_amg atan2_amg
2764# endif
2765# ifdef cos
2766# define F_cos_amg cos_amg
2767# endif
2768# ifdef exp
2769# define F_exp_amg exp_amg
2770# endif
2771# ifdef log
2772# define F_log_amg log_amg
2773# endif
2774# ifdef pow
2775# define F_pow_amg pow_amg
2776# endif
2777# ifdef sin
2778# define F_sin_amg sin_amg
2779# endif
2780# ifdef sqrt
2781# define F_sqrt_amg sqrt_amg
2782# endif
2783#endif /* _FASTMATH */
2784
491527d0 2785#define PERLDB_ALL 0x3f /* No _NONAME, _GOTO */
84902520
TB
2786#define PERLDBf_SUB 0x01 /* Debug sub enter/exit. */
2787#define PERLDBf_LINE 0x02 /* Keep line #. */
2788#define PERLDBf_NOOPT 0x04 /* Switch off optimizations. */
2789#define PERLDBf_INTER 0x08 /* Preserve more data for
2790 later inspections. */
2791#define PERLDBf_SUBLINE 0x10 /* Keep subr source lines. */
2792#define PERLDBf_SINGLE 0x20 /* Start with single-step on. */
491527d0
GS
2793#define PERLDBf_NONAME 0x40 /* For _SUB: no name of the subr. */
2794#define PERLDBf_GOTO 0x80 /* Report goto: call DB::goto. */
84902520 2795
3280af22
NIS
2796#define PERLDB_SUB (PL_perldb && (PL_perldb & PERLDBf_SUB))
2797#define PERLDB_LINE (PL_perldb && (PL_perldb & PERLDBf_LINE))
2798#define PERLDB_NOOPT (PL_perldb && (PL_perldb & PERLDBf_NOOPT))
2799#define PERLDB_INTER (PL_perldb && (PL_perldb & PERLDBf_INTER))
2800#define PERLDB_SUBLINE (PL_perldb && (PL_perldb & PERLDBf_SUBLINE))
2801#define PERLDB_SINGLE (PL_perldb && (PL_perldb & PERLDBf_SINGLE))
2802#define PERLDB_SUB_NN (PL_perldb && (PL_perldb & (PERLDBf_NONAME)))
2803#define PERLDB_GOTO (PL_perldb && (PL_perldb & PERLDBf_GOTO))
84902520 2804
bbce6d69 2805
36477c24 2806#ifdef USE_LOCALE_NUMERIC
bbce6d69 2807
36477c24
PP
2808#define SET_NUMERIC_STANDARD() \
2809 STMT_START { \
864dbfa3
GS
2810 if (! PL_numeric_standard) \
2811 set_numeric_standard(); \
36477c24
PP
2812 } STMT_END
2813
2814#define SET_NUMERIC_LOCAL() \
2815 STMT_START { \
3280af22 2816 if (! PL_numeric_local) \
864dbfa3 2817 set_numeric_local(); \
36477c24 2818 } STMT_END
bbce6d69 2819
36477c24 2820#else /* !USE_LOCALE_NUMERIC */
bbce6d69 2821
36477c24
PP
2822#define SET_NUMERIC_STANDARD() /**/
2823#define SET_NUMERIC_LOCAL() /**/
bbce6d69 2824
36477c24 2825#endif /* !USE_LOCALE_NUMERIC */
a0d0e21e 2826
e5c9fcd0 2827#if !defined(PERLIO_IS_STDIO) && defined(HASATTRIBUTE)
760ac839
LW
2828/*
2829 * Now we have __attribute__ out of the way
2830 * Remap printf
2831 */
2832#define printf PerlIO_stdoutf
2833#endif
2834
a868473f
NIS
2835#ifndef PERL_SCRIPT_MODE
2836#define PERL_SCRIPT_MODE "r"
2837#endif
2838
fba3b22e
MB
2839/*
2840 * nice_chunk and nice_chunk size need to be set
2841 * and queried under the protection of sv_mutex
2842 */
2843#define offer_nice_chunk(chunk, chunk_size) do { \
940cb80d 2844 LOCK_SV_MUTEX; \
3280af22
NIS
2845 if (!PL_nice_chunk) { \
2846 PL_nice_chunk = (char*)(chunk); \
2847 PL_nice_chunk_size = (chunk_size); \
fba3b22e 2848 } \
fc80cf79
GS
2849 else { \
2850 Safefree(chunk); \
2851 } \
940cb80d 2852 UNLOCK_SV_MUTEX; \
fba3b22e
MB
2853 } while (0)
2854
bd89102f
AD
2855#ifdef HAS_SEM
2856# include <sys/ipc.h>
2857# include <sys/sem.h>
2858# ifndef HAS_UNION_SEMUN /* Provide the union semun. */
2859 union semun {
2860 int val;
2861 struct semid_ds *buf;
2862 unsigned short *array;
2863 };
2864# endif
2865# ifdef USE_SEMCTL_SEMUN
2866# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun)
2867# else
2868# ifdef USE_SEMCTL_SEMID_DS
2869# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun.buf)
2870# endif
2871# endif
bd89102f 2872#endif
49f531da 2873
ff49bff8
JH
2874/* Mention
2875
2876 INSTALL_USR_BIN_PERL
2877
2878 I_SYS_MMAN
2879 HAS_MMAP
2880 HAS_MUNMAP
2881 HAS_MPROTECT
2882 HAS_MSYNC
2883 HAS_MADVISE
2884 Mmap_t
2885
2886 here so that Configure picks them up. */
104d25b7
JH
2887
2888#ifdef IAMSUID
2889
2890#ifdef I_SYS_STATVFS
32b3cf08
JH
2891# include <sys/statvfs.h> /* for f?statvfs() */
2892#endif
2893#ifdef I_SYS_MOUNT
2894# include <sys/mount.h> /* for *BSD f?statfs() */
2895#endif
2896#ifdef I_MNTENT
2897# include <mntent.h> /* for getmntent() */
104d25b7
JH
2898#endif
2899
2900#endif /* IAMSUID */
2901
4d8076ea 2902/* and finally... */
cceca5ed 2903#define PERL_PATCHLEVEL_H_IMPLICIT
4d8076ea 2904#include "patchlevel.h"
cceca5ed 2905#undef PERL_PATCHLEVEL_H_IMPLICIT
4d8076ea 2906
85e6fe83 2907#endif /* Include guard */