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