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