This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[asperl] small tweaks to make it compile (doesn't run)
[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
GS
27#ifdef PERL_OBJECT
28class CPerlObj;
29
30#define STATIC
31#define CPERLscope(x) CPerlObj::x
32#define CPERLproto CPerlObj *
33#define CPERLproto_ CPERLproto,
34#define CPERLarg CPerlObj *pPerl
35#define CPERLarg_ CPERLarg,
36#define THIS this
37#define THIS_ this,
38#define CALLRUNOPS (this->*runops)
39
40#else /* !PERL_OBJECT */
41
42#define STATIC static
43#define CPERLscope(x) x
44#define CPERLproto
45#define CPERLproto_
565764a8 46#define CPERLarg void
76e3520e
GS
47#define CPERLarg_
48#define THIS
49#define THIS_
50#define CALLRUNOPS runops
51
52#endif /* PERL_OBJECT */
53
71be2cbc
PP
54#define VOIDUSED 1
55#include "config.h"
56
57#include "embed.h"
58
326b05e3
GS
59#undef START_EXTERN_C
60#undef END_EXTERN_C
61#undef EXTERN_C
32f822de
GS
62#ifdef __cplusplus
63# define START_EXTERN_C extern "C" {
64# define END_EXTERN_C }
65# define EXTERN_C extern "C"
66#else
67# define START_EXTERN_C
68# define END_EXTERN_C
69# define EXTERN_C
70#endif
71
462e5cf6
MB
72#ifdef OP_IN_REGISTER
73# ifdef __GNUC__
74# define stringify_immed(s) #s
75# define stringify(s) stringify_immed(s)
d1ca3daa
GA
76#ifdef EMBED
77register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
78#else
462e5cf6 79register struct op *op asm(stringify(OP_IN_REGISTER));
d1ca3daa 80#endif
462e5cf6
MB
81# endif
82#endif
83
728e2803
PP
84/*
85 * STMT_START { statements; } STMT_END;
86 * can be used as a single statement, as in
87 * if (x) STMT_START { ... } STMT_END; else ...
88 *
89 * Trying to select a version that gives no warnings...
90 */
91#if !(defined(STMT_START) && defined(STMT_END))
169d69b2 92# if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(__cplusplus)
728e2803
PP
93# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */
94# define STMT_END )
95# else
96 /* Now which other defined()s do we need here ??? */
97# if (VOIDFLAGS) && (defined(sun) || defined(__sun__))
98# define STMT_START if (1)
99# define STMT_END else (void)0
100# else
101# define STMT_START do
102# define STMT_END while (0)
103# endif
104# endif
105#endif
106
462e5cf6
MB
107#define NOOP (void)0
108
61bb5906 109#define WITH_THR(s) STMT_START { dTHR; s; } STMT_END
ea0efc06 110
55497cff
PP
111/*
112 * SOFT_CAST can be used for args to prototyped functions to retain some
113 * type checking; it only casts if the compiler does not know prototypes.
114 */
115#if defined(CAN_PROTOTYPE) && defined(DEBUGGING_COMPILE)
116#define SOFT_CAST(type)
117#else
118#define SOFT_CAST(type) (type)
119#endif
79072805
LW
120
121#ifndef BYTEORDER
122# define BYTEORDER 0x1234
123#endif
124
125/* Overall memory policy? */
126#ifndef CONSERVATIVE
127# define LIBERAL 1
128#endif
129
130/*
131 * The following contortions are brought to you on behalf of all the
132 * standards, semi-standards, de facto standards, not-so-de-facto standards
133 * of the world, as well as all the other botches anyone ever thought of.
134 * The basic theory is that if we work hard enough here, the rest of the
135 * code can be a lot prettier. Well, so much for theory. Sorry, Henry...
136 */
ac58e20f 137
ee0007ab 138/* define this once if either system, instead of cluttering up the src */
68dc0745 139#if defined(MSDOS) || defined(atarist) || defined(WIN32)
ee0007ab
LW
140#define DOSISH 1
141#endif
142
a0d0e21e 143#if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus)
352d5a3a
LW
144# define STANDARD_C 1
145#endif
146
09b7f37c 147#if defined(__cplusplus) || defined(WIN32) || defined(__sgi) || defined(OS2) || defined(__DGUX)
68dc0745
PP
148# define DONT_DECLARE_STD 1
149#endif
150
352d5a3a 151#if defined(HASVOLATILE) || defined(STANDARD_C)
79072805
LW
152# ifdef __cplusplus
153# define VOL // to temporarily suppress warnings
154# else
155# define VOL volatile
156# endif
663a0e37 157#else
79072805 158# define VOL
663a0e37
LW
159#endif
160
bbce6d69
PP
161#define TAINT (tainted = TRUE)
162#define TAINT_NOT (tainted = FALSE)
163#define TAINT_IF(c) if (c) { tainted = TRUE; }
164#define TAINT_ENV() if (tainting) { taint_env(); }
165#define TAINT_PROPER(s) if (tainting) { taint_proper(no_security, s); }
a687059c 166
a6e633de
PP
167/* XXX All process group stuff is handled in pp_sys.c. Should these
168 defines move there? If so, I could simplify this a lot. --AD 9/96.
169*/
170/* Process group stuff changed from traditional BSD to POSIX.
171 perlfunc.pod documents the traditional BSD-style syntax, so we'll
172 try to preserve that, if possible.
173*/
174#ifdef HAS_SETPGID
175# define BSD_SETPGRP(pid, pgrp) setpgid((pid), (pgrp))
c07a80fd 176#else
a6e633de
PP
177# if defined(HAS_SETPGRP) && defined(USE_BSD_SETPGRP)
178# define BSD_SETPGRP(pid, pgrp) setpgrp((pid), (pgrp))
179# else
180# ifdef HAS_SETPGRP2 /* DG/UX */
181# define BSD_SETPGRP(pid, pgrp) setpgrp2((pid), (pgrp))
182# endif
183# endif
184#endif
185#if defined(BSD_SETPGRP) && !defined(HAS_SETPGRP)
186# define HAS_SETPGRP /* Well, effectively it does . . . */
187#endif
188
189/* getpgid isn't POSIX, but at least Solaris and Linux have it, and it makes
190 our life easier :-) so we'll try it.
191*/
192#ifdef HAS_GETPGID
193# define BSD_GETPGRP(pid) getpgid((pid))
194#else
195# if defined(HAS_GETPGRP) && defined(USE_BSD_GETPGRP)
196# define BSD_GETPGRP(pid) getpgrp((pid))
197# else
198# ifdef HAS_GETPGRP2 /* DG/UX */
199# define BSD_GETPGRP(pid) getpgrp2((pid))
200# endif
201# endif
202#endif
203#if defined(BSD_GETPGRP) && !defined(HAS_GETPGRP)
204# define HAS_GETPGRP /* Well, effectively it does . . . */
205#endif
206
207/* These are not exact synonyms, since setpgrp() and getpgrp() may
208 have different behaviors, but perl.h used to define USE_BSDPGRP
209 (prior to 5.003_05) so some extension might depend on it.
210*/
211#if defined(USE_BSD_SETPGRP) || defined(USE_BSD_GETPGRP)
212# ifndef USE_BSDPGRP
213# define USE_BSDPGRP
214# endif
663a0e37
LW
215#endif
216
760ac839
LW
217#ifndef _TYPES_ /* If types.h defines this it's easy. */
218# ifndef major /* Does everyone's types.h define this? */
219# include <sys/types.h>
c07a80fd 220# endif
663a0e37
LW
221#endif
222
760ac839
LW
223#ifdef __cplusplus
224# ifndef I_STDARG
225# define I_STDARG 1
226# endif
227#endif
228
229#ifdef I_STDARG
230# include <stdarg.h>
231#else
232# ifdef I_VARARGS
233# include <varargs.h>
234# endif
235#endif
236
237#include "perlio.h"
76e3520e 238#include "perlmem.h"
6ad3d225
GS
239#include "perllio.h"
240#include "perlsock.h"
241#include "perlproc.h"
242#include "perlenv.h"
243#include "perldir.h"
0c30d9ec 244
4633a7c4 245#ifdef USE_NEXT_CTYPE
0c30d9ec
PP
246
247#if NX_CURRENT_COMPILER_RELEASE >= 400
248#include <objc/NXCType.h>
249#else /* NX_CURRENT_COMPILER_RELEASE < 400 */
a0d0e21e 250#include <appkit/NXCType.h>
0c30d9ec
PP
251#endif /* NX_CURRENT_COMPILER_RELEASE >= 400 */
252
253#else /* !USE_NEXT_CTYPE */
fe14fcc3 254#include <ctype.h>
0c30d9ec 255#endif /* USE_NEXT_CTYPE */
a0d0e21e
LW
256
257#ifdef METHOD /* Defined by OSF/1 v3.0 by ctype.h */
258#undef METHOD
a0d0e21e
LW
259#endif
260
4633a7c4 261#ifdef I_LOCALE
36477c24 262# include <locale.h>
4633a7c4
LW
263#endif
264
36477c24
PP
265#if !defined(NO_LOCALE) && defined(HAS_SETLOCALE)
266# define USE_LOCALE
267# if !defined(NO_LOCALE_COLLATE) && defined(LC_COLLATE) \
268 && defined(HAS_STRXFRM)
269# define USE_LOCALE_COLLATE
270# endif
271# if !defined(NO_LOCALE_CTYPE) && defined(LC_CTYPE)
272# define USE_LOCALE_CTYPE
273# endif
274# if !defined(NO_LOCALE_NUMERIC) && defined(LC_NUMERIC)
275# define USE_LOCALE_NUMERIC
276# endif
277#endif /* !NO_LOCALE && HAS_SETLOCALE */
a0d0e21e 278
fe14fcc3 279#include <setjmp.h>
79072805 280
a0d0e21e 281#ifdef I_SYS_PARAM
79072805
LW
282# ifdef PARAM_NEEDS_TYPES
283# include <sys/types.h>
284# endif
285# include <sys/param.h>
352d5a3a 286#endif
79072805
LW
287
288
289/* Use all the "standard" definitions? */
a0d0e21e 290#if defined(STANDARD_C) && defined(I_STDLIB)
79072805 291# include <stdlib.h>
ff68c719 292#endif
03a14243 293
c31fac66
GS
294#define MEM_SIZE Size_t
295
55497cff
PP
296/* This comes after <stdlib.h> so we don't try to change the standard
297 * library prototypes; we'll use our own in proto.h instead. */
03a14243 298
4633a7c4 299#ifdef MYMALLOC
55497cff 300
4633a7c4 301# ifdef HIDEMYMALLOC
55497cff
PP
302# define malloc Mymalloc
303# define calloc Mycalloc
4633a7c4 304# define realloc Myremalloc
55497cff 305# define free Myfree
c31fac66
GS
306Malloc_t Mymalloc _((MEM_SIZE nbytes));
307Malloc_t Mycalloc _((MEM_SIZE elements, MEM_SIZE size));
308Malloc_t Myrealloc _((Malloc_t where, MEM_SIZE nbytes));
309Free_t Myfree _((Malloc_t where));
55497cff
PP
310# endif
311# ifdef EMBEDMYMALLOC
312# define malloc Perl_malloc
313# define calloc Perl_calloc
314# define realloc Perl_realloc
315# define free Perl_free
c31fac66
GS
316Malloc_t Perl_malloc _((MEM_SIZE nbytes));
317Malloc_t Perl_calloc _((MEM_SIZE elements, MEM_SIZE size));
318Malloc_t Perl_realloc _((Malloc_t where, MEM_SIZE nbytes));
319Free_t Perl_free _((Malloc_t where));
4633a7c4 320# endif
55497cff
PP
321
322# undef safemalloc
323# undef safecalloc
324# undef saferealloc
325# undef safefree
326# define safemalloc malloc
327# define safecalloc calloc
4633a7c4 328# define saferealloc realloc
55497cff
PP
329# define safefree free
330
331#endif /* MYMALLOC */
4633a7c4 332
ff68c719
PP
333#if defined(STANDARD_C) && defined(I_STDDEF)
334# include <stddef.h>
71be2cbc 335# define STRUCT_OFFSET(s,m) offsetof(s,m)
ff68c719 336#else
71be2cbc 337# define STRUCT_OFFSET(s,m) (Size_t)(&(((s *)0)->m))
ff68c719
PP
338#endif
339
a0d0e21e
LW
340#if defined(I_STRING) || defined(__cplusplus)
341# include <string.h>
342#else
343# include <strings.h>
344#endif
345
346#if !defined(HAS_STRCHR) && defined(HAS_INDEX) && !defined(strchr)
347#define strchr index
348#define strrchr rindex
349#endif
350
16d20bd9
AD
351#ifdef I_MEMORY
352# include <memory.h>
353#endif
354
fe14fcc3 355#ifdef HAS_MEMCPY
85e6fe83 356# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
fe14fcc3 357# ifndef memcpy
a0d0e21e 358 extern char * memcpy _((char*, char*, int));
ee0007ab
LW
359# endif
360# endif
361#else
362# ifndef memcpy
363# ifdef HAS_BCOPY
364# define memcpy(d,s,l) bcopy(s,d,l)
365# else
366# define memcpy(d,s,l) my_bcopy(s,d,l)
367# endif
368# endif
369#endif /* HAS_MEMCPY */
fe14fcc3 370
ee0007ab 371#ifdef HAS_MEMSET
85e6fe83 372# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
ee0007ab 373# ifndef memset
a0d0e21e 374 extern char *memset _((char*, int, int));
ee0007ab
LW
375# endif
376# endif
ee0007ab 377#else
fc36a67e 378# define memset(d,c,l) my_memset(d,c,l)
ee0007ab
LW
379#endif /* HAS_MEMSET */
380
85e6fe83 381#if !defined(HAS_MEMMOVE) && !defined(memmove)
2304df62 382# if defined(HAS_BCOPY) && defined(HAS_SAFE_BCOPY)
79072805
LW
383# define memmove(d,s,l) bcopy(s,d,l)
384# else
2304df62 385# if defined(HAS_MEMCPY) && defined(HAS_SAFE_MEMCPY)
79072805 386# define memmove(d,s,l) memcpy(d,s,l)
ee0007ab 387# else
79072805 388# define memmove(d,s,l) my_bcopy(s,d,l)
ee0007ab 389# endif
352d5a3a 390# endif
d9d8d8de 391#endif
ee0007ab 392
36477c24
PP
393#if defined(mips) && defined(ultrix) && !defined(__STDC__)
394# undef HAS_MEMCMP
395#endif
396
397#if defined(HAS_MEMCMP) && defined(HAS_SANE_MEMCMP)
85e6fe83 398# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
ee0007ab 399# ifndef memcmp
a0d0e21e 400 extern int memcmp _((char*, char*, int));
ee0007ab
LW
401# endif
402# endif
36477c24
PP
403# ifdef BUGGY_MSC
404 # pragma function(memcmp)
405# endif
ee0007ab
LW
406#else
407# ifndef memcmp
ecfc5424 408# define memcmp my_memcmp
352d5a3a 409# endif
36477c24 410#endif /* HAS_MEMCMP && HAS_SANE_MEMCMP */
8d063cd8 411
fc36a67e 412#ifndef memzero
c635e13b
PP
413# ifdef HAS_MEMSET
414# define memzero(d,l) memset(d,0,l)
79072805 415# else
c635e13b
PP
416# ifdef HAS_BZERO
417# define memzero(d,l) bzero(d,l)
79072805 418# else
fc36a67e 419# define memzero(d,l) my_bzero(d,l)
79072805
LW
420# endif
421# endif
d9d8d8de 422#endif
378cc40b 423
36477c24
PP
424#ifndef HAS_BCMP
425# ifndef bcmp
426# define bcmp(s1,s2,l) memcmp(s1,s2,l)
79072805 427# endif
36477c24 428#endif /* !HAS_BCMP */
378cc40b 429
ae986130 430#ifdef I_NETINET_IN
79072805 431# include <netinet/in.h>
ae986130
LW
432#endif
433
84902520
TB
434#if defined(SF_APPEND) && defined(USE_SFIO) && defined(I_SFIO)
435/* <sfio.h> defines SF_APPEND and <sys/stat.h> might define SF_APPEND
436 * (the neo-BSD seem to do this). */
437# undef SF_APPEND
438#endif
439
1aef975c 440#ifdef I_SYS_STAT
84902520 441# include <sys/stat.h>
1aef975c 442#endif
79072805 443
a0d0e21e
LW
444/* The stat macros for Amdahl UTS, Unisoft System V/88 (and derivatives
445 like UTekV) are broken, sometimes giving false positives. Undefine
446 them here and let the code below set them to proper values.
447
448 The ghs macro stands for GreenHills Software C-1.8.5 which
449 is the C compiler for sysV88 and the various derivatives.
450 This header file bug is corrected in gcc-2.5.8 and later versions.
451 --Kaveh Ghazi (ghazi@noc.rutgers.edu) 10/3/94. */
452
453#if defined(uts) || (defined(m88k) && defined(ghs))
79072805
LW
454# undef S_ISDIR
455# undef S_ISCHR
456# undef S_ISBLK
457# undef S_ISREG
458# undef S_ISFIFO
459# undef S_ISLNK
ee0007ab 460#endif
135863df 461
663a0e37
LW
462#ifdef I_TIME
463# include <time.h>
ffed7fef 464#endif
663a0e37 465
fe14fcc3 466#ifdef I_SYS_TIME
85e6fe83 467# ifdef I_SYS_TIME_KERNEL
663a0e37
LW
468# define KERNEL
469# endif
470# include <sys/time.h>
85e6fe83 471# ifdef I_SYS_TIME_KERNEL
663a0e37
LW
472# undef KERNEL
473# endif
a687059c 474#endif
135863df 475
55497cff 476#if defined(HAS_TIMES) && defined(I_SYS_TIMES)
85e6fe83 477# include <sys/times.h>
d9d8d8de 478#endif
8d063cd8 479
fe14fcc3 480#if defined(HAS_STRERROR) && (!defined(HAS_MKDIR) || !defined(HAS_RMDIR))
79072805 481# undef HAS_STRERROR
663a0e37
LW
482#endif
483
a0d0e21e
LW
484#ifndef HAS_MKFIFO
485# ifndef mkfifo
486# define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
487# endif
488#endif /* !HAS_MKFIFO */
489
663a0e37 490#include <errno.h>
ed6116ce 491#ifdef HAS_SOCKET
85e6fe83 492# ifdef I_NET_ERRNO
ed6116ce
LW
493# include <net/errno.h>
494# endif
495#endif
f86702cc
PP
496
497#ifdef VMS
498# define SETERRNO(errcode,vmserrcode) \
499 STMT_START { \
500 set_errno(errcode); \
501 set_vaxc_errno(vmserrcode); \
502 } STMT_END
748a9306 503#else
f86702cc 504# define SETERRNO(errcode,vmserrcode) errno = (errcode)
748a9306 505#endif
ed6116ce 506
38a03e6e
MB
507#ifdef USE_THREADS
508# define ERRSV (thr->errsv)
509# define ERRHV (thr->errhv)
940cb80d
MB
510# define DEFSV THREADSV(0)
511# define SAVE_DEFSV save_threadsv(0)
38a03e6e
MB
512#else
513# define ERRSV GvSV(errgv)
514# define ERRHV GvHV(errgv)
54b9620d
MB
515# define DEFSV GvSV(defgv)
516# define SAVE_DEFSV SAVESPTR(GvSV(defgv))
38a03e6e
MB
517#endif /* USE_THREADS */
518
55497cff 519#ifndef errno
79072805 520 extern int errno; /* ANSI allows errno to be an lvalue expr */
d9d8d8de 521#endif
663a0e37 522
2304df62 523#ifdef HAS_STRERROR
a0d0e21e
LW
524# ifdef VMS
525 char *strerror _((int,...));
526# else
68dc0745 527#ifndef DONT_DECLARE_STD
a0d0e21e 528 char *strerror _((int));
68dc0745 529#endif
a0d0e21e 530# endif
2304df62
AD
531# ifndef Strerror
532# define Strerror strerror
533# endif
534#else
535# ifdef HAS_SYS_ERRLIST
79072805
LW
536 extern int sys_nerr;
537 extern char *sys_errlist[];
2304df62
AD
538# ifndef Strerror
539# define Strerror(e) \
79072805 540 ((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e])
2304df62 541# endif
79072805 542# endif
35c8bce7 543#endif
663a0e37 544
2304df62 545#ifdef I_SYS_IOCTL
79072805
LW
546# ifndef _IOCTL_
547# include <sys/ioctl.h>
548# endif
a687059c
LW
549#endif
550
ee0007ab 551#if defined(mc300) || defined(mc500) || defined(mc700) || defined(mc6000)
79072805
LW
552# ifdef HAS_SOCKETPAIR
553# undef HAS_SOCKETPAIR
554# endif
2304df62
AD
555# ifdef I_NDBM
556# undef I_NDBM
79072805 557# endif
a687059c
LW
558#endif
559
a687059c 560#if INTSIZE == 2
79072805
LW
561# define htoni htons
562# define ntohi ntohs
a687059c 563#else
79072805
LW
564# define htoni htonl
565# define ntohi ntohl
a687059c
LW
566#endif
567
a0d0e21e 568/* Configure already sets Direntry_t */
35c8bce7 569#if defined(I_DIRENT)
663a0e37 570# include <dirent.h>
a0d0e21e
LW
571# if defined(NeXT) && defined(I_SYS_DIR) /* NeXT needs dirent + sys/dir.h */
572# include <sys/dir.h>
573# endif
ae986130 574#else
fe14fcc3 575# ifdef I_SYS_NDIR
79a0689e 576# include <sys/ndir.h>
663a0e37 577# else
fe14fcc3 578# ifdef I_SYS_DIR
79a0689e
LW
579# ifdef hp9000s500
580# include <ndir.h> /* may be wrong in the future */
581# else
582# include <sys/dir.h>
583# endif
663a0e37
LW
584# endif
585# endif
4633a7c4 586#endif
a687059c 587
352d5a3a
LW
588#ifdef FPUTS_BOTCH
589/* work around botch in SunOS 4.0.1 and 4.0.2 */
590# ifndef fputs
79072805 591# define fputs(sv,fp) fprintf(fp,"%s",sv)
352d5a3a
LW
592# endif
593#endif
594
c623bd54
LW
595/*
596 * The following gobbledygook brought to you on behalf of __STDC__.
597 * (I could just use #ifndef __STDC__, but this is more bulletproof
598 * in the face of half-implementations.)
599 */
600
601#ifndef S_IFMT
602# ifdef _S_IFMT
603# define S_IFMT _S_IFMT
604# else
605# define S_IFMT 0170000
606# endif
607#endif
608
609#ifndef S_ISDIR
610# define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR)
611#endif
612
613#ifndef S_ISCHR
614# define S_ISCHR(m) ((m & S_IFMT) == S_IFCHR)
615#endif
616
617#ifndef S_ISBLK
fe14fcc3
LW
618# ifdef S_IFBLK
619# define S_ISBLK(m) ((m & S_IFMT) == S_IFBLK)
620# else
621# define S_ISBLK(m) (0)
622# endif
c623bd54
LW
623#endif
624
625#ifndef S_ISREG
626# define S_ISREG(m) ((m & S_IFMT) == S_IFREG)
627#endif
628
629#ifndef S_ISFIFO
fe14fcc3
LW
630# ifdef S_IFIFO
631# define S_ISFIFO(m) ((m & S_IFMT) == S_IFIFO)
632# else
633# define S_ISFIFO(m) (0)
634# endif
c623bd54
LW
635#endif
636
637#ifndef S_ISLNK
638# ifdef _S_ISLNK
639# define S_ISLNK(m) _S_ISLNK(m)
640# else
641# ifdef _S_IFLNK
642# define S_ISLNK(m) ((m & S_IFMT) == _S_IFLNK)
643# else
644# ifdef S_IFLNK
645# define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK)
646# else
647# define S_ISLNK(m) (0)
648# endif
649# endif
650# endif
651#endif
652
653#ifndef S_ISSOCK
654# ifdef _S_ISSOCK
655# define S_ISSOCK(m) _S_ISSOCK(m)
656# else
657# ifdef _S_IFSOCK
658# define S_ISSOCK(m) ((m & S_IFMT) == _S_IFSOCK)
659# else
660# ifdef S_IFSOCK
661# define S_ISSOCK(m) ((m & S_IFMT) == S_IFSOCK)
662# else
663# define S_ISSOCK(m) (0)
664# endif
665# endif
666# endif
667#endif
668
669#ifndef S_IRUSR
670# ifdef S_IREAD
671# define S_IRUSR S_IREAD
672# define S_IWUSR S_IWRITE
673# define S_IXUSR S_IEXEC
674# else
675# define S_IRUSR 0400
676# define S_IWUSR 0200
677# define S_IXUSR 0100
678# endif
679# define S_IRGRP (S_IRUSR>>3)
680# define S_IWGRP (S_IWUSR>>3)
681# define S_IXGRP (S_IXUSR>>3)
682# define S_IROTH (S_IRUSR>>6)
683# define S_IWOTH (S_IWUSR>>6)
684# define S_IXOTH (S_IXUSR>>6)
685#endif
686
687#ifndef S_ISUID
688# define S_ISUID 04000
689#endif
690
691#ifndef S_ISGID
692# define S_ISGID 02000
693#endif
694
79072805
LW
695#ifdef ff_next
696# undef ff_next
352d5a3a
LW
697#endif
698
a0d0e21e 699#if defined(cray) || defined(gould) || defined(i860) || defined(pyr)
45d8adaa
LW
700# define SLOPPYDIVIDE
701#endif
702
748a9306
LW
703#ifdef UV
704#undef UV
705#endif
706
27d4fb96
PP
707/* XXX QUAD stuff is not currently supported on most systems.
708 Specifically, perl internals don't support long long. Among
709 the many problems is that some compilers support long long,
710 but the underlying library functions (such as sprintf) don't.
711 Some things do work (such as quad pack/unpack on convex);
712 also some systems use long long for the fpos_t typedef. That
713 seems to work too.
714
715 The IV type is supposed to be long enough to hold any integral
716 value or a pointer.
717 --Andy Dougherty August 1996
718*/
719
f86702cc
PP
720#ifdef cray
721# define Quad_t int
722#else
723# ifdef convex
724# define Quad_t long long
45d8adaa 725# else
ff0cee69 726# if BYTEORDER > 0xFFFF
ecfc5424 727# define Quad_t long
45d8adaa
LW
728# endif
729# endif
f86702cc
PP
730#endif
731
732#ifdef Quad_t
733# define HAS_QUAD
748a9306
LW
734 typedef Quad_t IV;
735 typedef unsigned Quad_t UV;
27d4fb96
PP
736# define IV_MAX PERL_QUAD_MAX
737# define IV_MIN PERL_QUAD_MIN
738# define UV_MAX PERL_UQUAD_MAX
739# define UV_MIN PERL_UQUAD_MIN
79072805 740#else
748a9306
LW
741 typedef long IV;
742 typedef unsigned long UV;
27d4fb96
PP
743# define IV_MAX PERL_LONG_MAX
744# define IV_MIN PERL_LONG_MIN
745# define UV_MAX PERL_ULONG_MAX
746# define UV_MIN PERL_ULONG_MIN
79072805
LW
747#endif
748
760ac839
LW
749/* Previously these definitions used hardcoded figures.
750 * It is hoped these formula are more portable, although
751 * no data one way or another is presently known to me.
752 * The "PERL_" names are used because these calculated constants
753 * do not meet the ANSI requirements for LONG_MAX, etc., which
754 * need to be constants acceptable to #if - kja
755 * define PERL_LONG_MAX 2147483647L
756 * define PERL_LONG_MIN (-LONG_MAX - 1)
757 * define PERL ULONG_MAX 4294967295L
758 */
759
760#ifdef I_LIMITS /* Needed for cast_xxx() functions below. */
761# include <limits.h>
762#else
763#ifdef I_VALUES
764# include <values.h>
765#endif
766#endif
767
99abf803
PP
768/*
769 * Try to figure out max and min values for the integral types. THE CORRECT
770 * SOLUTION TO THIS MESS: ADAPT enquire.c FROM GCC INTO CONFIGURE. The
771 * following hacks are used if neither limits.h or values.h provide them:
772 * U<TYPE>_MAX: for types >= int: ~(unsigned TYPE)0
773 * for types < int: (unsigned TYPE)~(unsigned)0
774 * The argument to ~ must be unsigned so that later signed->unsigned
775 * conversion can't modify the value's bit pattern (e.g. -0 -> +0),
776 * and it must not be smaller than int because ~ does integral promotion.
777 * <type>_MAX: (<type>) (U<type>_MAX >> 1)
778 * <type>_MIN: -<type>_MAX - <is_twos_complement_architecture: (3 & -1) == 3>.
779 * The latter is a hack which happens to work on some machines but
780 * does *not* catch any random system, or things like integer types
781 * with NaN if that is possible.
782 *
783 * All of the types are explicitly cast to prevent accidental loss of
784 * numeric range, and in the hope that they will be less likely to confuse
785 * over-eager optimizers.
786 *
787 */
27d4fb96 788
99abf803
PP
789#define PERL_UCHAR_MIN ((unsigned char)0)
790
791#ifdef UCHAR_MAX
792# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
27d4fb96 793#else
99abf803
PP
794# ifdef MAXUCHAR
795# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
27d4fb96 796# else
99abf803 797# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
27d4fb96
PP
798# endif
799#endif
99abf803
PP
800
801/*
802 * CHAR_MIN and CHAR_MAX are not included here, as the (char) type may be
803 * ambiguous. It may be equivalent to (signed char) or (unsigned char)
804 * depending on local options. Until Configure detects this (or at least
805 * detects whether the "signed" keyword is available) the CHAR ranges
806 * will not be included. UCHAR functions normally.
807 * - kja
808 */
27d4fb96 809
99abf803
PP
810#define PERL_USHORT_MIN ((unsigned short)0)
811
812#ifdef USHORT_MAX
813# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
27d4fb96 814#else
99abf803
PP
815# ifdef MAXUSHORT
816# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
27d4fb96 817# else
ef2f54b0
CB
818# ifdef USHRT_MAX
819# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
820# else
821# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
822# endif
27d4fb96
PP
823# endif
824#endif
825
27d4fb96 826#ifdef SHORT_MAX
99abf803 827# define PERL_SHORT_MAX ((short)SHORT_MAX)
27d4fb96
PP
828#else
829# ifdef MAXSHORT /* Often used in <values.h> */
99abf803 830# define PERL_SHORT_MAX ((short)MAXSHORT)
27d4fb96 831# else
ef2f54b0
CB
832# ifdef SHRT_MAX
833# define PERL_SHORT_MAX ((short)SHRT_MAX)
834# else
835# define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
836# endif
27d4fb96
PP
837# endif
838#endif
839
840#ifdef SHORT_MIN
99abf803 841# define PERL_SHORT_MIN ((short)SHORT_MIN)
27d4fb96
PP
842#else
843# ifdef MINSHORT
99abf803 844# define PERL_SHORT_MIN ((short)MINSHORT)
27d4fb96 845# else
ef2f54b0
CB
846# ifdef SHRT_MIN
847# define PERL_SHORT_MIN ((short)SHRT_MIN)
848# else
849# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
850# endif
27d4fb96
PP
851# endif
852#endif
853
99abf803
PP
854#ifdef UINT_MAX
855# define PERL_UINT_MAX ((unsigned int)UINT_MAX)
27d4fb96 856#else
99abf803
PP
857# ifdef MAXUINT
858# define PERL_UINT_MAX ((unsigned int)MAXUINT)
27d4fb96 859# else
99abf803 860# define PERL_UINT_MAX (~(unsigned int)0)
27d4fb96
PP
861# endif
862#endif
863
99abf803 864#define PERL_UINT_MIN ((unsigned int)0)
27d4fb96
PP
865
866#ifdef INT_MAX
99abf803 867# define PERL_INT_MAX ((int)INT_MAX)
27d4fb96
PP
868#else
869# ifdef MAXINT /* Often used in <values.h> */
99abf803 870# define PERL_INT_MAX ((int)MAXINT)
27d4fb96 871# else
99abf803 872# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
27d4fb96
PP
873# endif
874#endif
875
876#ifdef INT_MIN
99abf803 877# define PERL_INT_MIN ((int)INT_MIN)
27d4fb96
PP
878#else
879# ifdef MININT
99abf803 880# define PERL_INT_MIN ((int)MININT)
27d4fb96
PP
881# else
882# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
883# endif
884#endif
885
99abf803
PP
886#ifdef ULONG_MAX
887# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
27d4fb96 888#else
99abf803
PP
889# ifdef MAXULONG
890# define PERL_ULONG_MAX ((unsigned long)MAXULONG)
27d4fb96 891# else
99abf803 892# define PERL_ULONG_MAX (~(unsigned long)0)
27d4fb96
PP
893# endif
894#endif
895
99abf803 896#define PERL_ULONG_MIN ((unsigned long)0L)
27d4fb96 897
760ac839 898#ifdef LONG_MAX
99abf803 899# define PERL_LONG_MAX ((long)LONG_MAX)
760ac839
LW
900#else
901# ifdef MAXLONG /* Often used in <values.h> */
99abf803 902# define PERL_LONG_MAX ((long)MAXLONG)
760ac839 903# else
99abf803 904# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
760ac839
LW
905# endif
906#endif
907
908#ifdef LONG_MIN
99abf803 909# define PERL_LONG_MIN ((long)LONG_MIN)
760ac839
LW
910#else
911# ifdef MINLONG
99abf803 912# define PERL_LONG_MIN ((long)MINLONG)
760ac839 913# else
27d4fb96 914# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
760ac839
LW
915# endif
916#endif
917
99abf803
PP
918#ifdef HAS_QUAD
919
920# ifdef UQUAD_MAX
921# define PERL_UQUAD_MAX ((UV)UQUAD_MAX)
760ac839 922# else
99abf803 923# define PERL_UQUAD_MAX (~(UV)0)
760ac839 924# endif
760ac839 925
99abf803 926# define PERL_UQUAD_MIN ((UV)0)
27d4fb96 927
27d4fb96 928# ifdef QUAD_MAX
99abf803 929# define PERL_QUAD_MAX ((IV)QUAD_MAX)
27d4fb96 930# else
99abf803 931# define PERL_QUAD_MAX ((IV) (PERL_UQUAD_MAX >> 1))
27d4fb96
PP
932# endif
933
934# ifdef QUAD_MIN
99abf803 935# define PERL_QUAD_MIN ((IV)QUAD_MIN)
27d4fb96 936# else
a6e633de 937# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
27d4fb96
PP
938# endif
939
79072805
LW
940#endif
941
ee0007ab 942typedef MEM_SIZE STRLEN;
450a55e4 943
79072805
LW
944typedef struct op OP;
945typedef struct cop COP;
946typedef struct unop UNOP;
947typedef struct binop BINOP;
948typedef struct listop LISTOP;
949typedef struct logop LOGOP;
950typedef struct condop CONDOP;
951typedef struct pmop PMOP;
952typedef struct svop SVOP;
953typedef struct gvop GVOP;
954typedef struct pvop PVOP;
79072805
LW
955typedef struct loop LOOP;
956
957typedef struct Outrec Outrec;
93a17b20 958typedef struct interpreter PerlInterpreter;
3e3baf6d
TB
959#ifndef __BORLANDC__
960typedef struct ff FF; /* XXX not defined anywhere, should go? */
961#endif
79072805
LW
962typedef struct sv SV;
963typedef struct av AV;
964typedef struct hv HV;
965typedef struct cv CV;
378cc40b 966typedef struct regexp REGEXP;
79072805 967typedef struct gp GP;
0c30d9ec 968typedef struct gv GV;
8990e307 969typedef struct io IO;
c09156bb 970typedef struct context PERL_CONTEXT;
79072805
LW
971typedef struct block BLOCK;
972
973typedef struct magic MAGIC;
ed6116ce 974typedef struct xrv XRV;
79072805
LW
975typedef struct xpv XPV;
976typedef struct xpviv XPVIV;
ff68c719 977typedef struct xpvuv XPVUV;
79072805
LW
978typedef struct xpvnv XPVNV;
979typedef struct xpvmg XPVMG;
980typedef struct xpvlv XPVLV;
981typedef struct xpvav XPVAV;
982typedef struct xpvhv XPVHV;
983typedef struct xpvgv XPVGV;
984typedef struct xpvcv XPVCV;
985typedef struct xpvbm XPVBM;
986typedef struct xpvfm XPVFM;
8990e307 987typedef struct xpvio XPVIO;
79072805
LW
988typedef struct mgvtbl MGVTBL;
989typedef union any ANY;
8d063cd8 990
378cc40b 991#include "handy.h"
a0d0e21e 992
16d20bd9
AD
993typedef I32 (*filter_t) _((int, SV *, int));
994#define FILTER_READ(idx, sv, len) filter_read(idx, sv, len)
995#define FILTER_DATA(idx) (AvARRAY(rsfp_filters)[idx])
93965878 996#define FILTER_ISREADER(idx) (idx >= AvFILLp(rsfp_filters))
16d20bd9 997
748a9306 998#ifdef DOSISH
4633a7c4
LW
999# if defined(OS2)
1000# include "os2ish.h"
1001# else
748a9306 1002# include "dosish.h"
4633a7c4 1003# endif
a0d0e21e 1004#else
748a9306
LW
1005# if defined(VMS)
1006# include "vmsish.h"
1007# else
0c30d9ec
PP
1008# if defined(PLAN9)
1009# include "./plan9/plan9ish.h"
1010# else
1011# include "unixish.h"
1012# endif
748a9306 1013# endif
32f822de
GS
1014#endif
1015
ac4c12e7
GS
1016#ifndef FUNC_NAME_TO_PTR
1017#define FUNC_NAME_TO_PTR(name) name
1018#endif
1019
32f822de 1020/*
dd96f567
IZ
1021 * USE_THREADS needs to be after unixish.h as <pthread.h> includes
1022 * <sys/signal.h> which defines NSIG - which will stop inclusion of <signal.h>
32f822de
GS
1023 * this results in many functions being undeclared which bothers C++
1024 * May make sense to have threads after "*ish.h" anyway
1025 */
1026
1027#ifdef USE_THREADS
1028# ifdef FAKE_THREADS
1029# include "fakethr.h"
1030# else
1031# ifdef WIN32
1032# include <win32thread.h>
1033# else
dd96f567
IZ
1034# ifdef OS2
1035# include "os2thread.h"
1036# else
1037# include <pthread.h>
c6ee37c5 1038typedef pthread_t perl_os_thread;
32f822de
GS
1039typedef pthread_mutex_t perl_mutex;
1040typedef pthread_cond_t perl_cond;
1041typedef pthread_key_t perl_key;
dd96f567 1042# endif /* OS2 */
32f822de
GS
1043# endif /* WIN32 */
1044# endif /* FAKE_THREADS */
1045#endif /* USE_THREADS */
1046
1047
3fc1aec6 1048
68dc0745
PP
1049#ifdef VMS
1050# define STATUS_NATIVE statusvalue_vms
1051# define STATUS_NATIVE_EXPORT \
1052 ((I32)statusvalue_vms == -1 ? 44 : statusvalue_vms)
1053# define STATUS_NATIVE_SET(n) \
1054 STMT_START { \
1055 statusvalue_vms = (n); \
1056 if ((I32)statusvalue_vms == -1) \
1057 statusvalue = -1; \
1058 else if (statusvalue_vms & STS$M_SUCCESS) \
1059 statusvalue = 0; \
1060 else if ((statusvalue_vms & STS$M_SEVERITY) == 0) \
1061 statusvalue = 1 << 8; \
1062 else \
1063 statusvalue = (statusvalue_vms & STS$M_SEVERITY) << 8; \
1064 } STMT_END
1065# define STATUS_POSIX statusvalue
1066# ifdef VMSISH_STATUS
1067# define STATUS_CURRENT (VMSISH_STATUS ? STATUS_NATIVE : STATUS_POSIX)
1068# else
1069# define STATUS_CURRENT STATUS_POSIX
1070# endif
1071# define STATUS_POSIX_SET(n) \
1072 STMT_START { \
1073 statusvalue = (n); \
1074 if (statusvalue != -1) { \
1075 statusvalue &= 0xFFFF; \
1076 statusvalue_vms = statusvalue ? 44 : 1; \
1077 } \
1078 else statusvalue_vms = -1; \
1079 } STMT_END
1080# define STATUS_ALL_SUCCESS (statusvalue = 0, statusvalue_vms = 1)
1081# define STATUS_ALL_FAILURE (statusvalue = 1, statusvalue_vms = 44)
1082#else
1083# define STATUS_NATIVE STATUS_POSIX
1084# define STATUS_NATIVE_EXPORT STATUS_POSIX
1085# define STATUS_NATIVE_SET STATUS_POSIX_SET
1086# define STATUS_POSIX statusvalue
1087# define STATUS_POSIX_SET(n) \
1088 STMT_START { \
1089 statusvalue = (n); \
1090 if (statusvalue != -1) \
1091 statusvalue &= 0xFFFF; \
1092 } STMT_END
1093# define STATUS_CURRENT STATUS_POSIX
1094# define STATUS_ALL_SUCCESS (statusvalue = 0)
1095# define STATUS_ALL_FAILURE (statusvalue = 1)
1096#endif
1097
3fc1aec6
PP
1098/* Some unistd.h's give a prototype for pause() even though
1099 HAS_PAUSE ends up undefined. This causes the #define
1100 below to be rejected by the compmiler. Sigh.
1101*/
1102#ifdef HAS_PAUSE
1103#define Pause pause
1104#else
1105#define Pause() sleep((32767<<16)+32767)
748a9306
LW
1106#endif
1107
1108#ifndef IOCPARM_LEN
1109# ifdef IOCPARM_MASK
1110 /* on BSDish systes we're safe */
1111# define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK)
1112# else
1113 /* otherwise guess at what's safe */
1114# define IOCPARM_LEN(x) 256
1115# endif
a0d0e21e
LW
1116#endif
1117
79072805
LW
1118union any {
1119 void* any_ptr;
1120 I32 any_i32;
a0d0e21e 1121 IV any_iv;
85e6fe83 1122 long any_long;
565764a8 1123 void (CPERLscope(*any_dptr)) _((void*));
79072805
LW
1124};
1125
11343788 1126#ifdef USE_THREADS
52e1cb5e 1127#define ARGSproto struct perl_thread *thr
11343788
MB
1128#else
1129#define ARGSproto void
1130#endif /* USE_THREADS */
1131
5aabfad6
PP
1132/* Work around some cygwin32 problems with importing global symbols */
1133#if defined(CYGWIN32) && defined(DLLIMPORT)
1134# include "cw32imp.h"
1135#endif
1136
378cc40b 1137#include "regexp.h"
79072805 1138#include "sv.h"
378cc40b 1139#include "util.h"
8d063cd8 1140#include "form.h"
79072805
LW
1141#include "gv.h"
1142#include "cv.h"
1143#include "opcode.h"
1144#include "op.h"
1145#include "cop.h"
1146#include "av.h"
1147#include "hv.h"
1148#include "mg.h"
1149#include "scope.h"
d613ef02
GS
1150#include "bytecode.h"
1151#include "byterun.h"
8d063cd8 1152
7fae4e64
GS
1153/* Current curly descriptor */
1154typedef struct curcur CURCUR;
1155struct curcur {
1156 int parenfloor; /* how far back to strip paren data */
1157 int cur; /* how many instances of scan we've matched */
1158 int min; /* the minimal number of scans to match */
1159 int max; /* the maximal number of scans to match */
1160 int minmod; /* whether to work our way up or down */
1161 regnode * scan; /* the thing to match */
1162 regnode * next; /* what has to match after it */
1163 char * lastloc; /* where we started matching this scan */
1164 CURCUR * oldcc; /* current curly before we started this one */
1165};
1166
1167typedef struct _sublex_info SUBLEXINFO;
1168struct _sublex_info {
1169 I32 super_state; /* lexer state to save */
1170 I32 sub_inwhat; /* "lex_inwhat" to use */
1171 OP *sub_op; /* "lex_op" to use */
1172};
1173
76e3520e
GS
1174#ifdef PERL_OBJECT
1175struct magic_state {
1176 SV* mgs_sv;
1177 U32 mgs_flags;
1178};
1179typedef struct magic_state MGS;
1180
1181typedef struct {
1182 I32 len_min;
1183 I32 len_delta;
1184 I32 pos_min;
1185 I32 pos_delta;
1186 SV *last_found;
1187 I32 last_end; /* min value, <0 unless valid. */
1188 I32 last_start_min;
1189 I32 last_start_max;
1190 SV **longest; /* Either &l_fixed, or &l_float. */
1191 SV *longest_fixed;
1192 I32 offset_fixed;
1193 SV *longest_float;
1194 I32 offset_float_min;
1195 I32 offset_float_max;
1196 I32 flags;
1197} scan_data_t;
1198
1199typedef I32 CHECKPOINT;
1200#endif /* PERL_OBJECT */
1201
4633a7c4
LW
1202/* work around some libPW problems */
1203#ifdef DOINIT
1204EXT char Error[1];
1205#endif
1206
450a55e4 1207#if defined(iAPX286) || defined(M_I286) || defined(I80286)
a687059c
LW
1208# define I286
1209#endif
1210
fe14fcc3
LW
1211#if defined(htonl) && !defined(HAS_HTONL)
1212#define HAS_HTONL
ae986130 1213#endif
fe14fcc3
LW
1214#if defined(htons) && !defined(HAS_HTONS)
1215#define HAS_HTONS
ae986130 1216#endif
fe14fcc3
LW
1217#if defined(ntohl) && !defined(HAS_NTOHL)
1218#define HAS_NTOHL
ae986130 1219#endif
fe14fcc3
LW
1220#if defined(ntohs) && !defined(HAS_NTOHS)
1221#define HAS_NTOHS
ae986130 1222#endif
fe14fcc3 1223#ifndef HAS_HTONL
d9d8d8de 1224#if (BYTEORDER & 0xffff) != 0x4321
fe14fcc3
LW
1225#define HAS_HTONS
1226#define HAS_HTONL
1227#define HAS_NTOHS
1228#define HAS_NTOHL
a687059c
LW
1229#define MYSWAP
1230#define htons my_swap
1231#define htonl my_htonl
1232#define ntohs my_swap
1233#define ntohl my_ntohl
1234#endif
1235#else
d9d8d8de 1236#if (BYTEORDER & 0xffff) == 0x4321
fe14fcc3
LW
1237#undef HAS_HTONS
1238#undef HAS_HTONL
1239#undef HAS_NTOHS
1240#undef HAS_NTOHL
a687059c
LW
1241#endif
1242#endif
1243
988174c1
LW
1244/*
1245 * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
1246 * -DWS
1247 */
1248#if BYTEORDER != 0x1234
1249# define HAS_VTOHL
1250# define HAS_VTOHS
1251# define HAS_HTOVL
1252# define HAS_HTOVS
1253# if BYTEORDER == 0x4321
1254# define vtohl(x) ((((x)&0xFF)<<24) \
1255 +(((x)>>24)&0xFF) \
1256 +(((x)&0x0000FF00)<<8) \
1257 +(((x)&0x00FF0000)>>8) )
1258# define vtohs(x) ((((x)&0xFF)<<8) + (((x)>>8)&0xFF))
1259# define htovl(x) vtohl(x)
1260# define htovs(x) vtohs(x)
1261# endif
1262 /* otherwise default to functions in util.c */
1263#endif
1264
0f85fab0 1265#ifdef CASTNEGFLOAT
79072805 1266#define U_S(what) ((U16)(what))
0f85fab0 1267#define U_I(what) ((unsigned int)(what))
79072805 1268#define U_L(what) ((U32)(what))
0f85fab0 1269#else
32f822de 1270EXTERN_C U32 cast_ulong _((double));
232e078e
AD
1271#define U_S(what) ((U16)cast_ulong((double)(what)))
1272#define U_I(what) ((unsigned int)cast_ulong((double)(what)))
1273#define U_L(what) (cast_ulong((double)(what)))
ee0007ab
LW
1274#endif
1275
ed6116ce
LW
1276#ifdef CASTI32
1277#define I_32(what) ((I32)(what))
a0d0e21e 1278#define I_V(what) ((IV)(what))
5d94fbed 1279#define U_V(what) ((UV)(what))
ed6116ce 1280#else
32f822de 1281START_EXTERN_C
a0d0e21e 1282I32 cast_i32 _((double));
a0d0e21e 1283IV cast_iv _((double));
5d94fbed 1284UV cast_uv _((double));
32f822de 1285END_EXTERN_C
a6e633de
PP
1286#define I_32(what) (cast_i32((double)(what)))
1287#define I_V(what) (cast_iv((double)(what)))
5d94fbed 1288#define U_V(what) (cast_uv((double)(what)))
ed6116ce
LW
1289#endif
1290
79072805
LW
1291struct Outrec {
1292 I32 o_lines;
d9d8d8de 1293 char *o_str;
79072805 1294 U32 o_len;
8d063cd8
LW
1295};
1296
352d5a3a
LW
1297#ifndef MAXSYSFD
1298# define MAXSYSFD 2
1299#endif
ee0007ab 1300
f82b3d41
PP
1301#ifndef TMPPATH
1302# define TMPPATH "/tmp/perl-eXXXXXX"
a0d0e21e 1303#endif
79072805
LW
1304
1305#ifndef __cplusplus
a0d0e21e
LW
1306Uid_t getuid _((void));
1307Uid_t geteuid _((void));
1308Gid_t getgid _((void));
1309Gid_t getegid _((void));
79072805 1310#endif
8d063cd8
LW
1311
1312#ifdef DEBUGGING
0c30d9ec 1313#ifndef Perl_debug_log
760ac839 1314#define Perl_debug_log PerlIO_stderr()
0c30d9ec 1315#endif
d96024cf 1316#define YYDEBUG 1
79072805
LW
1317#define DEB(a) a
1318#define DEBUG(a) if (debug) a
1319#define DEBUG_p(a) if (debug & 1) a
1320#define DEBUG_s(a) if (debug & 2) a
1321#define DEBUG_l(a) if (debug & 4) a
1322#define DEBUG_t(a) if (debug & 8) a
1323#define DEBUG_o(a) if (debug & 16) a
1324#define DEBUG_c(a) if (debug & 32) a
1325#define DEBUG_P(a) if (debug & 64) a
0c30d9ec 1326#define DEBUG_m(a) if (curinterp && debug & 128) a
79072805
LW
1327#define DEBUG_f(a) if (debug & 256) a
1328#define DEBUG_r(a) if (debug & 512) a
1329#define DEBUG_x(a) if (debug & 1024) a
1330#define DEBUG_u(a) if (debug & 2048) a
1331#define DEBUG_L(a) if (debug & 4096) a
1332#define DEBUG_H(a) if (debug & 8192) a
1333#define DEBUG_X(a) if (debug & 16384) a
8990e307 1334#define DEBUG_D(a) if (debug & 32768) a
79072805
LW
1335#else
1336#define DEB(a)
1337#define DEBUG(a)
1338#define DEBUG_p(a)
1339#define DEBUG_s(a)
1340#define DEBUG_l(a)
1341#define DEBUG_t(a)
1342#define DEBUG_o(a)
1343#define DEBUG_c(a)
1344#define DEBUG_P(a)
1345#define DEBUG_m(a)
1346#define DEBUG_f(a)
1347#define DEBUG_r(a)
1348#define DEBUG_x(a)
1349#define DEBUG_u(a)
1350#define DEBUG_L(a)
1351#define DEBUG_H(a)
1352#define DEBUG_X(a)
8990e307 1353#define DEBUG_D(a)
8d063cd8 1354#endif
fe14fcc3 1355#define YYMAXDEPTH 300
8d063cd8 1356
a6e633de 1357#ifndef assert /* <assert.h> might have been included somehow */
79072805
LW
1358#define assert(what) DEB( { \
1359 if (!(what)) { \
463ee0b2 1360 croak("Assertion failed: file \"%s\", line %d", \
79072805 1361 __FILE__, __LINE__); \
6ad3d225 1362 PerlProc_exit(1); \
79072805 1363 }})
a6e633de 1364#endif
8d063cd8 1365
450a55e4 1366struct ufuncs {
a0d0e21e
LW
1367 I32 (*uf_val)_((IV, SV*));
1368 I32 (*uf_set)_((IV, SV*));
1369 IV uf_index;
450a55e4
LW
1370};
1371
fe14fcc3 1372/* Fix these up for __STDC__ */
68dc0745 1373#ifndef DONT_DECLARE_STD
a0d0e21e
LW
1374char *mktemp _((char*));
1375double atof _((const char*));
1376#endif
79072805 1377
352d5a3a 1378#ifndef STANDARD_C
fe14fcc3 1379/* All of these are in stdlib.h or time.h for ANSI C */
85e6fe83 1380Time_t time();
8d063cd8 1381struct tm *gmtime(), *localtime();
93a17b20 1382char *strchr(), *strrchr();
378cc40b 1383char *strcpy(), *strcat();
352d5a3a 1384#endif /* ! STANDARD_C */
8d063cd8 1385
79072805
LW
1386
1387#ifdef I_MATH
1388# include <math.h>
1389#else
32f822de 1390START_EXTERN_C
a0d0e21e 1391 double exp _((double));
a0d0e21e 1392 double log _((double));
c635e13b 1393 double log10 _((double));
a0d0e21e 1394 double sqrt _((double));
c635e13b
PP
1395 double frexp _((double,int*));
1396 double ldexp _((double,int));
a0d0e21e
LW
1397 double modf _((double,double*));
1398 double sin _((double));
1399 double cos _((double));
1400 double atan2 _((double,double));
1401 double pow _((double,double));
32f822de 1402END_EXTERN_C
79072805
LW
1403#endif
1404
a0d0e21e 1405#ifndef __cplusplus
26618a56 1406# ifdef __NeXT__ /* or whatever catches all NeXTs */
3fc1aec6 1407char *crypt (); /* Maybe more hosts will need the unprototyped version */
26618a56
GS
1408# else
1409# if !defined(WIN32) || !defined(HAVE_DES_FCRYPT)
a0d0e21e 1410char *crypt _((const char*, const char*));
26618a56
GS
1411# endif /* !WIN32 && !HAVE_CRYPT_SOURCE */
1412# endif /* !__NeXT__ */
1413# ifndef DONT_DECLARE_STD
1414# ifndef getenv
a0d0e21e 1415char *getenv _((const char*));
26618a56 1416# endif /* !getenv */
a0d0e21e 1417Off_t lseek _((int,Off_t,int));
26618a56 1418# endif /* !DONT_DECLARE_STD */
a0d0e21e 1419char *getlogin _((void));
26618a56 1420#endif /* !__cplusplus */
79072805 1421
16d20bd9 1422#ifdef UNLINK_ALL_VERSIONS /* Currently only makes sense for VMS */
378cc40b 1423#define UNLINK unlnk
a0d0e21e 1424I32 unlnk _((char*));
8d063cd8
LW
1425#else
1426#define UNLINK unlink
1427#endif
a687059c 1428
fe14fcc3 1429#ifndef HAS_SETREUID
85e6fe83
LW
1430# ifdef HAS_SETRESUID
1431# define setreuid(r,e) setresuid(r,e,(Uid_t)-1)
1432# define HAS_SETREUID
1433# endif
a687059c 1434#endif
fe14fcc3 1435#ifndef HAS_SETREGID
85e6fe83
LW
1436# ifdef HAS_SETRESGID
1437# define setregid(r,e) setresgid(r,e,(Gid_t)-1)
1438# define HAS_SETREGID
1439# endif
a687059c 1440#endif
ee0007ab 1441
ff68c719
PP
1442typedef Signal_t (*Sighandler_t) _((int));
1443
1444#ifdef HAS_SIGACTION
1445typedef struct sigaction Sigsave_t;
1446#else
1447typedef Sighandler_t Sigsave_t;
1448#endif
1449
ee0007ab
LW
1450#define SCAN_DEF 0
1451#define SCAN_TR 1
1452#define SCAN_REPL 2
79072805
LW
1453
1454#ifdef DEBUGGING
4633a7c4 1455# ifndef register
a0d0e21e
LW
1456# define register
1457# endif
1458# define PAD_SV(po) pad_sv(po)
2ddcc7aa 1459# define RUNOPS_DEFAULT runops_debug
79072805 1460#else
a0d0e21e 1461# define PAD_SV(po) curpad[po]
2ddcc7aa 1462# define RUNOPS_DEFAULT runops_standard
79072805
LW
1463#endif
1464
18f739ee
IZ
1465#ifdef MYMALLOC
1466# define MALLOC_INIT MUTEX_INIT(&malloc_mutex)
1467# define MALLOC_TERM MUTEX_DESTROY(&malloc_mutex)
1468#else
1469# define MALLOC_INIT
1470# define MALLOC_TERM
1471#endif
1472
b6d9d515 1473
44a0ac01
MB
1474/*
1475 * These need prototyping here because <proto.h> isn't
1476 * included until after runops is initialised.
1477 */
1478
76e3520e 1479#ifndef PERL_OBJECT
49f531da 1480typedef int runops_proc_t _((void));
44a0ac01
MB
1481int runops_standard _((void));
1482#ifdef DEBUGGING
1483int runops_debug _((void));
1484#endif
76e3520e 1485#endif /* PERL_OBJECT */
44a0ac01 1486
940cb80d 1487/* _ (for $_) must be first in the following list (DEFSV requires it) */
54b9620d 1488#define THREADSV_NAMES "_123456789&`'+/.,\\\";^-%=|~:\001\005!@"
a863c7d1 1489
0c30d9ec
PP
1490/* VMS doesn't use environ array and NeXT has problems with crt0.o globals */
1491#if !defined(VMS) && !(defined(NeXT) && defined(__DYNAMIC__))
16de4a3e
RS
1492#if !defined(DONT_DECLARE_STD) \
1493 || (defined(__svr4__) && defined(__GNUC__) && defined(sun)) \
1494 || defined(__sgi) || defined(__DGUX)
79072805 1495extern char ** environ; /* environment variables supplied via exec */
a0d0e21e 1496#endif
0c30d9ec
PP
1497#else
1498# if defined(NeXT) && defined(__DYNAMIC__)
1499
1500# include <mach-o/dyld.h>
1501EXT char *** environ_pointer;
1502# define environ (*environ_pointer)
1503# endif
1504#endif /* environ processing */
1505
79072805
LW
1506
1507/* for tmp use in stupid debuggers */
1508EXT int * di;
1509EXT short * ds;
1510EXT char * dc;
1511
1512/* handy constants */
3e3baf6d 1513EXTCONST char warn_uninit[]
a0d0e21e 1514 INIT("Use of uninitialized value");
3e3baf6d 1515EXTCONST char warn_nosemi[]
463ee0b2 1516 INIT("Semicolon seems to be missing");
3e3baf6d 1517EXTCONST char warn_reserved[]
463ee0b2 1518 INIT("Unquoted string \"%s\" may clash with future reserved word");
3e3baf6d 1519EXTCONST char warn_nl[]
93a17b20 1520 INIT("Unsuccessful %s on filename containing newline");
3e3baf6d 1521EXTCONST char no_wrongref[]
a0d0e21e 1522 INIT("Can't use %s ref as %s ref");
3e3baf6d 1523EXTCONST char no_symref[]
748a9306 1524 INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
3e3baf6d 1525EXTCONST char no_usym[]
8990e307 1526 INIT("Can't use an undefined value as %s reference");
3e3baf6d 1527EXTCONST char no_aelem[]
93a17b20 1528 INIT("Modification of non-creatable array value attempted, subscript %d");
3e3baf6d 1529EXTCONST char no_helem[]
93a17b20 1530 INIT("Modification of non-creatable hash value attempted, subscript \"%s\"");
3e3baf6d 1531EXTCONST char no_modify[]
93a17b20 1532 INIT("Modification of a read-only value attempted");
3e3baf6d 1533EXTCONST char no_mem[]
93a17b20 1534 INIT("Out of memory!\n");
3e3baf6d 1535EXTCONST char no_security[]
463ee0b2 1536 INIT("Insecure dependency in %s%s");
3e3baf6d 1537EXTCONST char no_sock_func[]
93a17b20 1538 INIT("Unsupported socket function \"%s\" called");
3e3baf6d 1539EXTCONST char no_dir_func[]
93a17b20 1540 INIT("Unsupported directory function \"%s\" called");
3e3baf6d 1541EXTCONST char no_func[]
93a17b20 1542 INIT("The %s function is unimplemented");
3e3baf6d 1543EXTCONST char no_myglob[]
748a9306 1544 INIT("\"my\" variable %s can't be in a package");
93a17b20 1545
79072805 1546#ifdef DOINIT
8e07c86e
AD
1547EXT char *sig_name[] = { SIG_NAME };
1548EXT int sig_num[] = { SIG_NUM };
0c30d9ec
PP
1549EXT SV * psig_ptr[sizeof(sig_num)/sizeof(*sig_num)];
1550EXT SV * psig_name[sizeof(sig_num)/sizeof(*sig_num)];
79072805
LW
1551#else
1552EXT char *sig_name[];
8e07c86e 1553EXT int sig_num[];
0c30d9ec
PP
1554EXT SV * psig_ptr[];
1555EXT SV * psig_name[];
79072805
LW
1556#endif
1557
bbce6d69
PP
1558/* fast case folding tables */
1559
79072805 1560#ifdef DOINIT
36477c24 1561EXTCONST unsigned char fold[] = {
79072805
LW
1562 0, 1, 2, 3, 4, 5, 6, 7,
1563 8, 9, 10, 11, 12, 13, 14, 15,
1564 16, 17, 18, 19, 20, 21, 22, 23,
1565 24, 25, 26, 27, 28, 29, 30, 31,
1566 32, 33, 34, 35, 36, 37, 38, 39,
1567 40, 41, 42, 43, 44, 45, 46, 47,
1568 48, 49, 50, 51, 52, 53, 54, 55,
1569 56, 57, 58, 59, 60, 61, 62, 63,
1570 64, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
1571 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
1572 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
1573 'x', 'y', 'z', 91, 92, 93, 94, 95,
1574 96, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
1575 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
1576 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
1577 'X', 'Y', 'Z', 123, 124, 125, 126, 127,
1578 128, 129, 130, 131, 132, 133, 134, 135,
1579 136, 137, 138, 139, 140, 141, 142, 143,
1580 144, 145, 146, 147, 148, 149, 150, 151,
1581 152, 153, 154, 155, 156, 157, 158, 159,
1582 160, 161, 162, 163, 164, 165, 166, 167,
1583 168, 169, 170, 171, 172, 173, 174, 175,
1584 176, 177, 178, 179, 180, 181, 182, 183,
1585 184, 185, 186, 187, 188, 189, 190, 191,
1586 192, 193, 194, 195, 196, 197, 198, 199,
1587 200, 201, 202, 203, 204, 205, 206, 207,
1588 208, 209, 210, 211, 212, 213, 214, 215,
1589 216, 217, 218, 219, 220, 221, 222, 223,
1590 224, 225, 226, 227, 228, 229, 230, 231,
1591 232, 233, 234, 235, 236, 237, 238, 239,
1592 240, 241, 242, 243, 244, 245, 246, 247,
1593 248, 249, 250, 251, 252, 253, 254, 255
1594};
1595#else
71be2cbc 1596EXTCONST unsigned char fold[];
79072805
LW
1597#endif
1598
1599#ifdef DOINIT
bbce6d69 1600EXT unsigned char fold_locale[] = {
79072805
LW
1601 0, 1, 2, 3, 4, 5, 6, 7,
1602 8, 9, 10, 11, 12, 13, 14, 15,
1603 16, 17, 18, 19, 20, 21, 22, 23,
1604 24, 25, 26, 27, 28, 29, 30, 31,
1605 32, 33, 34, 35, 36, 37, 38, 39,
1606 40, 41, 42, 43, 44, 45, 46, 47,
1607 48, 49, 50, 51, 52, 53, 54, 55,
1608 56, 57, 58, 59, 60, 61, 62, 63,
1609 64, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
1610 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
1611 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
1612 'x', 'y', 'z', 91, 92, 93, 94, 95,
1613 96, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
1614 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
1615 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
1616 'X', 'Y', 'Z', 123, 124, 125, 126, 127,
1617 128, 129, 130, 131, 132, 133, 134, 135,
1618 136, 137, 138, 139, 140, 141, 142, 143,
1619 144, 145, 146, 147, 148, 149, 150, 151,
1620 152, 153, 154, 155, 156, 157, 158, 159,
1621 160, 161, 162, 163, 164, 165, 166, 167,
1622 168, 169, 170, 171, 172, 173, 174, 175,
1623 176, 177, 178, 179, 180, 181, 182, 183,
1624 184, 185, 186, 187, 188, 189, 190, 191,
1625 192, 193, 194, 195, 196, 197, 198, 199,
1626 200, 201, 202, 203, 204, 205, 206, 207,
1627 208, 209, 210, 211, 212, 213, 214, 215,
1628 216, 217, 218, 219, 220, 221, 222, 223,
1629 224, 225, 226, 227, 228, 229, 230, 231,
1630 232, 233, 234, 235, 236, 237, 238, 239,
1631 240, 241, 242, 243, 244, 245, 246, 247,
1632 248, 249, 250, 251, 252, 253, 254, 255
1633};
1634#else
bbce6d69 1635EXT unsigned char fold_locale[];
79072805
LW
1636#endif
1637
1638#ifdef DOINIT
71be2cbc 1639EXTCONST unsigned char freq[] = { /* letter frequencies for mixed English/C */
79072805
LW
1640 1, 2, 84, 151, 154, 155, 156, 157,
1641 165, 246, 250, 3, 158, 7, 18, 29,
1642 40, 51, 62, 73, 85, 96, 107, 118,
1643 129, 140, 147, 148, 149, 150, 152, 153,
1644 255, 182, 224, 205, 174, 176, 180, 217,
1645 233, 232, 236, 187, 235, 228, 234, 226,
1646 222, 219, 211, 195, 188, 193, 185, 184,
1647 191, 183, 201, 229, 181, 220, 194, 162,
1648 163, 208, 186, 202, 200, 218, 198, 179,
1649 178, 214, 166, 170, 207, 199, 209, 206,
1650 204, 160, 212, 216, 215, 192, 175, 173,
1651 243, 172, 161, 190, 203, 189, 164, 230,
1652 167, 248, 227, 244, 242, 255, 241, 231,
1653 240, 253, 169, 210, 245, 237, 249, 247,
1654 239, 168, 252, 251, 254, 238, 223, 221,
1655 213, 225, 177, 197, 171, 196, 159, 4,
1656 5, 6, 8, 9, 10, 11, 12, 13,
1657 14, 15, 16, 17, 19, 20, 21, 22,
1658 23, 24, 25, 26, 27, 28, 30, 31,
1659 32, 33, 34, 35, 36, 37, 38, 39,
1660 41, 42, 43, 44, 45, 46, 47, 48,
1661 49, 50, 52, 53, 54, 55, 56, 57,
1662 58, 59, 60, 61, 63, 64, 65, 66,
1663 67, 68, 69, 70, 71, 72, 74, 75,
1664 76, 77, 78, 79, 80, 81, 82, 83,
1665 86, 87, 88, 89, 90, 91, 92, 93,
1666 94, 95, 97, 98, 99, 100, 101, 102,
1667 103, 104, 105, 106, 108, 109, 110, 111,
1668 112, 113, 114, 115, 116, 117, 119, 120,
1669 121, 122, 123, 124, 125, 126, 127, 128,
1670 130, 131, 132, 133, 134, 135, 136, 137,
1671 138, 139, 141, 142, 143, 144, 145, 146
1672};
1673#else
71be2cbc 1674EXTCONST unsigned char freq[];
79072805
LW
1675#endif
1676
8990e307
LW
1677#ifdef DEBUGGING
1678#ifdef DOINIT
71be2cbc 1679EXTCONST char* block_type[] = {
8990e307
LW
1680 "NULL",
1681 "SUB",
1682 "EVAL",
1683 "LOOP",
1684 "SUBST",
1685 "BLOCK",
1686};
1687#else
71be2cbc 1688EXTCONST char* block_type[];
8990e307
LW
1689#endif
1690#endif
1691
79072805
LW
1692/*****************************************************************************/
1693/* This lexer/parser stuff is currently global since yacc is hard to reenter */
1694/*****************************************************************************/
8990e307 1695/* XXX This needs to be revisited, since BEGIN makes yacc re-enter... */
79072805 1696
a0d0e21e
LW
1697#include "perly.h"
1698
fb73857a
PP
1699#define LEX_NOTPARSING 11 /* borrowed from toke.c */
1700
79072805
LW
1701typedef enum {
1702 XOPERATOR,
1703 XTERM,
79072805 1704 XREF,
8990e307 1705 XSTATE,
a0d0e21e
LW
1706 XBLOCK,
1707 XTERMBLOCK
79072805
LW
1708} expectation;
1709
85e6fe83
LW
1710
1711 /* Note: the lowest 8 bits are reserved for
1712 stuffing into op->op_private */
1713#define HINT_INTEGER 0x00000001
1714#define HINT_STRICT_REFS 0x00000002
1715
1716#define HINT_BLOCK_SCOPE 0x00000100
1717#define HINT_STRICT_SUBS 0x00000200
1718#define HINT_STRICT_VARS 0x00000400
bbce6d69 1719#define HINT_LOCALE 0x00000800
85e6fe83 1720
d4cce5f1
NIS
1721/* Various states of an input record separator SV (rs, nrs) */
1722#define RsSNARF(sv) (! SvOK(sv))
1723#define RsSIMPLE(sv) (SvOK(sv) && SvCUR(sv))
1724#define RsPARA(sv) (SvOK(sv) && ! SvCUR(sv))
79072805 1725
22239a37
NIS
1726/* Set up PERLVAR macros for populating structs */
1727#define PERLVAR(var,type) type var;
1728#define PERLVARI(var,type,init) type var;
3fe35a81 1729#define PERLVARIC(var,type,init) type var;
22239a37 1730
76e3520e
GS
1731#ifdef PERL_OBJECT
1732extern "C" CPerlObj* perl_alloc _((IPerlMem*, IPerlEnv*, IPerlStdIO*, IPerlLIO*, IPerlDir*, IPerlSock*, IPerlProc*));
1733
1734typedef int (CPerlObj::*runops_proc_t) _((void));
1735#undef EXT
1736#define EXT
1737#undef EXTCONST
1738#define EXTCONST
1739#undef INIT
1740#define INIT(x)
1741
1742class CPerlObj {
1743public:
1744 CPerlObj(IPerlMem*, IPerlEnv*, IPerlStdIO*, IPerlLIO*, IPerlDir*, IPerlSock*, IPerlProc*);
1745 void Init(void);
1746 void* operator new(size_t nSize, IPerlMem *pvtbl);
1747#endif /* PERL_OBJECT */
1748
22239a37
NIS
1749#ifdef PERL_GLOBAL_STRUCT
1750struct perl_vars {
1751#include "perlvars.h"
1752};
1753
1754#ifdef PERL_CORE
1755EXT struct perl_vars Perl_Vars;
1756EXT struct perl_vars *Perl_VarsPtr INIT(&Perl_Vars);
1757#else
1758#if !defined(__GNUC__) || !defined(WIN32)
1759EXT
1760#endif
1761struct perl_vars *Perl_VarsPtr;
1762#define Perl_Vars (*((Perl_VarsPtr) ? Perl_VarsPtr : (Perl_VarsPtr = Perl_GetVars())))
1763#endif
1764#endif /* PERL_GLOBAL_STRUCT */
1765
8990e307 1766#ifdef MULTIPLICITY
d4cce5f1
NIS
1767/* If we have multiple interpreters define a struct
1768 holding variables which must be per-interpreter
1769 If we don't have threads anything that would have
1770 be per-thread is per-interpreter.
1771*/
1772
79072805 1773struct interpreter {
d4cce5f1
NIS
1774#ifndef USE_THREADS
1775#include "thrdvar.h"
1776#endif
1777#include "intrpvar.h"
49f531da 1778};
d4cce5f1 1779
79072805 1780#else
49f531da
NIS
1781struct interpreter {
1782 char broiled;
1783};
79072805
LW
1784#endif
1785
d4cce5f1
NIS
1786#ifdef USE_THREADS
1787/* If we have threads define a struct with all the variables
1788 * that have to be per-thread
49f531da 1789 */
8023c3ce 1790
79072805 1791
49f531da 1792struct perl_thread {
49f531da 1793#include "thrdvar.h"
79072805 1794};
d4cce5f1 1795
22fae026
TM
1796typedef struct perl_thread *Thread;
1797
1798#else
1799typedef void *Thread;
22239a37
NIS
1800#endif
1801
1802/* Done with PERLVAR macros for now ... */
d4cce5f1
NIS
1803#undef PERLVAR
1804#undef PERLVARI
3fe35a81 1805#undef PERLVARIC
79072805 1806
22239a37 1807#include "thread.h"
79072805 1808#include "pp.h"
79072805
LW
1809#include "proto.h"
1810
a0d0e21e
LW
1811#ifdef EMBED
1812#define Perl_sv_setptrobj(rv,ptr,name) Perl_sv_setref_iv(rv,name,(IV)ptr)
1813#define Perl_sv_setptrref(rv,ptr) Perl_sv_setref_iv(rv,Nullch,(IV)ptr)
1814#else
1815#define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,(IV)ptr)
1816#define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,(IV)ptr)
1817#endif
1818
d4cce5f1
NIS
1819/* The following must follow proto.h as #defines mess up syntax */
1820
1821#include "embedvar.h"
1822
1823/* Now include all the 'global' variables
1824 * If we don't have threads or multiple interpreters
1825 * these include variables that would have been their struct-s
1826 */
1827
1828#define PERLVAR(var,type) EXT type var;
1829#define PERLVARI(var,type,init) EXT type var INIT(init);
3fe35a81 1830#define PERLVARIC(var,type,init) EXTCONST type var INIT(init);
d4cce5f1 1831
22239a37 1832#ifndef PERL_GLOBAL_STRUCT
d4cce5f1 1833#include "perlvars.h"
22239a37 1834#endif
d4cce5f1
NIS
1835
1836#ifndef MULTIPLICITY
d4cce5f1
NIS
1837
1838#ifndef USE_THREADS
1839#include "thrdvar.h"
1840#endif
1841
22239a37
NIS
1842#include "intrpvar.h"
1843#endif
1844
76e3520e 1845#ifdef PERL_OBJECT
76e3520e
GS
1846};
1847
1848#include "objpp.h"
1849#ifdef DOINIT
1850#include "INTERN.h"
1851#else
1852#include "EXTERN.h"
1853#endif
1854#endif /* PERL_OBJECT */
1855
22239a37 1856
d4cce5f1
NIS
1857#undef PERLVAR
1858#undef PERLVARI
0f3f18a6 1859#undef PERLVARIC
79072805 1860
a835ef8a
NIS
1861#if defined(HASATTRIBUTE) && defined(WIN32)
1862/*
1863 * This provides a layer of functions and macros to ensure extensions will
1864 * get to use the same RTL functions as the core.
1865 * It has to go here or #define of printf messes up __attribute__
1866 * stuff in proto.h
1867 */
76e3520e 1868#ifndef PERL_OBJECT
a835ef8a 1869# include <win32iop.h>
76e3520e 1870#endif /* PERL_OBJECT */
a835ef8a
NIS
1871#endif /* WIN32 */
1872
79072805 1873#ifdef DOINIT
bbce6d69 1874
4633a7c4 1875EXT MGVTBL vtbl_sv = {magic_get,
463ee0b2
LW
1876 magic_set,
1877 magic_len,
1878 0, 0};
fb73857a
PP
1879EXT MGVTBL vtbl_env = {0, magic_set_all_env,
1880 0, magic_clear_all_env,
66b1d557 1881 0};
4633a7c4 1882EXT MGVTBL vtbl_envelem = {0, magic_setenv,
85e6fe83
LW
1883 0, magic_clearenv,
1884 0};
4633a7c4 1885EXT MGVTBL vtbl_sig = {0, 0, 0, 0, 0};
0c30d9ec
PP
1886EXT MGVTBL vtbl_sigelem = {magic_getsig,
1887 magic_setsig,
1888 0, magic_clearsig,
1889 0};
93965878 1890EXT MGVTBL vtbl_pack = {0, 0, magic_sizepack, magic_wipepack,
a0d0e21e 1891 0};
4633a7c4 1892EXT MGVTBL vtbl_packelem = {magic_getpack,
463ee0b2
LW
1893 magic_setpack,
1894 0, magic_clearpack,
1895 0};
4633a7c4 1896EXT MGVTBL vtbl_dbline = {0, magic_setdbline,
463ee0b2 1897 0, 0, 0};
4633a7c4 1898EXT MGVTBL vtbl_isa = {0, magic_setisa,
fb73857a
PP
1899 0, magic_setisa,
1900 0};
4633a7c4 1901EXT MGVTBL vtbl_isaelem = {0, magic_setisa,
463ee0b2 1902 0, 0, 0};
4633a7c4 1903EXT MGVTBL vtbl_arylen = {magic_getarylen,
463ee0b2
LW
1904 magic_setarylen,
1905 0, 0, 0};
4633a7c4 1906EXT MGVTBL vtbl_glob = {magic_getglob,
463ee0b2
LW
1907 magic_setglob,
1908 0, 0, 0};
4633a7c4 1909EXT MGVTBL vtbl_mglob = {0, magic_setmglob,
463ee0b2 1910 0, 0, 0};
99abf803
PP
1911EXT MGVTBL vtbl_nkeys = {0, magic_setnkeys,
1912 0, 0, 0};
4633a7c4 1913EXT MGVTBL vtbl_taint = {magic_gettaint,magic_settaint,
463ee0b2 1914 0, 0, 0};
4633a7c4 1915EXT MGVTBL vtbl_substr = {0, magic_setsubstr,
463ee0b2 1916 0, 0, 0};
4633a7c4 1917EXT MGVTBL vtbl_vec = {0, magic_setvec,
463ee0b2 1918 0, 0, 0};
4633a7c4 1919EXT MGVTBL vtbl_pos = {magic_getpos,
a0d0e21e
LW
1920 magic_setpos,
1921 0, 0, 0};
4633a7c4 1922EXT MGVTBL vtbl_bm = {0, magic_setbm,
463ee0b2 1923 0, 0, 0};
55497cff
PP
1924EXT MGVTBL vtbl_fm = {0, magic_setfm,
1925 0, 0, 0};
4633a7c4 1926EXT MGVTBL vtbl_uvar = {magic_getuvar,
463ee0b2
LW
1927 magic_setuvar,
1928 0, 0, 0};
f93b4edd
MB
1929#ifdef USE_THREADS
1930EXT MGVTBL vtbl_mutex = {0, 0, 0, 0, magic_mutexfree};
1931#endif /* USE_THREADS */
68dc0745
PP
1932EXT MGVTBL vtbl_defelem = {magic_getdefelem,magic_setdefelem,
1933 0, 0, magic_freedefelem};
a0d0e21e 1934
c277df42
IZ
1935EXT MGVTBL vtbl_regexp = {0,0,0,0, magic_freeregexp};
1936
36477c24 1937#ifdef USE_LOCALE_COLLATE
bbce6d69
PP
1938EXT MGVTBL vtbl_collxfrm = {0,
1939 magic_setcollxfrm,
1940 0, 0, 0};
1941#endif
a0d0e21e
LW
1942
1943#ifdef OVERLOAD
4633a7c4 1944EXT MGVTBL vtbl_amagic = {0, magic_setamagic,
748a9306 1945 0, 0, magic_setamagic};
4633a7c4 1946EXT MGVTBL vtbl_amagicelem = {0, magic_setamagic,
748a9306 1947 0, 0, magic_setamagic};
a0d0e21e
LW
1948#endif /* OVERLOAD */
1949
bbce6d69
PP
1950#else /* !DOINIT */
1951
79072805
LW
1952EXT MGVTBL vtbl_sv;
1953EXT MGVTBL vtbl_env;
1954EXT MGVTBL vtbl_envelem;
1955EXT MGVTBL vtbl_sig;
1956EXT MGVTBL vtbl_sigelem;
463ee0b2
LW
1957EXT MGVTBL vtbl_pack;
1958EXT MGVTBL vtbl_packelem;
79072805 1959EXT MGVTBL vtbl_dbline;
463ee0b2
LW
1960EXT MGVTBL vtbl_isa;
1961EXT MGVTBL vtbl_isaelem;
79072805
LW
1962EXT MGVTBL vtbl_arylen;
1963EXT MGVTBL vtbl_glob;
93a17b20 1964EXT MGVTBL vtbl_mglob;
99abf803 1965EXT MGVTBL vtbl_nkeys;
463ee0b2 1966EXT MGVTBL vtbl_taint;
79072805
LW
1967EXT MGVTBL vtbl_substr;
1968EXT MGVTBL vtbl_vec;
a0d0e21e 1969EXT MGVTBL vtbl_pos;
79072805 1970EXT MGVTBL vtbl_bm;
55497cff 1971EXT MGVTBL vtbl_fm;
79072805 1972EXT MGVTBL vtbl_uvar;
a0d0e21e 1973
f93b4edd
MB
1974#ifdef USE_THREADS
1975EXT MGVTBL vtbl_mutex;
1976#endif /* USE_THREADS */
1977
68dc0745 1978EXT MGVTBL vtbl_defelem;
c277df42 1979EXT MGVTBL vtbl_regexp;
a0d0e21e 1980
36477c24 1981#ifdef USE_LOCALE_COLLATE
bbce6d69
PP
1982EXT MGVTBL vtbl_collxfrm;
1983#endif
a0d0e21e
LW
1984
1985#ifdef OVERLOAD
1986EXT MGVTBL vtbl_amagic;
1987EXT MGVTBL vtbl_amagicelem;
1988#endif /* OVERLOAD */
1989
bbce6d69 1990#endif /* !DOINIT */
85e6fe83 1991
a0d0e21e 1992#ifdef OVERLOAD
c0315cdf 1993
a6006777 1994#define NofAMmeth 58
a0d0e21e 1995#ifdef DOINIT
a6006777
PP
1996EXTCONST char * AMG_names[NofAMmeth] = {
1997 "fallback", "abs", /* "fallback" should be the first. */
1998 "bool", "nomethod",
1999 "\"\"", "0+",
2000 "+", "+=",
2001 "-", "-=",
2002 "*", "*=",
2003 "/", "/=",
2004 "%", "%=",
2005 "**", "**=",
2006 "<<", "<<=",
2007 ">>", ">>=",
2008 "&", "&=",
2009 "|", "|=",
2010 "^", "^=",
2011 "<", "<=",
2012 ">", ">=",
2013 "==", "!=",
2014 "<=>", "cmp",
2015 "lt", "le",
2016 "gt", "ge",
2017 "eq", "ne",
2018 "!", "~",
2019 "++", "--",
2020 "atan2", "cos",
2021 "sin", "exp",
2022 "log", "sqrt",
2023 "x", "x=",
2024 ".", ".=",
2025 "=", "neg"
a0d0e21e
LW
2026};
2027#else
a6006777 2028EXTCONST char * AMG_names[NofAMmeth];
a0d0e21e
LW
2029#endif /* def INITAMAGIC */
2030
a6006777 2031struct am_table {
a0d0e21e
LW
2032 long was_ok_sub;
2033 long was_ok_am;
a6006777
PP
2034 U32 flags;
2035 CV* table[NofAMmeth];
a0d0e21e
LW
2036 long fallback;
2037};
a6006777
PP
2038struct am_table_short {
2039 long was_ok_sub;
2040 long was_ok_am;
2041 U32 flags;
2042};
a0d0e21e 2043typedef struct am_table AMT;
a6006777 2044typedef struct am_table_short AMTS;
a0d0e21e
LW
2045
2046#define AMGfallNEVER 1
2047#define AMGfallNO 2
2048#define AMGfallYES 3
2049
a6006777
PP
2050#define AMTf_AMAGIC 1
2051#define AMT_AMAGIC(amt) ((amt)->flags & AMTf_AMAGIC)
2052#define AMT_AMAGIC_on(amt) ((amt)->flags |= AMTf_AMAGIC)
2053#define AMT_AMAGIC_off(amt) ((amt)->flags &= ~AMTf_AMAGIC)
2054
a0d0e21e
LW
2055enum {
2056 fallback_amg, abs_amg,
2057 bool__amg, nomethod_amg,
2058 string_amg, numer_amg,
2059 add_amg, add_ass_amg,
2060 subtr_amg, subtr_ass_amg,
2061 mult_amg, mult_ass_amg,
2062 div_amg, div_ass_amg,
76e3520e 2063 modulo_amg, modulo_ass_amg,
a0d0e21e
LW
2064 pow_amg, pow_ass_amg,
2065 lshift_amg, lshift_ass_amg,
2066 rshift_amg, rshift_ass_amg,
748a9306
LW
2067 band_amg, band_ass_amg,
2068 bor_amg, bor_ass_amg,
2069 bxor_amg, bxor_ass_amg,
a0d0e21e
LW
2070 lt_amg, le_amg,
2071 gt_amg, ge_amg,
2072 eq_amg, ne_amg,
2073 ncmp_amg, scmp_amg,
2074 slt_amg, sle_amg,
2075 sgt_amg, sge_amg,
2076 seq_amg, sne_amg,
a0d0e21e
LW
2077 not_amg, compl_amg,
2078 inc_amg, dec_amg,
2079 atan2_amg, cos_amg,
2080 sin_amg, exp_amg,
2081 log_amg, sqrt_amg,
2082 repeat_amg, repeat_ass_amg,
748a9306
LW
2083 concat_amg, concat_ass_amg,
2084 copy_amg, neg_amg
a0d0e21e 2085};
c0315cdf
JH
2086
2087/*
2088 * some compilers like to redefine cos et alia as faster
2089 * (and less accurate?) versions called F_cos et cetera (Quidquid
2090 * latine dictum sit, altum viditur.) This trick collides with
2091 * the Perl overloading (amg). The following #defines fool both.
2092 */
2093
2094#ifdef _FASTMATH
2095# ifdef atan2
2096# define F_atan2_amg atan2_amg
2097# endif
2098# ifdef cos
2099# define F_cos_amg cos_amg
2100# endif
2101# ifdef exp
2102# define F_exp_amg exp_amg
2103# endif
2104# ifdef log
2105# define F_log_amg log_amg
2106# endif
2107# ifdef pow
2108# define F_pow_amg pow_amg
2109# endif
2110# ifdef sin
2111# define F_sin_amg sin_amg
2112# endif
2113# ifdef sqrt
2114# define F_sqrt_amg sqrt_amg
2115# endif
2116#endif /* _FASTMATH */
2117
a0d0e21e
LW
2118#endif /* OVERLOAD */
2119
84902520
TB
2120#define PERLDB_ALL 0xff
2121#define PERLDBf_SUB 0x01 /* Debug sub enter/exit. */
2122#define PERLDBf_LINE 0x02 /* Keep line #. */
2123#define PERLDBf_NOOPT 0x04 /* Switch off optimizations. */
2124#define PERLDBf_INTER 0x08 /* Preserve more data for
2125 later inspections. */
2126#define PERLDBf_SUBLINE 0x10 /* Keep subr source lines. */
2127#define PERLDBf_SINGLE 0x20 /* Start with single-step on. */
2128
2129#define PERLDB_SUB (perldb && (perldb & PERLDBf_SUB))
2130#define PERLDB_LINE (perldb && (perldb & PERLDBf_LINE))
2131#define PERLDB_NOOPT (perldb && (perldb & PERLDBf_NOOPT))
2132#define PERLDB_INTER (perldb && (perldb & PERLDBf_INTER))
2133#define PERLDB_SUBLINE (perldb && (perldb & PERLDBf_SUBLINE))
2134#define PERLDB_SINGLE (perldb && (perldb & PERLDBf_SINGLE))
2135
bbce6d69 2136
36477c24 2137#ifdef USE_LOCALE_NUMERIC
bbce6d69 2138
36477c24
PP
2139#define SET_NUMERIC_STANDARD() \
2140 STMT_START { \
2141 if (! numeric_standard) \
2142 perl_set_numeric_standard(); \
2143 } STMT_END
2144
2145#define SET_NUMERIC_LOCAL() \
2146 STMT_START { \
2147 if (! numeric_local) \
2148 perl_set_numeric_local(); \
2149 } STMT_END
bbce6d69 2150
36477c24 2151#else /* !USE_LOCALE_NUMERIC */
bbce6d69 2152
36477c24
PP
2153#define SET_NUMERIC_STANDARD() /**/
2154#define SET_NUMERIC_LOCAL() /**/
bbce6d69 2155
36477c24 2156#endif /* !USE_LOCALE_NUMERIC */
a0d0e21e 2157
e5c9fcd0 2158#if !defined(PERLIO_IS_STDIO) && defined(HASATTRIBUTE)
760ac839
LW
2159/*
2160 * Now we have __attribute__ out of the way
2161 * Remap printf
2162 */
2163#define printf PerlIO_stdoutf
2164#endif
2165
a868473f
NIS
2166#ifndef PERL_SCRIPT_MODE
2167#define PERL_SCRIPT_MODE "r"
2168#endif
2169
fba3b22e
MB
2170/*
2171 * nice_chunk and nice_chunk size need to be set
2172 * and queried under the protection of sv_mutex
2173 */
2174#define offer_nice_chunk(chunk, chunk_size) do { \
940cb80d 2175 LOCK_SV_MUTEX; \
fba3b22e
MB
2176 if (!nice_chunk) { \
2177 nice_chunk = (char*)(chunk); \
2178 nice_chunk_size = (chunk_size); \
2179 } \
fc80cf79
GS
2180 else { \
2181 Safefree(chunk); \
2182 } \
940cb80d 2183 UNLOCK_SV_MUTEX; \
fba3b22e
MB
2184 } while (0)
2185
49f531da 2186
85e6fe83 2187#endif /* Include guard */
a6e633de 2188