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