This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate mainperl.
[perl5.git] / perl.h
CommitLineData
a0d0e21e 1/* perl.h
a687059c 2 *
9607fc9c 3 * Copyright (c) 1987-1997, Larry Wall
a687059c 4 *
352d5a3a
LW
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
8d063cd8 7 *
8d063cd8 8 */
85e6fe83
LW
9#ifndef H_PERL
10#define H_PERL 1
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
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
PP
434# define safefree free
435
436#endif /* MYMALLOC */
4633a7c4 437
ff68c719
PP
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
PP
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
PP
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
PP
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
PP
518# ifdef HAS_MEMSET
519# define memzero(d,l) memset(d,0,l)
79072805 520# else
c635e13b
PP
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
PP
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
PP
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
aba27d88 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
PP
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)
85ab1d1d 839 will introduce binary incompatibility.
5ff3f7a4
GS
840
841 Summary: a long long system needs to add -DUSE_LONG_LONG to $ccflags
842 to get quads -- and if its pointers are still 32 bits, this will break
843 binary compatibility. Casting an IV (a long long) to a pointer will
844 truncate half of the IV away.
845
846 --jhi September 1998 */
847
848#if INTSIZE == 4 && LONGSIZE == 4 && PTRSIZE == 4
849# define PERL_ILP32
850# if defined(HAS_LONG_LONG) && LONGLONGSIZE == 8
851# define PERL_ILP32LL64
45d8adaa 852# endif
f86702cc
PP
853#endif
854
5ff3f7a4
GS
855#if LONGSIZE == 8 && PTRSIZE == 8
856# define PERL_LP64
857# if INTSIZE == 8
858# define PERL_ILP64
859# endif
860#endif
861
862#ifdef HAS_INT64_T
863# define Quad_t int64_t
864# define PERL_QUAD_IS_INT64_T
865#else
866# if LONGSIZE == 8
867# define Quad_t long
868# define PERL_QUAD_IS_LONG
869# else
870# ifdef USE_LONG_LONG /* See above note about LP32. --jhi */
871# if defined(HAS_LONG_LONG) && LONGLONGSIZE == 8
872# define Quad_t long long
873# define PERL_QUAD_IS_LONG_LONG
874# endif
875# endif
876# ifndef Quad_t
877# if INTSIZE == 8
878# define Quad_t int
879# define PERL_QUAD_IS_INT
880# endif
881# endif
882# endif
6ee623d5
GS
883#endif
884
f86702cc
PP
885#ifdef Quad_t
886# define HAS_QUAD
5ff3f7a4
GS
887#endif
888
889/* See above note on LP32 about the PTRSIZE test. --jhi */
85ab1d1d 890#if defined(HAS_QUAD) && (PTRSIZE > 4 || defined(USE_LONG_LONG))
5ff3f7a4
GS
891 typedef Quad_t IV;
892 typedef unsigned Quad_t UV;
893# if defined(PERL_QUAD_IS_INT64_T) && defined(INT64_MAX)
894# define IV_MAX INT64_MAX
895# define IV_MIN INT64_MIN
896# define UV_MAX UINT64_MAX
897# define UV_MIN UINT64_MIN
898# else
899# define IV_MAX PERL_QUAD_MAX
900# define IV_MIN PERL_QUAD_MIN
901# define UV_MAX PERL_UQUAD_MAX
902# define UV_MIN PERL_UQUAD_MIN
903# endif
79072805 904#else
5ff3f7a4
GS
905 typedef long IV;
906 typedef unsigned long UV;
907# if defined(INT32_MAX) && LONGSIZE == 4
908# define IV_MAX INT32_MAX
909# define IV_MIN INT32_MIN
910# define UV_MAX UINT32_MAX
911# define UV_MIN UINT32_MIN
912# else
913# define IV_MAX PERL_LONG_MAX
914# define IV_MIN PERL_LONG_MIN
915# define UV_MAX PERL_ULONG_MAX
916# define UV_MIN PERL_ULONG_MIN
917# endif
79072805
LW
918#endif
919
760ac839
LW
920/* Previously these definitions used hardcoded figures.
921 * It is hoped these formula are more portable, although
922 * no data one way or another is presently known to me.
923 * The "PERL_" names are used because these calculated constants
924 * do not meet the ANSI requirements for LONG_MAX, etc., which
925 * need to be constants acceptable to #if - kja
926 * define PERL_LONG_MAX 2147483647L
927 * define PERL_LONG_MIN (-LONG_MAX - 1)
928 * define PERL ULONG_MAX 4294967295L
929 */
930
931#ifdef I_LIMITS /* Needed for cast_xxx() functions below. */
932# include <limits.h>
933#else
934#ifdef I_VALUES
935# include <values.h>
936#endif
937#endif
938
99abf803
PP
939/*
940 * Try to figure out max and min values for the integral types. THE CORRECT
941 * SOLUTION TO THIS MESS: ADAPT enquire.c FROM GCC INTO CONFIGURE. The
942 * following hacks are used if neither limits.h or values.h provide them:
943 * U<TYPE>_MAX: for types >= int: ~(unsigned TYPE)0
944 * for types < int: (unsigned TYPE)~(unsigned)0
945 * The argument to ~ must be unsigned so that later signed->unsigned
946 * conversion can't modify the value's bit pattern (e.g. -0 -> +0),
947 * and it must not be smaller than int because ~ does integral promotion.
948 * <type>_MAX: (<type>) (U<type>_MAX >> 1)
949 * <type>_MIN: -<type>_MAX - <is_twos_complement_architecture: (3 & -1) == 3>.
950 * The latter is a hack which happens to work on some machines but
951 * does *not* catch any random system, or things like integer types
952 * with NaN if that is possible.
953 *
954 * All of the types are explicitly cast to prevent accidental loss of
955 * numeric range, and in the hope that they will be less likely to confuse
956 * over-eager optimizers.
957 *
958 */
27d4fb96 959
99abf803
PP
960#define PERL_UCHAR_MIN ((unsigned char)0)
961
962#ifdef UCHAR_MAX
963# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
27d4fb96 964#else
99abf803
PP
965# ifdef MAXUCHAR
966# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
27d4fb96 967# else
99abf803 968# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
27d4fb96
PP
969# endif
970#endif
99abf803
PP
971
972/*
973 * CHAR_MIN and CHAR_MAX are not included here, as the (char) type may be
974 * ambiguous. It may be equivalent to (signed char) or (unsigned char)
975 * depending on local options. Until Configure detects this (or at least
976 * detects whether the "signed" keyword is available) the CHAR ranges
977 * will not be included. UCHAR functions normally.
978 * - kja
979 */
27d4fb96 980
99abf803
PP
981#define PERL_USHORT_MIN ((unsigned short)0)
982
983#ifdef USHORT_MAX
984# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
27d4fb96 985#else
99abf803
PP
986# ifdef MAXUSHORT
987# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
27d4fb96 988# else
ef2f54b0
CB
989# ifdef USHRT_MAX
990# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
991# else
992# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
993# endif
27d4fb96
PP
994# endif
995#endif
996
27d4fb96 997#ifdef SHORT_MAX
99abf803 998# define PERL_SHORT_MAX ((short)SHORT_MAX)
27d4fb96
PP
999#else
1000# ifdef MAXSHORT /* Often used in <values.h> */
99abf803 1001# define PERL_SHORT_MAX ((short)MAXSHORT)
27d4fb96 1002# else
ef2f54b0
CB
1003# ifdef SHRT_MAX
1004# define PERL_SHORT_MAX ((short)SHRT_MAX)
1005# else
1006# define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
1007# endif
27d4fb96
PP
1008# endif
1009#endif
1010
1011#ifdef SHORT_MIN
99abf803 1012# define PERL_SHORT_MIN ((short)SHORT_MIN)
27d4fb96
PP
1013#else
1014# ifdef MINSHORT
99abf803 1015# define PERL_SHORT_MIN ((short)MINSHORT)
27d4fb96 1016# else
ef2f54b0
CB
1017# ifdef SHRT_MIN
1018# define PERL_SHORT_MIN ((short)SHRT_MIN)
1019# else
1020# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
1021# endif
27d4fb96
PP
1022# endif
1023#endif
1024
99abf803
PP
1025#ifdef UINT_MAX
1026# define PERL_UINT_MAX ((unsigned int)UINT_MAX)
27d4fb96 1027#else
99abf803
PP
1028# ifdef MAXUINT
1029# define PERL_UINT_MAX ((unsigned int)MAXUINT)
27d4fb96 1030# else
99abf803 1031# define PERL_UINT_MAX (~(unsigned int)0)
27d4fb96
PP
1032# endif
1033#endif
1034
99abf803 1035#define PERL_UINT_MIN ((unsigned int)0)
27d4fb96
PP
1036
1037#ifdef INT_MAX
99abf803 1038# define PERL_INT_MAX ((int)INT_MAX)
27d4fb96
PP
1039#else
1040# ifdef MAXINT /* Often used in <values.h> */
99abf803 1041# define PERL_INT_MAX ((int)MAXINT)
27d4fb96 1042# else
99abf803 1043# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
27d4fb96
PP
1044# endif
1045#endif
1046
1047#ifdef INT_MIN
99abf803 1048# define PERL_INT_MIN ((int)INT_MIN)
27d4fb96
PP
1049#else
1050# ifdef MININT
99abf803 1051# define PERL_INT_MIN ((int)MININT)
27d4fb96
PP
1052# else
1053# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
1054# endif
1055#endif
1056
99abf803
PP
1057#ifdef ULONG_MAX
1058# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
27d4fb96 1059#else
99abf803
PP
1060# ifdef MAXULONG
1061# define PERL_ULONG_MAX ((unsigned long)MAXULONG)
27d4fb96 1062# else
99abf803 1063# define PERL_ULONG_MAX (~(unsigned long)0)
27d4fb96
PP
1064# endif
1065#endif
1066
99abf803 1067#define PERL_ULONG_MIN ((unsigned long)0L)
27d4fb96 1068
760ac839 1069#ifdef LONG_MAX
99abf803 1070# define PERL_LONG_MAX ((long)LONG_MAX)
760ac839
LW
1071#else
1072# ifdef MAXLONG /* Often used in <values.h> */
99abf803 1073# define PERL_LONG_MAX ((long)MAXLONG)
760ac839 1074# else
99abf803 1075# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
760ac839
LW
1076# endif
1077#endif
1078
1079#ifdef LONG_MIN
99abf803 1080# define PERL_LONG_MIN ((long)LONG_MIN)
760ac839
LW
1081#else
1082# ifdef MINLONG
99abf803 1083# define PERL_LONG_MIN ((long)MINLONG)
760ac839 1084# else
27d4fb96 1085# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
760ac839
LW
1086# endif
1087#endif
1088
99abf803
PP
1089#ifdef HAS_QUAD
1090
1091# ifdef UQUAD_MAX
1092# define PERL_UQUAD_MAX ((UV)UQUAD_MAX)
760ac839 1093# else
99abf803 1094# define PERL_UQUAD_MAX (~(UV)0)
760ac839 1095# endif
760ac839 1096
99abf803 1097# define PERL_UQUAD_MIN ((UV)0)
27d4fb96 1098
27d4fb96 1099# ifdef QUAD_MAX
99abf803 1100# define PERL_QUAD_MAX ((IV)QUAD_MAX)
27d4fb96 1101# else
99abf803 1102# define PERL_QUAD_MAX ((IV) (PERL_UQUAD_MAX >> 1))
27d4fb96
PP
1103# endif
1104
1105# ifdef QUAD_MIN
99abf803 1106# define PERL_QUAD_MIN ((IV)QUAD_MIN)
27d4fb96 1107# else
a6e633de 1108# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
27d4fb96
PP
1109# endif
1110
79072805
LW
1111#endif
1112
ee0007ab 1113typedef MEM_SIZE STRLEN;
450a55e4 1114
79072805
LW
1115typedef struct op OP;
1116typedef struct cop COP;
1117typedef struct unop UNOP;
1118typedef struct binop BINOP;
1119typedef struct listop LISTOP;
1120typedef struct logop LOGOP;
1121typedef struct condop CONDOP;
1122typedef struct pmop PMOP;
1123typedef struct svop SVOP;
1124typedef struct gvop GVOP;
1125typedef struct pvop PVOP;
79072805
LW
1126typedef struct loop LOOP;
1127
1128typedef struct Outrec Outrec;
93a17b20 1129typedef struct interpreter PerlInterpreter;
3e3baf6d
TB
1130#ifndef __BORLANDC__
1131typedef struct ff FF; /* XXX not defined anywhere, should go? */
1132#endif
79072805
LW
1133typedef struct sv SV;
1134typedef struct av AV;
1135typedef struct hv HV;
1136typedef struct cv CV;
378cc40b 1137typedef struct regexp REGEXP;
79072805 1138typedef struct gp GP;
0c30d9ec 1139typedef struct gv GV;
8990e307 1140typedef struct io IO;
c09156bb 1141typedef struct context PERL_CONTEXT;
79072805
LW
1142typedef struct block BLOCK;
1143
1144typedef struct magic MAGIC;
ed6116ce 1145typedef struct xrv XRV;
79072805
LW
1146typedef struct xpv XPV;
1147typedef struct xpviv XPVIV;
ff68c719 1148typedef struct xpvuv XPVUV;
79072805
LW
1149typedef struct xpvnv XPVNV;
1150typedef struct xpvmg XPVMG;
1151typedef struct xpvlv XPVLV;
1152typedef struct xpvav XPVAV;
1153typedef struct xpvhv XPVHV;
1154typedef struct xpvgv XPVGV;
1155typedef struct xpvcv XPVCV;
1156typedef struct xpvbm XPVBM;
1157typedef struct xpvfm XPVFM;
8990e307 1158typedef struct xpvio XPVIO;
79072805
LW
1159typedef struct mgvtbl MGVTBL;
1160typedef union any ANY;
8d063cd8 1161
378cc40b 1162#include "handy.h"
a0d0e21e 1163
5ff3f7a4
GS
1164#ifdef USE_64_BITS
1165# ifdef USE_64_BIT_FILES
1166# ifndef USE_64_BIT_IO
1167# define USE_64_BIT_IO
1168# endif
1169# ifndef USE_64_BIT_STDIO
1170# define USE_64_BIT_STDIO
1171# endif
1172# ifndef USE_64_BIT_DBM
1173# define USE_64_BIT_DBM
1174# endif
1175# endif
1176# ifdef USE_64_BIT_IO
1177# ifdef HAS_FSTAT64
1178# define fstat fstat64
1179# endif
1180# ifdef HAS_FTRUNCATE64
1181# define ftruncate ftruncate64
1182# endif
1183# ifdef HAS_LSEEK64
1184# define lseek lseek64
1185# ifdef HAS_OFF64_T
1186# undef Off_t
1187# define Off_t off64_t
1188# endif
1189# endif
1190# ifdef HAS_LSTAT64
1191# define lstat lstat64
1192# endif
1193 /* Some systems have open64() in libc but use that only
1194 * for true LP64 mode, in mixed mode (ILP32LL64, for example)
85ab1d1d
JH
1195 * they use the vanilla open(). Such systems should undefine
1196 * d_open64 in their hints files. --jhi */
1197# if defined(HAS_OPEN64)
5ff3f7a4
GS
1198# define open open64
1199# endif
1200# ifdef HAS_OPENDIR64
1201# define opendir opendir64
1202# endif
1203# ifdef HAS_READDIR64
1204# define readdir readdir64
1205# ifdef HAS_STRUCT_DIRENT64
1206# define dirent dirent64
1207# endif
1208# endif
1209# ifdef HAS_SEEKDIR64
1210# define seekdir seekdir64
1211# endif
1212# ifdef HAS_STAT64
1213# define stat stat64 /* Affects also struct stat, hopefully okay. */
1214# endif
1215# ifdef HAS_TELLDIR64
1216# define telldir telldir64
1217# endif
1218# ifdef HAS_TRUNCATE64
1219# define truncate truncate64
1220# endif
1221 /* flock is not #defined here to be flock64 because it seems
1222 that a system may have struct flock64 but still use flock()
1223 and not flock64(). The actual flocking code in pp_sys.c
1224 must be changed. Also lockf and lockf64 must be dealt
1225 with in pp_sys.c. --jhi */
1226# endif
1227# ifdef USE_64_BIT_STDIO
1228# ifdef HAS_FGETPOS64
1229# define fgetpos fgetpos64
1230# endif
1231# ifdef HAS_FOPEN64
1232# define fopen fopen64
1233# endif
1234# ifdef HAS_FREOPEN64
1235# define freopen freopen64
1236# endif
1237# ifdef HAS_FSEEK64
1238# define fseek fseek64
1239# endif
1240# ifdef HAS_FSEEKO64
1241# define fseeko fseeko64
1242# endif
1243# ifdef HAS_FSETPOS64
1244# define fsetpos fsetpos64
1245# endif
1246# ifdef HAS_FTELL64
1247# define ftell ftell64
1248# endif
1249# ifdef HAS_FTELLO64
1250# define ftello ftello64
1251# endif
1252# ifdef HAS_TMPFILE64
1253# define tmpfile tmpfile64
1254# endif
1255# endif
1256# ifdef USE_64_BIT_DBM
1257# ifdef HAS_DBMINIT64
1258# define dbminit dbminit64
1259# endif
1260# ifdef HAS_DBMCLOSE64
1261# define dbmclose dbmclose64
1262# endif
1263# ifdef HAS_FETCH64
1264# define fetch fetch64
1265# endif
1266# ifdef HAS_DELETE64
1267# define delete delete64
1268# endif
1269# ifdef HAS_STORE64
1270# define store store64
1271# endif
1272# ifdef HAS_FIRSTKEY64
1273# define firstkey firstkey64
1274# endif
1275# ifdef HAS_NEXTKEY64
1276# define nextkey nextkey64
1277# endif
1278# endif
1279#endif
1280
873ef191
GS
1281#ifdef PERL_OBJECT
1282typedef I32 (*filter_t) _((CPerlObj*, int, SV *, int));
1283#else
16d20bd9 1284typedef I32 (*filter_t) _((int, SV *, int));
873ef191
GS
1285#endif
1286
16d20bd9 1287#define FILTER_READ(idx, sv, len) filter_read(idx, sv, len)
3280af22
NIS
1288#define FILTER_DATA(idx) (AvARRAY(PL_rsfp_filters)[idx])
1289#define FILTER_ISREADER(idx) (idx >= AvFILLp(PL_rsfp_filters))
16d20bd9 1290
748a9306 1291#ifdef DOSISH
4633a7c4
LW
1292# if defined(OS2)
1293# include "os2ish.h"
1294# else
748a9306 1295# include "dosish.h"
4633a7c4 1296# endif
a0d0e21e 1297#else
748a9306
LW
1298# if defined(VMS)
1299# include "vmsish.h"
1300# else
0c30d9ec
PP
1301# if defined(PLAN9)
1302# include "./plan9/plan9ish.h"
1303# else
1d84e8df
JH
1304# if defined(MPE)
1305# include "mpeix/mpeixish.h"
1306# else
495c5fdc
GP
1307# if defined(__VOS__)
1308# include "vosish.h"
1309# else
1310# include "unixish.h"
1311# endif
1d84e8df 1312# endif
0c30d9ec 1313# endif
748a9306 1314# endif
32f822de
GS
1315#endif
1316
ac4c12e7
GS
1317#ifndef FUNC_NAME_TO_PTR
1318#define FUNC_NAME_TO_PTR(name) name
1319#endif
1320
32f822de 1321/*
dd96f567
IZ
1322 * USE_THREADS needs to be after unixish.h as <pthread.h> includes
1323 * <sys/signal.h> which defines NSIG - which will stop inclusion of <signal.h>
32f822de
GS
1324 * this results in many functions being undeclared which bothers C++
1325 * May make sense to have threads after "*ish.h" anyway
1326 */
1327
1328#ifdef USE_THREADS
79d59c5f
GS
1329 /* pending resolution of licensing issues, we avoid the erstwhile
1330 * atomic.h everywhere */
1331# define EMULATE_ATOMIC_REFCOUNTS
1332
32f822de
GS
1333# ifdef FAKE_THREADS
1334# include "fakethr.h"
1335# else
1336# ifdef WIN32
1337# include <win32thread.h>
1338# else
dd96f567
IZ
1339# ifdef OS2
1340# include "os2thread.h"
1341# else
1342# include <pthread.h>
c6ee37c5 1343typedef pthread_t perl_os_thread;
32f822de
GS
1344typedef pthread_mutex_t perl_mutex;
1345typedef pthread_cond_t perl_cond;
1346typedef pthread_key_t perl_key;
dd96f567 1347# endif /* OS2 */
32f822de
GS
1348# endif /* WIN32 */
1349# endif /* FAKE_THREADS */
1350#endif /* USE_THREADS */
1351
1352
3fc1aec6 1353
68dc0745 1354#ifdef VMS
6b88bc9c 1355# define STATUS_NATIVE PL_statusvalue_vms
68dc0745 1356# define STATUS_NATIVE_EXPORT \
6b88bc9c 1357 ((I32)PL_statusvalue_vms == -1 ? 44 : PL_statusvalue_vms)
68dc0745
PP
1358# define STATUS_NATIVE_SET(n) \
1359 STMT_START { \
6b88bc9c
GS
1360 PL_statusvalue_vms = (n); \
1361 if ((I32)PL_statusvalue_vms == -1) \
3280af22 1362 PL_statusvalue = -1; \
6b88bc9c 1363 else if (PL_statusvalue_vms & STS$M_SUCCESS) \
3280af22 1364 PL_statusvalue = 0; \
6b88bc9c
GS
1365 else if ((PL_statusvalue_vms & STS$M_SEVERITY) == 0) \
1366 PL_statusvalue = 1 << 8; \
68dc0745 1367 else \
6b88bc9c 1368 PL_statusvalue = (PL_statusvalue_vms & STS$M_SEVERITY) << 8; \
68dc0745 1369 } STMT_END
3280af22 1370# define STATUS_POSIX PL_statusvalue
68dc0745
PP
1371# ifdef VMSISH_STATUS
1372# define STATUS_CURRENT (VMSISH_STATUS ? STATUS_NATIVE : STATUS_POSIX)
1373# else
1374# define STATUS_CURRENT STATUS_POSIX
1375# endif
1376# define STATUS_POSIX_SET(n) \
1377 STMT_START { \
3280af22
NIS
1378 PL_statusvalue = (n); \
1379 if (PL_statusvalue != -1) { \
1380 PL_statusvalue &= 0xFFFF; \
6b88bc9c 1381 PL_statusvalue_vms = PL_statusvalue ? 44 : 1; \
68dc0745 1382 } \
6b88bc9c 1383 else PL_statusvalue_vms = -1; \
68dc0745 1384 } STMT_END
6b88bc9c
GS
1385# define STATUS_ALL_SUCCESS (PL_statusvalue = 0, PL_statusvalue_vms = 1)
1386# define STATUS_ALL_FAILURE (PL_statusvalue = 1, PL_statusvalue_vms = 44)
68dc0745
PP
1387#else
1388# define STATUS_NATIVE STATUS_POSIX
1389# define STATUS_NATIVE_EXPORT STATUS_POSIX
1390# define STATUS_NATIVE_SET STATUS_POSIX_SET
3280af22 1391# define STATUS_POSIX PL_statusvalue
68dc0745
PP
1392# define STATUS_POSIX_SET(n) \
1393 STMT_START { \
3280af22
NIS
1394 PL_statusvalue = (n); \
1395 if (PL_statusvalue != -1) \
1396 PL_statusvalue &= 0xFFFF; \
68dc0745
PP
1397 } STMT_END
1398# define STATUS_CURRENT STATUS_POSIX
3280af22
NIS
1399# define STATUS_ALL_SUCCESS (PL_statusvalue = 0)
1400# define STATUS_ALL_FAILURE (PL_statusvalue = 1)
68dc0745
PP
1401#endif
1402
3fc1aec6
PP
1403/* Some unistd.h's give a prototype for pause() even though
1404 HAS_PAUSE ends up undefined. This causes the #define
1405 below to be rejected by the compmiler. Sigh.
1406*/
1407#ifdef HAS_PAUSE
1408#define Pause pause
1409#else
1410#define Pause() sleep((32767<<16)+32767)
748a9306
LW
1411#endif
1412
1413#ifndef IOCPARM_LEN
1414# ifdef IOCPARM_MASK
1415 /* on BSDish systes we're safe */
1416# define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK)
1417# else
1418 /* otherwise guess at what's safe */
1419# define IOCPARM_LEN(x) 256
1420# endif
a0d0e21e
LW
1421#endif
1422
0f4eea8f
DL
1423#ifdef UNION_ANY_DEFINITION
1424UNION_ANY_DEFINITION;
1425#else
79072805
LW
1426union any {
1427 void* any_ptr;
1428 I32 any_i32;
a0d0e21e 1429 IV any_iv;
85e6fe83 1430 long any_long;
565764a8 1431 void (CPERLscope(*any_dptr)) _((void*));
79072805 1432};
0f4eea8f 1433#endif
79072805 1434
11343788 1435#ifdef USE_THREADS
52e1cb5e 1436#define ARGSproto struct perl_thread *thr
11343788
MB
1437#else
1438#define ARGSproto void
1439#endif /* USE_THREADS */
1440
5aabfad6
PP
1441/* Work around some cygwin32 problems with importing global symbols */
1442#if defined(CYGWIN32) && defined(DLLIMPORT)
1443# include "cw32imp.h"
1444#endif
1445
378cc40b 1446#include "regexp.h"
79072805 1447#include "sv.h"
378cc40b 1448#include "util.h"
8d063cd8 1449#include "form.h"
79072805
LW
1450#include "gv.h"
1451#include "cv.h"
1452#include "opcode.h"
1453#include "op.h"
1454#include "cop.h"
1455#include "av.h"
1456#include "hv.h"
1457#include "mg.h"
1458#include "scope.h"
599cee73 1459#include "warning.h"
d613ef02
GS
1460#include "bytecode.h"
1461#include "byterun.h"
a0ed51b3 1462#include "utf8.h"
8d063cd8 1463
7fae4e64
GS
1464/* Current curly descriptor */
1465typedef struct curcur CURCUR;
1466struct curcur {
1467 int parenfloor; /* how far back to strip paren data */
1468 int cur; /* how many instances of scan we've matched */
1469 int min; /* the minimal number of scans to match */
1470 int max; /* the maximal number of scans to match */
1471 int minmod; /* whether to work our way up or down */
1472 regnode * scan; /* the thing to match */
1473 regnode * next; /* what has to match after it */
1474 char * lastloc; /* where we started matching this scan */
1475 CURCUR * oldcc; /* current curly before we started this one */
1476};
1477
1478typedef struct _sublex_info SUBLEXINFO;
1479struct _sublex_info {
1480 I32 super_state; /* lexer state to save */
1481 I32 sub_inwhat; /* "lex_inwhat" to use */
1482 OP *sub_op; /* "lex_op" to use */
1483};
1484
455ece5e 1485typedef struct magic_state MGS; /* struct magic_state defined in mg.c */
76e3520e 1486
455ece5e 1487#ifdef PERL_OBJECT
76e3520e
GS
1488typedef struct {
1489 I32 len_min;
1490 I32 len_delta;
1491 I32 pos_min;
1492 I32 pos_delta;
1493 SV *last_found;
1494 I32 last_end; /* min value, <0 unless valid. */
1495 I32 last_start_min;
1496 I32 last_start_max;
1497 SV **longest; /* Either &l_fixed, or &l_float. */
1498 SV *longest_fixed;
1499 I32 offset_fixed;
1500 SV *longest_float;
1501 I32 offset_float_min;
1502 I32 offset_float_max;
1503 I32 flags;
1504} scan_data_t;
1505
1506typedef I32 CHECKPOINT;
1507#endif /* PERL_OBJECT */
1508
4633a7c4
LW
1509/* work around some libPW problems */
1510#ifdef DOINIT
1511EXT char Error[1];
1512#endif
1513
450a55e4 1514#if defined(iAPX286) || defined(M_I286) || defined(I80286)
a687059c
LW
1515# define I286
1516#endif
1517
fe14fcc3
LW
1518#if defined(htonl) && !defined(HAS_HTONL)
1519#define HAS_HTONL
ae986130 1520#endif
fe14fcc3
LW
1521#if defined(htons) && !defined(HAS_HTONS)
1522#define HAS_HTONS
ae986130 1523#endif
fe14fcc3
LW
1524#if defined(ntohl) && !defined(HAS_NTOHL)
1525#define HAS_NTOHL
ae986130 1526#endif
fe14fcc3
LW
1527#if defined(ntohs) && !defined(HAS_NTOHS)
1528#define HAS_NTOHS
ae986130 1529#endif
fe14fcc3 1530#ifndef HAS_HTONL
d9d8d8de 1531#if (BYTEORDER & 0xffff) != 0x4321
fe14fcc3
LW
1532#define HAS_HTONS
1533#define HAS_HTONL
1534#define HAS_NTOHS
1535#define HAS_NTOHL
a687059c
LW
1536#define MYSWAP
1537#define htons my_swap
1538#define htonl my_htonl
1539#define ntohs my_swap
1540#define ntohl my_ntohl
1541#endif
1542#else
d9d8d8de 1543#if (BYTEORDER & 0xffff) == 0x4321
fe14fcc3
LW
1544#undef HAS_HTONS
1545#undef HAS_HTONL
1546#undef HAS_NTOHS
1547#undef HAS_NTOHL
a687059c
LW
1548#endif
1549#endif
1550
988174c1
LW
1551/*
1552 * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
1553 * -DWS
1554 */
1555#if BYTEORDER != 0x1234
1556# define HAS_VTOHL
1557# define HAS_VTOHS
1558# define HAS_HTOVL
1559# define HAS_HTOVS
1560# if BYTEORDER == 0x4321
1561# define vtohl(x) ((((x)&0xFF)<<24) \
1562 +(((x)>>24)&0xFF) \
1563 +(((x)&0x0000FF00)<<8) \
1564 +(((x)&0x00FF0000)>>8) )
1565# define vtohs(x) ((((x)&0xFF)<<8) + (((x)>>8)&0xFF))
1566# define htovl(x) vtohl(x)
1567# define htovs(x) vtohs(x)
1568# endif
1569 /* otherwise default to functions in util.c */
1570#endif
1571
0f85fab0 1572#ifdef CASTNEGFLOAT
79072805 1573#define U_S(what) ((U16)(what))
0f85fab0 1574#define U_I(what) ((unsigned int)(what))
79072805 1575#define U_L(what) ((U32)(what))
0f85fab0 1576#else
32f822de 1577EXTERN_C U32 cast_ulong _((double));
232e078e
AD
1578#define U_S(what) ((U16)cast_ulong((double)(what)))
1579#define U_I(what) ((unsigned int)cast_ulong((double)(what)))
1580#define U_L(what) (cast_ulong((double)(what)))
ee0007ab
LW
1581#endif
1582
ed6116ce
LW
1583#ifdef CASTI32
1584#define I_32(what) ((I32)(what))
a0d0e21e 1585#define I_V(what) ((IV)(what))
5d94fbed 1586#define U_V(what) ((UV)(what))
ed6116ce 1587#else
32f822de 1588START_EXTERN_C
a0d0e21e 1589I32 cast_i32 _((double));
a0d0e21e 1590IV cast_iv _((double));
5d94fbed 1591UV cast_uv _((double));
32f822de 1592END_EXTERN_C
a6e633de
PP
1593#define I_32(what) (cast_i32((double)(what)))
1594#define I_V(what) (cast_iv((double)(what)))
5d94fbed 1595#define U_V(what) (cast_uv((double)(what)))
ed6116ce
LW
1596#endif
1597
79072805
LW
1598struct Outrec {
1599 I32 o_lines;
d9d8d8de 1600 char *o_str;
79072805 1601 U32 o_len;
8d063cd8
LW
1602};
1603
352d5a3a
LW
1604#ifndef MAXSYSFD
1605# define MAXSYSFD 2
1606#endif
ee0007ab 1607
f82b3d41
PP
1608#ifndef TMPPATH
1609# define TMPPATH "/tmp/perl-eXXXXXX"
a0d0e21e 1610#endif
79072805
LW
1611
1612#ifndef __cplusplus
a0d0e21e
LW
1613Uid_t getuid _((void));
1614Uid_t geteuid _((void));
1615Gid_t getgid _((void));
1616Gid_t getegid _((void));
79072805 1617#endif
8d063cd8
LW
1618
1619#ifdef DEBUGGING
0c30d9ec 1620#ifndef Perl_debug_log
760ac839 1621#define Perl_debug_log PerlIO_stderr()
0c30d9ec 1622#endif
9d116dd7 1623#undef YYDEBUG
d96024cf 1624#define YYDEBUG 1
79072805 1625#define DEB(a) a
3280af22
NIS
1626#define DEBUG(a) if (PL_debug) a
1627#define DEBUG_p(a) if (PL_debug & 1) a
1628#define DEBUG_s(a) if (PL_debug & 2) a
1629#define DEBUG_l(a) if (PL_debug & 4) a
1630#define DEBUG_t(a) if (PL_debug & 8) a
1631#define DEBUG_o(a) if (PL_debug & 16) a
1632#define DEBUG_c(a) if (PL_debug & 32) a
1633#define DEBUG_P(a) if (PL_debug & 64) a
1634#define DEBUG_m(a) if (PL_curinterp && PL_debug & 128) a
1635#define DEBUG_f(a) if (PL_debug & 256) a
1636#define DEBUG_r(a) if (PL_debug & 512) a
1637#define DEBUG_x(a) if (PL_debug & 1024) a
1638#define DEBUG_u(a) if (PL_debug & 2048) a
1639#define DEBUG_L(a) if (PL_debug & 4096) a
1640#define DEBUG_H(a) if (PL_debug & 8192) a
1641#define DEBUG_X(a) if (PL_debug & 16384) a
1642#define DEBUG_D(a) if (PL_debug & 32768) a
8b73bbec
IZ
1643# ifdef USE_THREADS
1644# define DEBUG_S(a) if (PL_debug & (1<<16)) a
1645# else
1646# define DEBUG_S(a)
1647# endif
79072805
LW
1648#else
1649#define DEB(a)
1650#define DEBUG(a)
1651#define DEBUG_p(a)
1652#define DEBUG_s(a)
1653#define DEBUG_l(a)
1654#define DEBUG_t(a)
1655#define DEBUG_o(a)
1656#define DEBUG_c(a)
1657#define DEBUG_P(a)
1658#define DEBUG_m(a)
1659#define DEBUG_f(a)
1660#define DEBUG_r(a)
1661#define DEBUG_x(a)
1662#define DEBUG_u(a)
8b73bbec 1663#define DEBUG_S(a)
79072805
LW
1664#define DEBUG_H(a)
1665#define DEBUG_X(a)
8990e307 1666#define DEBUG_D(a)
8b73bbec 1667#define DEBUG_S(a)
8d063cd8 1668#endif
fe14fcc3 1669#define YYMAXDEPTH 300
8d063cd8 1670
a6e633de 1671#ifndef assert /* <assert.h> might have been included somehow */
79072805
LW
1672#define assert(what) DEB( { \
1673 if (!(what)) { \
463ee0b2 1674 croak("Assertion failed: file \"%s\", line %d", \
79072805 1675 __FILE__, __LINE__); \
6ad3d225 1676 PerlProc_exit(1); \
79072805 1677 }})
a6e633de 1678#endif
8d063cd8 1679
450a55e4 1680struct ufuncs {
a0d0e21e
LW
1681 I32 (*uf_val)_((IV, SV*));
1682 I32 (*uf_set)_((IV, SV*));
1683 IV uf_index;
450a55e4
LW
1684};
1685
fe14fcc3 1686/* Fix these up for __STDC__ */
68dc0745 1687#ifndef DONT_DECLARE_STD
a0d0e21e
LW
1688char *mktemp _((char*));
1689double atof _((const char*));
1690#endif
79072805 1691
352d5a3a 1692#ifndef STANDARD_C
fe14fcc3 1693/* All of these are in stdlib.h or time.h for ANSI C */
85e6fe83 1694Time_t time();
8d063cd8 1695struct tm *gmtime(), *localtime();
9d116dd7
JH
1696#ifdef OEMVS
1697char *(strchr)(), *(strrchr)();
1698char *(strcpy)(), *(strcat)();
1699#else
93a17b20 1700char *strchr(), *strrchr();
378cc40b 1701char *strcpy(), *strcat();
9d116dd7 1702#endif
352d5a3a 1703#endif /* ! STANDARD_C */
8d063cd8 1704
79072805
LW
1705
1706#ifdef I_MATH
1707# include <math.h>
1708#else
32f822de 1709START_EXTERN_C
a0d0e21e 1710 double exp _((double));
a0d0e21e 1711 double log _((double));
c635e13b 1712 double log10 _((double));
a0d0e21e 1713 double sqrt _((double));
c635e13b
PP
1714 double frexp _((double,int*));
1715 double ldexp _((double,int));
a0d0e21e
LW
1716 double modf _((double,double*));
1717 double sin _((double));
1718 double cos _((double));
1719 double atan2 _((double,double));
1720 double pow _((double,double));
32f822de 1721END_EXTERN_C
79072805
LW
1722#endif
1723
a0d0e21e 1724#ifndef __cplusplus
26618a56 1725# ifdef __NeXT__ /* or whatever catches all NeXTs */
3fc1aec6 1726char *crypt (); /* Maybe more hosts will need the unprototyped version */
26618a56
GS
1727# else
1728# if !defined(WIN32) || !defined(HAVE_DES_FCRYPT)
a0d0e21e 1729char *crypt _((const char*, const char*));
26618a56
GS
1730# endif /* !WIN32 && !HAVE_CRYPT_SOURCE */
1731# endif /* !__NeXT__ */
1732# ifndef DONT_DECLARE_STD
1733# ifndef getenv
a0d0e21e 1734char *getenv _((const char*));
26618a56 1735# endif /* !getenv */
a0d0e21e 1736Off_t lseek _((int,Off_t,int));
26618a56 1737# endif /* !DONT_DECLARE_STD */
a0d0e21e 1738char *getlogin _((void));
26618a56 1739#endif /* !__cplusplus */
79072805 1740
16d20bd9 1741#ifdef UNLINK_ALL_VERSIONS /* Currently only makes sense for VMS */
378cc40b 1742#define UNLINK unlnk
a0d0e21e 1743I32 unlnk _((char*));
8d063cd8
LW
1744#else
1745#define UNLINK unlink
1746#endif
a687059c 1747
fe14fcc3 1748#ifndef HAS_SETREUID
85e6fe83
LW
1749# ifdef HAS_SETRESUID
1750# define setreuid(r,e) setresuid(r,e,(Uid_t)-1)
1751# define HAS_SETREUID
1752# endif
a687059c 1753#endif
fe14fcc3 1754#ifndef HAS_SETREGID
85e6fe83
LW
1755# ifdef HAS_SETRESGID
1756# define setregid(r,e) setresgid(r,e,(Gid_t)-1)
1757# define HAS_SETREGID
1758# endif
a687059c 1759#endif
ee0007ab 1760
ff68c719
PP
1761typedef Signal_t (*Sighandler_t) _((int));
1762
1763#ifdef HAS_SIGACTION
1764typedef struct sigaction Sigsave_t;
1765#else
1766typedef Sighandler_t Sigsave_t;
1767#endif
1768
ee0007ab
LW
1769#define SCAN_DEF 0
1770#define SCAN_TR 1
1771#define SCAN_REPL 2
79072805
LW
1772
1773#ifdef DEBUGGING
4633a7c4 1774# ifndef register
a0d0e21e
LW
1775# define register
1776# endif
1777# define PAD_SV(po) pad_sv(po)
2ddcc7aa 1778# define RUNOPS_DEFAULT runops_debug
79072805 1779#else
6b88bc9c 1780# define PAD_SV(po) PL_curpad[po]
2ddcc7aa 1781# define RUNOPS_DEFAULT runops_standard
79072805
LW
1782#endif
1783
18f739ee 1784#ifdef MYMALLOC
51dc0457
NIS
1785# define MALLOC_INIT MUTEX_INIT(&PL_malloc_mutex)
1786# define MALLOC_TERM MUTEX_DESTROY(&PL_malloc_mutex)
18f739ee
IZ
1787#else
1788# define MALLOC_INIT
1789# define MALLOC_TERM
1790#endif
1791
b6d9d515 1792
44a0ac01
MB
1793/*
1794 * These need prototyping here because <proto.h> isn't
1795 * included until after runops is initialised.
1796 */
1797
76e3520e 1798#ifndef PERL_OBJECT
49f531da 1799typedef int runops_proc_t _((void));
44a0ac01
MB
1800int runops_standard _((void));
1801#ifdef DEBUGGING
1802int runops_debug _((void));
1803#endif
76e3520e 1804#endif /* PERL_OBJECT */
44a0ac01 1805
940cb80d 1806/* _ (for $_) must be first in the following list (DEFSV requires it) */
54b9620d 1807#define THREADSV_NAMES "_123456789&`'+/.,\\\";^-%=|~:\001\005!@"
a863c7d1 1808
0c30d9ec
PP
1809/* VMS doesn't use environ array and NeXT has problems with crt0.o globals */
1810#if !defined(VMS) && !(defined(NeXT) && defined(__DYNAMIC__))
16de4a3e
RS
1811#if !defined(DONT_DECLARE_STD) \
1812 || (defined(__svr4__) && defined(__GNUC__) && defined(sun)) \
1813 || defined(__sgi) || defined(__DGUX)
79072805 1814extern char ** environ; /* environment variables supplied via exec */
a0d0e21e 1815#endif
0c30d9ec
PP
1816#else
1817# if defined(NeXT) && defined(__DYNAMIC__)
1818
1819# include <mach-o/dyld.h>
1820EXT char *** environ_pointer;
1821# define environ (*environ_pointer)
1822# endif
1823#endif /* environ processing */
1824
79072805
LW
1825
1826/* for tmp use in stupid debuggers */
1827EXT int * di;
1828EXT short * ds;
1829EXT char * dc;
1830
1831/* handy constants */
3e3baf6d 1832EXTCONST char warn_uninit[]
a0d0e21e 1833 INIT("Use of uninitialized value");
3e3baf6d 1834EXTCONST char warn_nosemi[]
463ee0b2 1835 INIT("Semicolon seems to be missing");
3e3baf6d 1836EXTCONST char warn_reserved[]
463ee0b2 1837 INIT("Unquoted string \"%s\" may clash with future reserved word");
3e3baf6d 1838EXTCONST char warn_nl[]
93a17b20 1839 INIT("Unsuccessful %s on filename containing newline");
3e3baf6d 1840EXTCONST char no_wrongref[]
a0d0e21e 1841 INIT("Can't use %s ref as %s ref");
3e3baf6d 1842EXTCONST char no_symref[]
748a9306 1843 INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
3e3baf6d 1844EXTCONST char no_usym[]
8990e307 1845 INIT("Can't use an undefined value as %s reference");
3e3baf6d 1846EXTCONST char no_aelem[]
93a17b20 1847 INIT("Modification of non-creatable array value attempted, subscript %d");
3e3baf6d 1848EXTCONST char no_helem[]
93a17b20 1849 INIT("Modification of non-creatable hash value attempted, subscript \"%s\"");
3e3baf6d 1850EXTCONST char no_modify[]
93a17b20 1851 INIT("Modification of a read-only value attempted");
3e3baf6d 1852EXTCONST char no_mem[]
93a17b20 1853 INIT("Out of memory!\n");
3e3baf6d 1854EXTCONST char no_security[]
463ee0b2 1855 INIT("Insecure dependency in %s%s");
3e3baf6d 1856EXTCONST char no_sock_func[]
93a17b20 1857 INIT("Unsupported socket function \"%s\" called");
3e3baf6d 1858EXTCONST char no_dir_func[]
93a17b20 1859 INIT("Unsupported directory function \"%s\" called");
3e3baf6d 1860EXTCONST char no_func[]
93a17b20 1861 INIT("The %s function is unimplemented");
3e3baf6d 1862EXTCONST char no_myglob[]
748a9306 1863 INIT("\"my\" variable %s can't be in a package");
93a17b20 1864
79072805 1865#ifdef DOINIT
8e07c86e
AD
1866EXT char *sig_name[] = { SIG_NAME };
1867EXT int sig_num[] = { SIG_NUM };
0c30d9ec
PP
1868EXT SV * psig_ptr[sizeof(sig_num)/sizeof(*sig_num)];
1869EXT SV * psig_name[sizeof(sig_num)/sizeof(*sig_num)];
79072805
LW
1870#else
1871EXT char *sig_name[];
8e07c86e 1872EXT int sig_num[];
0c30d9ec
PP
1873EXT SV * psig_ptr[];
1874EXT SV * psig_name[];
79072805
LW
1875#endif
1876
bbce6d69
PP
1877/* fast case folding tables */
1878
79072805 1879#ifdef DOINIT
9d116dd7
JH
1880#ifdef EBCDIC
1881EXT unsigned char fold[] = { /* fast EBCDIC case folding table */
1882 0, 1, 2, 3, 4, 5, 6, 7,
1883 8, 9, 10, 11, 12, 13, 14, 15,
1884 16, 17, 18, 19, 20, 21, 22, 23,
1885 24, 25, 26, 27, 28, 29, 30, 31,
1886 32, 33, 34, 35, 36, 37, 38, 39,
1887 40, 41, 42, 43, 44, 45, 46, 47,
1888 48, 49, 50, 51, 52, 53, 54, 55,
1889 56, 57, 58, 59, 60, 61, 62, 63,
1890 64, 65, 66, 67, 68, 69, 70, 71,
1891 72, 73, 74, 75, 76, 77, 78, 79,
1892 80, 81, 82, 83, 84, 85, 86, 87,
1893 88, 89, 90, 91, 92, 93, 94, 95,
1894 96, 97, 98, 99, 100, 101, 102, 103,
1895 104, 105, 106, 107, 108, 109, 110, 111,
1896 112, 113, 114, 115, 116, 117, 118, 119,
1897 120, 121, 122, 123, 124, 125, 126, 127,
1898 128, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
1899 'H', 'I', 138, 139, 140, 141, 142, 143,
1900 144, 'J', 'K', 'L', 'M', 'N', 'O', 'P',
1901 'Q', 'R', 154, 155, 156, 157, 158, 159,
1902 160, 161, 'S', 'T', 'U', 'V', 'W', 'X',
1903 'Y', 'Z', 170, 171, 172, 173, 174, 175,
1904 176, 177, 178, 179, 180, 181, 182, 183,
1905 184, 185, 186, 187, 188, 189, 190, 191,
1906 192, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
1907 'h', 'i', 202, 203, 204, 205, 206, 207,
1908 208, 'j', 'k', 'l', 'm', 'n', 'o', 'p',
1909 'q', 'r', 218, 219, 220, 221, 222, 223,
1910 224, 225, 's', 't', 'u', 'v', 'w', 'x',
1911 'y', 'z', 234, 235, 236, 237, 238, 239,
1912 240, 241, 242, 243, 244, 245, 246, 247,
1913 248, 249, 250, 251, 252, 253, 254, 255
1914};
1915#else /* ascii rather than ebcdic */
36477c24 1916EXTCONST unsigned char fold[] = {
79072805
LW
1917 0, 1, 2, 3, 4, 5, 6, 7,
1918 8, 9, 10, 11, 12, 13, 14, 15,
1919 16, 17, 18, 19, 20, 21, 22, 23,
1920 24, 25, 26, 27, 28, 29, 30, 31,
1921 32, 33, 34, 35, 36, 37, 38, 39,
1922 40, 41, 42, 43, 44, 45, 46, 47,
1923 48, 49, 50, 51, 52, 53, 54, 55,
1924 56, 57, 58, 59, 60, 61, 62, 63,
1925 64, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
1926 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
1927 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
1928 'x', 'y', 'z', 91, 92, 93, 94, 95,
1929 96, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
1930 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
1931 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
1932 'X', 'Y', 'Z', 123, 124, 125, 126, 127,
1933 128, 129, 130, 131, 132, 133, 134, 135,
1934 136, 137, 138, 139, 140, 141, 142, 143,
1935 144, 145, 146, 147, 148, 149, 150, 151,
1936 152, 153, 154, 155, 156, 157, 158, 159,
1937 160, 161, 162, 163, 164, 165, 166, 167,
1938 168, 169, 170, 171, 172, 173, 174, 175,
1939 176, 177, 178, 179, 180, 181, 182, 183,
1940 184, 185, 186, 187, 188, 189, 190, 191,
1941 192, 193, 194, 195, 196, 197, 198, 199,
1942 200, 201, 202, 203, 204, 205, 206, 207,
1943 208, 209, 210, 211, 212, 213, 214, 215,
1944 216, 217, 218, 219, 220, 221, 222, 223,
1945 224, 225, 226, 227, 228, 229, 230, 231,
1946 232, 233, 234, 235, 236, 237, 238, 239,
1947 240, 241, 242, 243, 244, 245, 246, 247,
1948 248, 249, 250, 251, 252, 253, 254, 255
1949};
9d116dd7 1950#endif /* !EBCDIC */
79072805 1951#else
71be2cbc 1952EXTCONST unsigned char fold[];
79072805
LW
1953#endif
1954
1955#ifdef DOINIT
bbce6d69 1956EXT unsigned char fold_locale[] = {
79072805
LW
1957 0, 1, 2, 3, 4, 5, 6, 7,
1958 8, 9, 10, 11, 12, 13, 14, 15,
1959 16, 17, 18, 19, 20, 21, 22, 23,
1960 24, 25, 26, 27, 28, 29, 30, 31,
1961 32, 33, 34, 35, 36, 37, 38, 39,
1962 40, 41, 42, 43, 44, 45, 46, 47,
1963 48, 49, 50, 51, 52, 53, 54, 55,
1964 56, 57, 58, 59, 60, 61, 62, 63,
1965 64, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
1966 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
1967 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
1968 'x', 'y', 'z', 91, 92, 93, 94, 95,
1969 96, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
1970 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
1971 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
1972 'X', 'Y', 'Z', 123, 124, 125, 126, 127,
1973 128, 129, 130, 131, 132, 133, 134, 135,
1974 136, 137, 138, 139, 140, 141, 142, 143,
1975 144, 145, 146, 147, 148, 149, 150, 151,
1976 152, 153, 154, 155, 156, 157, 158, 159,
1977 160, 161, 162, 163, 164, 165, 166, 167,
1978 168, 169, 170, 171, 172, 173, 174, 175,
1979 176, 177, 178, 179, 180, 181, 182, 183,
1980 184, 185, 186, 187, 188, 189, 190, 191,
1981 192, 193, 194, 195, 196, 197, 198, 199,
1982 200, 201, 202, 203, 204, 205, 206, 207,
1983 208, 209, 210, 211, 212, 213, 214, 215,
1984 216, 217, 218, 219, 220, 221, 222, 223,
1985 224, 225, 226, 227, 228, 229, 230, 231,
1986 232, 233, 234, 235, 236, 237, 238, 239,
1987 240, 241, 242, 243, 244, 245, 246, 247,
1988 248, 249, 250, 251, 252, 253, 254, 255
1989};
1990#else
bbce6d69 1991EXT unsigned char fold_locale[];
79072805
LW
1992#endif
1993
1994#ifdef DOINIT
9d116dd7
JH
1995#ifdef EBCDIC
1996EXT unsigned char freq[] = {/* EBCDIC frequencies for mixed English/C */
1997 1, 2, 84, 151, 154, 155, 156, 157,
1998 165, 246, 250, 3, 158, 7, 18, 29,
1999 40, 51, 62, 73, 85, 96, 107, 118,
2000 129, 140, 147, 148, 149, 150, 152, 153,
2001 255, 6, 8, 9, 10, 11, 12, 13,
2002 14, 15, 24, 25, 26, 27, 28, 226,
2003 29, 30, 31, 32, 33, 43, 44, 45,
2004 46, 47, 48, 49, 50, 76, 77, 78,
2005 79, 80, 81, 82, 83, 84, 85, 86,
2006 87, 94, 95, 234, 181, 233, 187, 190,
2007 180, 96, 97, 98, 99, 100, 101, 102,
2008 104, 112, 182, 174, 236, 232, 229, 103,
2009 228, 226, 114, 115, 116, 117, 118, 119,
2010 120, 121, 122, 235, 176, 230, 194, 162,
2011 130, 131, 132, 133, 134, 135, 136, 137,
2012 138, 139, 201, 205, 163, 217, 220, 224,
2013 5, 248, 227, 244, 242, 255, 241, 231,
2014 240, 253, 16, 197, 19, 20, 21, 187,
2015 23, 169, 210, 245, 237, 249, 247, 239,
2016 168, 252, 34, 196, 36, 37, 38, 39,
2017 41, 42, 251, 254, 238, 223, 221, 213,
2018 225, 177, 52, 53, 54, 55, 56, 57,
2019 58, 59, 60, 61, 63, 64, 65, 66,
2020 67, 68, 69, 70, 71, 72, 74, 75,
2021 205, 208, 186, 202, 200, 218, 198, 179,
2022 178, 214, 88, 89, 90, 91, 92, 93,
2023 217, 166, 170, 207, 199, 209, 206, 204,
2024 160, 212, 105, 106, 108, 109, 110, 111,
2025 203, 113, 216, 215, 192, 175, 193, 243,
2026 172, 161, 123, 124, 125, 126, 127, 128,
2027 222, 219, 211, 195, 188, 193, 185, 184,
2028 191, 183, 141, 142, 143, 144, 145, 146
2029};
2030#else /* ascii rather than ebcdic */
71be2cbc 2031EXTCONST unsigned char freq[] = { /* letter frequencies for mixed English/C */
79072805
LW
2032 1, 2, 84, 151, 154, 155, 156, 157,
2033 165, 246, 250, 3, 158, 7, 18, 29,
2034 40, 51, 62, 73, 85, 96, 107, 118,
2035 129, 140, 147, 148, 149, 150, 152, 153,
2036 255, 182, 224, 205, 174, 176, 180, 217,
2037 233, 232, 236, 187, 235, 228, 234, 226,
2038 222, 219, 211, 195, 188, 193, 185, 184,
2039 191, 183, 201, 229, 181, 220, 194, 162,
2040 163, 208, 186, 202, 200, 218, 198, 179,
2041 178, 214, 166, 170, 207, 199, 209, 206,
2042 204, 160, 212, 216, 215, 192, 175, 173,
2043 243, 172, 161, 190, 203, 189, 164, 230,
2044 167, 248, 227, 244, 242, 255, 241, 231,
2045 240, 253, 169, 210, 245, 237, 249, 247,
2046 239, 168, 252, 251, 254, 238, 223, 221,
2047 213, 225, 177, 197, 171, 196, 159, 4,
2048 5, 6, 8, 9, 10, 11, 12, 13,
2049 14, 15, 16, 17, 19, 20, 21, 22,
2050 23, 24, 25, 26, 27, 28, 30, 31,
2051 32, 33, 34, 35, 36, 37, 38, 39,
2052 41, 42, 43, 44, 45, 46, 47, 48,
2053 49, 50, 52, 53, 54, 55, 56, 57,
2054 58, 59, 60, 61, 63, 64, 65, 66,
2055 67, 68, 69, 70, 71, 72, 74, 75,
2056 76, 77, 78, 79, 80, 81, 82, 83,
2057 86, 87, 88, 89, 90, 91, 92, 93,
2058 94, 95, 97, 98, 99, 100, 101, 102,
2059 103, 104, 105, 106, 108, 109, 110, 111,
2060 112, 113, 114, 115, 116, 117, 119, 120,
2061 121, 122, 123, 124, 125, 126, 127, 128,
2062 130, 131, 132, 133, 134, 135, 136, 137,
2063 138, 139, 141, 142, 143, 144, 145, 146
2064};
9d116dd7 2065#endif
79072805 2066#else
71be2cbc 2067EXTCONST unsigned char freq[];
79072805
LW
2068#endif
2069
8990e307
LW
2070#ifdef DEBUGGING
2071#ifdef DOINIT
71be2cbc 2072EXTCONST char* block_type[] = {
8990e307
LW
2073 "NULL",
2074 "SUB",
2075 "EVAL",
2076 "LOOP",
2077 "SUBST",
2078 "BLOCK",
2079};
2080#else
71be2cbc 2081EXTCONST char* block_type[];
8990e307
LW
2082#endif
2083#endif
2084
79072805
LW
2085/*****************************************************************************/
2086/* This lexer/parser stuff is currently global since yacc is hard to reenter */
2087/*****************************************************************************/
8990e307 2088/* XXX This needs to be revisited, since BEGIN makes yacc re-enter... */
79072805 2089
a0d0e21e
LW
2090#include "perly.h"
2091
fb73857a
PP
2092#define LEX_NOTPARSING 11 /* borrowed from toke.c */
2093
79072805
LW
2094typedef enum {
2095 XOPERATOR,
2096 XTERM,
79072805 2097 XREF,
8990e307 2098 XSTATE,
a0d0e21e
LW
2099 XBLOCK,
2100 XTERMBLOCK
79072805
LW
2101} expectation;
2102
85e6fe83
LW
2103
2104 /* Note: the lowest 8 bits are reserved for
2105 stuffing into op->op_private */
2106#define HINT_INTEGER 0x00000001
2107#define HINT_STRICT_REFS 0x00000002
a0ed51b3
LW
2108/* #define HINT_notused4 0x00000004 */
2109#define HINT_UTF8 0x00000008
2110/* #define HINT_notused10 0x00000010 */
2111 /* Note: 20,40,80 used for NATIVE_HINTS */
85e6fe83
LW
2112
2113#define HINT_BLOCK_SCOPE 0x00000100
2114#define HINT_STRICT_SUBS 0x00000200
2115#define HINT_STRICT_VARS 0x00000400
bbce6d69 2116#define HINT_LOCALE 0x00000800
85e6fe83 2117
b3ac6de7
IZ
2118#define HINT_NEW_INTEGER 0x00001000
2119#define HINT_NEW_FLOAT 0x00002000
2120#define HINT_NEW_BINARY 0x00004000
2121#define HINT_NEW_STRING 0x00008000
2122#define HINT_NEW_RE 0x00010000
2123#define HINT_LOCALIZE_HH 0x00020000 /* %^H needs to be copied */
2124
b3eb6a9b 2125#define HINT_RE_TAINT 0x00100000
e4d48cc9 2126#define HINT_RE_EVAL 0x00200000
b3eb6a9b 2127
5ff3f7a4
GS
2128#define HINT_FILETEST_ACCESS 0x00400000
2129
d4cce5f1
NIS
2130/* Various states of an input record separator SV (rs, nrs) */
2131#define RsSNARF(sv) (! SvOK(sv))
2132#define RsSIMPLE(sv) (SvOK(sv) && SvCUR(sv))
2133#define RsPARA(sv) (SvOK(sv) && ! SvCUR(sv))
5b2b9c68 2134#define RsRECORD(sv) (SvROK(sv) && (SvIV(SvRV(sv)) > 0))
79072805 2135
56953603 2136/* Enable variables which are pointers to functions */
15e52e56
GS
2137#ifdef PERL_OBJECT
2138typedef regexp*(CPerlObj::*regcomp_t) _((char* exp, char* xend, PMOP* pm));
2139typedef I32 (CPerlObj::*regexec_t) _((regexp* prog, char* stringarg,
2140 char* strend, char* strbeg,
2141 I32 minend, SV* screamer, void* data,
2142 U32 flags));
2143#else
56953603
IZ
2144typedef regexp*(*regcomp_t) _((char* exp, char* xend, PMOP* pm));
2145typedef I32 (*regexec_t) _((regexp* prog, char* stringarg, char* strend, char*
2146 strbeg, I32 minend, SV* screamer, void* data,
2147 U32 flags));
2148
15e52e56
GS
2149#endif
2150
22239a37
NIS
2151/* Set up PERLVAR macros for populating structs */
2152#define PERLVAR(var,type) type var;
2153#define PERLVARI(var,type,init) type var;
3fe35a81 2154#define PERLVARIC(var,type,init) type var;
22239a37 2155
58a50f62
GS
2156/* Interpreter exitlist entry */
2157typedef struct exitlistentry {
2158#ifdef PERL_OBJECT
2159 void (*fn) _((CPerlObj*, void*));
2160#else
2161 void (*fn) _((void*));
2162#endif
2163 void *ptr;
2164} PerlExitListEntry;
2165
76e3520e
GS
2166#ifdef PERL_OBJECT
2167extern "C" CPerlObj* perl_alloc _((IPerlMem*, IPerlEnv*, IPerlStdIO*, IPerlLIO*, IPerlDir*, IPerlSock*, IPerlProc*));
2168
2169typedef int (CPerlObj::*runops_proc_t) _((void));
2170#undef EXT
2171#define EXT
2172#undef EXTCONST
2173#define EXTCONST
2174#undef INIT
2175#define INIT(x)
2176
2177class CPerlObj {
2178public:
2179 CPerlObj(IPerlMem*, IPerlEnv*, IPerlStdIO*, IPerlLIO*, IPerlDir*, IPerlSock*, IPerlProc*);
2180 void Init(void);
2181 void* operator new(size_t nSize, IPerlMem *pvtbl);
2182#endif /* PERL_OBJECT */
2183
22239a37
NIS
2184#ifdef PERL_GLOBAL_STRUCT
2185struct perl_vars {
2186#include "perlvars.h"
2187};
2188
2189#ifdef PERL_CORE
533c011a
NIS
2190EXT struct perl_vars PL_Vars;
2191EXT struct perl_vars *PL_VarsPtr INIT(&PL_Vars);
2192#else /* PERL_CORE */
22239a37
NIS
2193#if !defined(__GNUC__) || !defined(WIN32)
2194EXT
533c011a
NIS
2195#endif /* WIN32 */
2196struct perl_vars *PL_VarsPtr;
2197#define PL_Vars (*((PL_VarsPtr) ? PL_VarsPtr : (PL_VarsPtr = Perl_GetVars())))
2198#endif /* PERL_CORE */
22239a37
NIS
2199#endif /* PERL_GLOBAL_STRUCT */
2200
8990e307 2201#ifdef MULTIPLICITY
d4cce5f1
NIS
2202/* If we have multiple interpreters define a struct
2203 holding variables which must be per-interpreter
2204 If we don't have threads anything that would have
2205 be per-thread is per-interpreter.
2206*/
2207
79072805 2208struct interpreter {
d4cce5f1
NIS
2209#ifndef USE_THREADS
2210#include "thrdvar.h"
2211#endif
2212#include "intrpvar.h"
49f531da 2213};
d4cce5f1 2214
79072805 2215#else
49f531da
NIS
2216struct interpreter {
2217 char broiled;
2218};
79072805
LW
2219#endif
2220
d4cce5f1
NIS
2221#ifdef USE_THREADS
2222/* If we have threads define a struct with all the variables
2223 * that have to be per-thread
49f531da 2224 */
8023c3ce 2225
79072805 2226
49f531da 2227struct perl_thread {
49f531da 2228#include "thrdvar.h"
79072805 2229};
d4cce5f1 2230
22fae026
TM
2231typedef struct perl_thread *Thread;
2232
2233#else
2234typedef void *Thread;
22239a37
NIS
2235#endif
2236
2237/* Done with PERLVAR macros for now ... */
d4cce5f1
NIS
2238#undef PERLVAR
2239#undef PERLVARI
3fe35a81 2240#undef PERLVARIC
79072805 2241
22239a37 2242#include "thread.h"
79072805 2243#include "pp.h"
79072805
LW
2244#include "proto.h"
2245
a0d0e21e
LW
2246#ifdef EMBED
2247#define Perl_sv_setptrobj(rv,ptr,name) Perl_sv_setref_iv(rv,name,(IV)ptr)
2248#define Perl_sv_setptrref(rv,ptr) Perl_sv_setref_iv(rv,Nullch,(IV)ptr)
2249#else
2250#define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,(IV)ptr)
2251#define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,(IV)ptr)
2252#endif
2253
d4cce5f1
NIS
2254/* The following must follow proto.h as #defines mess up syntax */
2255
2256#include "embedvar.h"
2257
2258/* Now include all the 'global' variables
2259 * If we don't have threads or multiple interpreters
2260 * these include variables that would have been their struct-s
2261 */
533c011a
NIS
2262
2263#define PERLVAR(var,type) EXT type PL_##var;
2264#define PERLVARI(var,type,init) EXT type PL_##var INIT(init);
2265#define PERLVARIC(var,type,init) EXTCONST type PL_##var INIT(init);
d4cce5f1 2266
22239a37 2267#ifndef PERL_GLOBAL_STRUCT
d4cce5f1 2268#include "perlvars.h"
22239a37 2269#endif
d4cce5f1
NIS
2270
2271#ifndef MULTIPLICITY
d4cce5f1 2272
066ef5b5
GS
2273# include "intrpvar.h"
2274# ifndef USE_THREADS
2275# include "thrdvar.h"
2276# endif
d4cce5f1 2277
22239a37
NIS
2278#endif
2279
76e3520e 2280#ifdef PERL_OBJECT
d0c1b099
GS
2281/*
2282 * The following is a buffer where new variables must
2283 * be defined to maintain binary compatibility with PERL_OBJECT
2284 * for 5.005
2285 */
2286PERLVAR(object_compatibility[30], char)
76e3520e
GS
2287};
2288
2289#include "objpp.h"
2290#ifdef DOINIT
2291#include "INTERN.h"
2292#else
2293#include "EXTERN.h"
2294#endif
2295#endif /* PERL_OBJECT */
2296
22239a37 2297
d4cce5f1
NIS
2298#undef PERLVAR
2299#undef PERLVARI
0f3f18a6 2300#undef PERLVARIC
79072805 2301
a835ef8a
NIS
2302#if defined(HASATTRIBUTE) && defined(WIN32)
2303/*
2304 * This provides a layer of functions and macros to ensure extensions will
2305 * get to use the same RTL functions as the core.
2306 * It has to go here or #define of printf messes up __attribute__
2307 * stuff in proto.h
2308 */
76e3520e 2309#ifndef PERL_OBJECT
a835ef8a 2310# include <win32iop.h>
76e3520e 2311#endif /* PERL_OBJECT */
a835ef8a
NIS
2312#endif /* WIN32 */
2313
79072805 2314#ifdef DOINIT
bbce6d69 2315
4633a7c4 2316EXT MGVTBL vtbl_sv = {magic_get,
463ee0b2
LW
2317 magic_set,
2318 magic_len,
2319 0, 0};
fb73857a
PP
2320EXT MGVTBL vtbl_env = {0, magic_set_all_env,
2321 0, magic_clear_all_env,
66b1d557 2322 0};
4633a7c4 2323EXT MGVTBL vtbl_envelem = {0, magic_setenv,
85e6fe83
LW
2324 0, magic_clearenv,
2325 0};
4633a7c4 2326EXT MGVTBL vtbl_sig = {0, 0, 0, 0, 0};
0c30d9ec
PP
2327EXT MGVTBL vtbl_sigelem = {magic_getsig,
2328 magic_setsig,
2329 0, magic_clearsig,
2330 0};
93965878 2331EXT MGVTBL vtbl_pack = {0, 0, magic_sizepack, magic_wipepack,
a0d0e21e 2332 0};
4633a7c4 2333EXT MGVTBL vtbl_packelem = {magic_getpack,
463ee0b2
LW
2334 magic_setpack,
2335 0, magic_clearpack,
2336 0};
4633a7c4 2337EXT MGVTBL vtbl_dbline = {0, magic_setdbline,
463ee0b2 2338 0, 0, 0};
4633a7c4 2339EXT MGVTBL vtbl_isa = {0, magic_setisa,
fb73857a
PP
2340 0, magic_setisa,
2341 0};
4633a7c4 2342EXT MGVTBL vtbl_isaelem = {0, magic_setisa,
463ee0b2 2343 0, 0, 0};
4633a7c4 2344EXT MGVTBL vtbl_arylen = {magic_getarylen,
463ee0b2
LW
2345 magic_setarylen,
2346 0, 0, 0};
4633a7c4 2347EXT MGVTBL vtbl_glob = {magic_getglob,
463ee0b2
LW
2348 magic_setglob,
2349 0, 0, 0};
4633a7c4 2350EXT MGVTBL vtbl_mglob = {0, magic_setmglob,
463ee0b2 2351 0, 0, 0};
6ff81951
GS
2352EXT MGVTBL vtbl_nkeys = {magic_getnkeys,
2353 magic_setnkeys,
99abf803 2354 0, 0, 0};
4633a7c4 2355EXT MGVTBL vtbl_taint = {magic_gettaint,magic_settaint,
463ee0b2 2356 0, 0, 0};
6ff81951 2357EXT MGVTBL vtbl_substr = {magic_getsubstr, magic_setsubstr,
463ee0b2 2358 0, 0, 0};
6ff81951
GS
2359EXT MGVTBL vtbl_vec = {magic_getvec,
2360 magic_setvec,
463ee0b2 2361 0, 0, 0};
4633a7c4 2362EXT MGVTBL vtbl_pos = {magic_getpos,
a0d0e21e
LW
2363 magic_setpos,
2364 0, 0, 0};
4633a7c4 2365EXT MGVTBL vtbl_bm = {0, magic_setbm,
463ee0b2 2366 0, 0, 0};
55497cff
PP
2367EXT MGVTBL vtbl_fm = {0, magic_setfm,
2368 0, 0, 0};
4633a7c4 2369EXT MGVTBL vtbl_uvar = {magic_getuvar,
463ee0b2
LW
2370 magic_setuvar,
2371 0, 0, 0};
f93b4edd
MB
2372#ifdef USE_THREADS
2373EXT MGVTBL vtbl_mutex = {0, 0, 0, 0, magic_mutexfree};
2374#endif /* USE_THREADS */
68dc0745 2375EXT MGVTBL vtbl_defelem = {magic_getdefelem,magic_setdefelem,
02270b4e 2376 0, 0, 0};
a0d0e21e 2377
227a8b4b 2378EXT MGVTBL vtbl_regexp = {0,0,0,0, magic_freeregexp};
6cef1e77
IZ
2379EXT MGVTBL vtbl_regdata = {0, 0, magic_regdata_cnt, 0, 0};
2380EXT MGVTBL vtbl_regdatum = {magic_regdatum_get, 0, 0, 0, 0};
c277df42 2381
36477c24 2382#ifdef USE_LOCALE_COLLATE
bbce6d69
PP
2383EXT MGVTBL vtbl_collxfrm = {0,
2384 magic_setcollxfrm,
2385 0, 0, 0};
2386#endif
a0d0e21e
LW
2387
2388#ifdef OVERLOAD
4633a7c4 2389EXT MGVTBL vtbl_amagic = {0, magic_setamagic,
748a9306 2390 0, 0, magic_setamagic};
4633a7c4 2391EXT MGVTBL vtbl_amagicelem = {0, magic_setamagic,
748a9306 2392 0, 0, magic_setamagic};
a0d0e21e
LW
2393#endif /* OVERLOAD */
2394
bbce6d69
PP
2395#else /* !DOINIT */
2396
79072805
LW
2397EXT MGVTBL vtbl_sv;
2398EXT MGVTBL vtbl_env;
2399EXT MGVTBL vtbl_envelem;
2400EXT MGVTBL vtbl_sig;
2401EXT MGVTBL vtbl_sigelem;
463ee0b2
LW
2402EXT MGVTBL vtbl_pack;
2403EXT MGVTBL vtbl_packelem;
79072805 2404EXT MGVTBL vtbl_dbline;
463ee0b2
LW
2405EXT MGVTBL vtbl_isa;
2406EXT MGVTBL vtbl_isaelem;
79072805
LW
2407EXT MGVTBL vtbl_arylen;
2408EXT MGVTBL vtbl_glob;
93a17b20 2409EXT MGVTBL vtbl_mglob;
99abf803 2410EXT MGVTBL vtbl_nkeys;
463ee0b2 2411EXT MGVTBL vtbl_taint;
79072805
LW
2412EXT MGVTBL vtbl_substr;
2413EXT MGVTBL vtbl_vec;
a0d0e21e 2414EXT MGVTBL vtbl_pos;
79072805 2415EXT MGVTBL vtbl_bm;
55497cff 2416EXT MGVTBL vtbl_fm;
79072805 2417EXT MGVTBL vtbl_uvar;
a0d0e21e 2418
f93b4edd
MB
2419#ifdef USE_THREADS
2420EXT MGVTBL vtbl_mutex;
2421#endif /* USE_THREADS */
2422
68dc0745 2423EXT MGVTBL vtbl_defelem;
c277df42 2424EXT MGVTBL vtbl_regexp;
6cef1e77
IZ
2425EXT MGVTBL vtbl_regdata;
2426EXT MGVTBL vtbl_regdatum;
a0d0e21e 2427
36477c24 2428#ifdef USE_LOCALE_COLLATE
bbce6d69
PP
2429EXT MGVTBL vtbl_collxfrm;
2430#endif
a0d0e21e
LW
2431
2432#ifdef OVERLOAD
2433EXT MGVTBL vtbl_amagic;
2434EXT MGVTBL vtbl_amagicelem;
2435#endif /* OVERLOAD */
2436
bbce6d69 2437#endif /* !DOINIT */
85e6fe83 2438
a0d0e21e 2439#ifdef OVERLOAD
c0315cdf 2440
a6006777 2441#define NofAMmeth 58
a0d0e21e 2442#ifdef DOINIT
a6006777
PP
2443EXTCONST char * AMG_names[NofAMmeth] = {
2444 "fallback", "abs", /* "fallback" should be the first. */
2445 "bool", "nomethod",
2446 "\"\"", "0+",
2447 "+", "+=",
2448 "-", "-=",
2449 "*", "*=",
2450 "/", "/=",
2451 "%", "%=",
2452 "**", "**=",
2453 "<<", "<<=",
2454 ">>", ">>=",
2455 "&", "&=",
2456 "|", "|=",
2457 "^", "^=",
2458 "<", "<=",
2459 ">", ">=",
2460 "==", "!=",
2461 "<=>", "cmp",
2462 "lt", "le",
2463 "gt", "ge",
2464 "eq", "ne",
2465 "!", "~",
2466 "++", "--",
2467 "atan2", "cos",
2468 "sin", "exp",
2469 "log", "sqrt",
2470 "x", "x=",
2471 ".", ".=",
2472 "=", "neg"
a0d0e21e
LW
2473};
2474#else
a6006777 2475EXTCONST char * AMG_names[NofAMmeth];
a0d0e21e
LW
2476#endif /* def INITAMAGIC */
2477
a6006777 2478struct am_table {
a0d0e21e
LW
2479 long was_ok_sub;
2480 long was_ok_am;
a6006777
PP
2481 U32 flags;
2482 CV* table[NofAMmeth];
a0d0e21e
LW
2483 long fallback;
2484};
a6006777
PP
2485struct am_table_short {
2486 long was_ok_sub;
2487 long was_ok_am;
2488 U32 flags;
2489};
a0d0e21e 2490typedef struct am_table AMT;
a6006777 2491typedef struct am_table_short AMTS;
a0d0e21e
LW
2492
2493#define AMGfallNEVER 1
2494#define AMGfallNO 2
2495#define AMGfallYES 3
2496
a6006777
PP
2497#define AMTf_AMAGIC 1
2498#define AMT_AMAGIC(amt) ((amt)->flags & AMTf_AMAGIC)
2499#define AMT_AMAGIC_on(amt) ((amt)->flags |= AMTf_AMAGIC)
2500#define AMT_AMAGIC_off(amt) ((amt)->flags &= ~AMTf_AMAGIC)
2501
a0d0e21e
LW
2502enum {
2503 fallback_amg, abs_amg,
2504 bool__amg, nomethod_amg,
2505 string_amg, numer_amg,
2506 add_amg, add_ass_amg,
2507 subtr_amg, subtr_ass_amg,
2508 mult_amg, mult_ass_amg,
2509 div_amg, div_ass_amg,
76e3520e 2510 modulo_amg, modulo_ass_amg,
a0d0e21e
LW
2511 pow_amg, pow_ass_amg,
2512 lshift_amg, lshift_ass_amg,
2513 rshift_amg, rshift_ass_amg,
748a9306
LW
2514 band_amg, band_ass_amg,
2515 bor_amg, bor_ass_amg,
2516 bxor_amg, bxor_ass_amg,
a0d0e21e
LW
2517 lt_amg, le_amg,
2518 gt_amg, ge_amg,
2519 eq_amg, ne_amg,
2520 ncmp_amg, scmp_amg,
2521 slt_amg, sle_amg,
2522 sgt_amg, sge_amg,
2523 seq_amg, sne_amg,
a0d0e21e
LW
2524 not_amg, compl_amg,
2525 inc_amg, dec_amg,
2526 atan2_amg, cos_amg,
2527 sin_amg, exp_amg,
2528 log_amg, sqrt_amg,
2529 repeat_amg, repeat_ass_amg,
748a9306
LW
2530 concat_amg, concat_ass_amg,
2531 copy_amg, neg_amg
a0d0e21e 2532};
c0315cdf
JH
2533
2534/*
2535 * some compilers like to redefine cos et alia as faster
2536 * (and less accurate?) versions called F_cos et cetera (Quidquid
2537 * latine dictum sit, altum viditur.) This trick collides with
2538 * the Perl overloading (amg). The following #defines fool both.
2539 */
2540
2541#ifdef _FASTMATH
2542# ifdef atan2
2543# define F_atan2_amg atan2_amg
2544# endif
2545# ifdef cos
2546# define F_cos_amg cos_amg
2547# endif
2548# ifdef exp
2549# define F_exp_amg exp_amg
2550# endif
2551# ifdef log
2552# define F_log_amg log_amg
2553# endif
2554# ifdef pow
2555# define F_pow_amg pow_amg
2556# endif
2557# ifdef sin
2558# define F_sin_amg sin_amg
2559# endif
2560# ifdef sqrt
2561# define F_sqrt_amg sqrt_amg
2562# endif
2563#endif /* _FASTMATH */
2564
a0d0e21e
LW
2565#endif /* OVERLOAD */
2566
491527d0 2567#define PERLDB_ALL 0x3f /* No _NONAME, _GOTO */
84902520
TB
2568#define PERLDBf_SUB 0x01 /* Debug sub enter/exit. */
2569#define PERLDBf_LINE 0x02 /* Keep line #. */
2570#define PERLDBf_NOOPT 0x04 /* Switch off optimizations. */
2571#define PERLDBf_INTER 0x08 /* Preserve more data for
2572 later inspections. */
2573#define PERLDBf_SUBLINE 0x10 /* Keep subr source lines. */
2574#define PERLDBf_SINGLE 0x20 /* Start with single-step on. */
491527d0
GS
2575#define PERLDBf_NONAME 0x40 /* For _SUB: no name of the subr. */
2576#define PERLDBf_GOTO 0x80 /* Report goto: call DB::goto. */
84902520 2577
3280af22
NIS
2578#define PERLDB_SUB (PL_perldb && (PL_perldb & PERLDBf_SUB))
2579#define PERLDB_LINE (PL_perldb && (PL_perldb & PERLDBf_LINE))
2580#define PERLDB_NOOPT (PL_perldb && (PL_perldb & PERLDBf_NOOPT))
2581#define PERLDB_INTER (PL_perldb && (PL_perldb & PERLDBf_INTER))
2582#define PERLDB_SUBLINE (PL_perldb && (PL_perldb & PERLDBf_SUBLINE))
2583#define PERLDB_SINGLE (PL_perldb && (PL_perldb & PERLDBf_SINGLE))
2584#define PERLDB_SUB_NN (PL_perldb && (PL_perldb & (PERLDBf_NONAME)))
2585#define PERLDB_GOTO (PL_perldb && (PL_perldb & PERLDBf_GOTO))
84902520 2586
bbce6d69 2587
36477c24 2588#ifdef USE_LOCALE_NUMERIC
bbce6d69 2589
36477c24
PP
2590#define SET_NUMERIC_STANDARD() \
2591 STMT_START { \
3280af22 2592 if (! PL_numeric_standard) \
36477c24
PP
2593 perl_set_numeric_standard(); \
2594 } STMT_END
2595
2596#define SET_NUMERIC_LOCAL() \
2597 STMT_START { \
3280af22 2598 if (! PL_numeric_local) \
36477c24
PP
2599 perl_set_numeric_local(); \
2600 } STMT_END
bbce6d69 2601
36477c24 2602#else /* !USE_LOCALE_NUMERIC */
bbce6d69 2603
36477c24
PP
2604#define SET_NUMERIC_STANDARD() /**/
2605#define SET_NUMERIC_LOCAL() /**/
bbce6d69 2606
36477c24 2607#endif /* !USE_LOCALE_NUMERIC */
a0d0e21e 2608
e5c9fcd0 2609#if !defined(PERLIO_IS_STDIO) && defined(HASATTRIBUTE)
760ac839
LW
2610/*
2611 * Now we have __attribute__ out of the way
2612 * Remap printf
2613 */
2614#define printf PerlIO_stdoutf
2615#endif
2616
a868473f
NIS
2617#ifndef PERL_SCRIPT_MODE
2618#define PERL_SCRIPT_MODE "r"
2619#endif
2620
fba3b22e
MB
2621/*
2622 * nice_chunk and nice_chunk size need to be set
2623 * and queried under the protection of sv_mutex
2624 */
2625#define offer_nice_chunk(chunk, chunk_size) do { \
940cb80d 2626 LOCK_SV_MUTEX; \
3280af22
NIS
2627 if (!PL_nice_chunk) { \
2628 PL_nice_chunk = (char*)(chunk); \
2629 PL_nice_chunk_size = (chunk_size); \
fba3b22e 2630 } \
fc80cf79
GS
2631 else { \
2632 Safefree(chunk); \
2633 } \
940cb80d 2634 UNLOCK_SV_MUTEX; \
fba3b22e
MB
2635 } while (0)
2636
bd89102f
AD
2637#ifdef HAS_SEM
2638# include <sys/ipc.h>
2639# include <sys/sem.h>
2640# ifndef HAS_UNION_SEMUN /* Provide the union semun. */
2641 union semun {
2642 int val;
2643 struct semid_ds *buf;
2644 unsigned short *array;
2645 };
2646# endif
2647# ifdef USE_SEMCTL_SEMUN
2648# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun)
2649# else
2650# ifdef USE_SEMCTL_SEMID_DS
2651# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun.buf)
2652# endif
2653# endif
2654# ifndef Semctl /* Place our bets on the semun horse. */
2655# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun)
2656# endif
2657#endif
49f531da 2658
85e6fe83 2659#endif /* Include guard */