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