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