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