This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Okay, here's your official unofficial closure leak patch
[perl5.git] / perl.h
CommitLineData
a0d0e21e 1/* perl.h
a687059c 2 *
a0d0e21e 3 * Copyright (c) 1987-1994, 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
79072805
LW
13#include "embed.h"
14
85e6fe83 15#define VOIDUSED 1
ac58e20f 16#include "config.h"
79072805
LW
17
18#ifndef BYTEORDER
19# define BYTEORDER 0x1234
20#endif
21
22/* Overall memory policy? */
23#ifndef CONSERVATIVE
24# define LIBERAL 1
25#endif
26
27/*
28 * The following contortions are brought to you on behalf of all the
29 * standards, semi-standards, de facto standards, not-so-de-facto standards
30 * of the world, as well as all the other botches anyone ever thought of.
31 * The basic theory is that if we work hard enough here, the rest of the
32 * code can be a lot prettier. Well, so much for theory. Sorry, Henry...
33 */
ac58e20f 34
45d8adaa
LW
35#ifdef MYMALLOC
36# ifdef HIDEMYMALLOC
37# define malloc Mymalloc
38# define realloc Myremalloc
39# define free Myfree
40# endif
41# define safemalloc malloc
42# define saferealloc realloc
43# define safefree free
44#endif
45
46/* work around some libPW problems */
45d8adaa 47#ifdef DOINIT
a0d0e21e 48EXT char Error[1];
45d8adaa
LW
49#endif
50
ee0007ab
LW
51/* define this once if either system, instead of cluttering up the src */
52#if defined(MSDOS) || defined(atarist)
53#define DOSISH 1
54#endif
55
a0d0e21e 56#if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus)
352d5a3a
LW
57# define STANDARD_C 1
58#endif
59
60#if defined(HASVOLATILE) || defined(STANDARD_C)
79072805
LW
61# ifdef __cplusplus
62# define VOL // to temporarily suppress warnings
63# else
64# define VOL volatile
65# endif
663a0e37 66#else
79072805 67# define VOL
663a0e37
LW
68#endif
69
463ee0b2
LW
70#define TAINT_IF(c) (tainted |= (c))
71#define TAINT_NOT (tainted = 0)
72#define TAINT_PROPER(s) if (tainting) taint_proper(no_security, s)
73#define TAINT_ENV() if (tainting) taint_env()
a687059c 74
fe14fcc3
LW
75#ifdef HAS_GETPGRP2
76# ifndef HAS_GETPGRP
77# define HAS_GETPGRP
663a0e37 78# endif
663a0e37
LW
79#endif
80
fe14fcc3
LW
81#ifdef HAS_SETPGRP2
82# ifndef HAS_SETPGRP
83# define HAS_SETPGRP
663a0e37 84# endif
663a0e37
LW
85#endif
86
fe14fcc3 87#include <stdio.h>
a0d0e21e
LW
88#ifdef USE_NEXT_CTYPE
89#include <appkit/NXCType.h>
90#else
fe14fcc3 91#include <ctype.h>
a0d0e21e
LW
92#endif
93
94#ifdef METHOD /* Defined by OSF/1 v3.0 by ctype.h */
95#undef METHOD
96#endif
97
fe14fcc3 98#include <setjmp.h>
79072805 99
a0d0e21e 100#ifdef I_SYS_PARAM
79072805
LW
101# ifdef PARAM_NEEDS_TYPES
102# include <sys/types.h>
103# endif
104# include <sys/param.h>
352d5a3a 105#endif
79072805
LW
106
107
108/* Use all the "standard" definitions? */
a0d0e21e 109#if defined(STANDARD_C) && defined(I_STDLIB)
79072805 110# include <stdlib.h>
352d5a3a 111#endif /* STANDARD_C */
03a14243 112
a0d0e21e
LW
113#define MEM_SIZE Size_t
114
115#if defined(I_STRING) || defined(__cplusplus)
116# include <string.h>
117#else
118# include <strings.h>
119#endif
120
121#if !defined(HAS_STRCHR) && defined(HAS_INDEX) && !defined(strchr)
122#define strchr index
123#define strrchr rindex
124#endif
125
126#if defined(mips) && defined(ultrix) && !defined(__STDC__)
79072805 127# undef HAS_MEMCMP
663a0e37 128#endif
fe14fcc3
LW
129
130#ifdef HAS_MEMCPY
85e6fe83 131# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
fe14fcc3 132# ifndef memcpy
a0d0e21e 133 extern char * memcpy _((char*, char*, int));
ee0007ab
LW
134# endif
135# endif
136#else
137# ifndef memcpy
138# ifdef HAS_BCOPY
139# define memcpy(d,s,l) bcopy(s,d,l)
140# else
141# define memcpy(d,s,l) my_bcopy(s,d,l)
142# endif
143# endif
144#endif /* HAS_MEMCPY */
fe14fcc3 145
ee0007ab 146#ifdef HAS_MEMSET
85e6fe83 147# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
ee0007ab 148# ifndef memset
a0d0e21e 149 extern char *memset _((char*, int, int));
ee0007ab
LW
150# endif
151# endif
152# define memzero(d,l) memset(d,0,l)
153#else
154# ifndef memzero
155# ifdef HAS_BZERO
156# define memzero(d,l) bzero(d,l)
157# else
158# define memzero(d,l) my_bzero(d,l)
159# endif
352d5a3a 160# endif
ee0007ab
LW
161#endif /* HAS_MEMSET */
162
163#ifdef HAS_MEMCMP
85e6fe83 164# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
ee0007ab 165# ifndef memcmp
a0d0e21e 166 extern int memcmp _((char*, char*, int));
ee0007ab
LW
167# endif
168# endif
169#else
170# ifndef memcmp
ecfc5424 171# define memcmp my_memcmp
352d5a3a 172# endif
ee0007ab 173#endif /* HAS_MEMCMP */
8d063cd8 174
ee0007ab
LW
175/* we prefer bcmp slightly for comparisons that don't care about ordering */
176#ifndef HAS_BCMP
352d5a3a
LW
177# ifndef bcmp
178# define bcmp(s1,s2,l) memcmp(s1,s2,l)
179# endif
ee0007ab
LW
180#endif /* HAS_BCMP */
181
85e6fe83 182#if !defined(HAS_MEMMOVE) && !defined(memmove)
2304df62 183# if defined(HAS_BCOPY) && defined(HAS_SAFE_BCOPY)
79072805
LW
184# define memmove(d,s,l) bcopy(s,d,l)
185# else
2304df62 186# if defined(HAS_MEMCPY) && defined(HAS_SAFE_MEMCPY)
79072805
LW
187# define memmove(d,s,l) memcpy(d,s,l)
188# else
189# define memmove(d,s,l) my_bcopy(s,d,l)
190# endif
191# endif
d9d8d8de 192#endif
378cc40b
LW
193
194#ifndef _TYPES_ /* If types.h defines this it's easy. */
79072805
LW
195# ifndef major /* Does everyone's types.h define this? */
196# include <sys/types.h>
197# endif
378cc40b
LW
198#endif
199
ae986130 200#ifdef I_NETINET_IN
79072805 201# include <netinet/in.h>
ae986130
LW
202#endif
203
1aef975c 204#ifdef I_SYS_STAT
8d063cd8 205#include <sys/stat.h>
1aef975c 206#endif
79072805 207
a0d0e21e
LW
208/* The stat macros for Amdahl UTS, Unisoft System V/88 (and derivatives
209 like UTekV) are broken, sometimes giving false positives. Undefine
210 them here and let the code below set them to proper values.
211
212 The ghs macro stands for GreenHills Software C-1.8.5 which
213 is the C compiler for sysV88 and the various derivatives.
214 This header file bug is corrected in gcc-2.5.8 and later versions.
215 --Kaveh Ghazi (ghazi@noc.rutgers.edu) 10/3/94. */
216
217#if defined(uts) || (defined(m88k) && defined(ghs))
79072805
LW
218# undef S_ISDIR
219# undef S_ISCHR
220# undef S_ISBLK
221# undef S_ISREG
222# undef S_ISFIFO
223# undef S_ISLNK
ee0007ab 224#endif
135863df 225
663a0e37
LW
226#ifdef I_TIME
227# include <time.h>
ffed7fef 228#endif
663a0e37 229
fe14fcc3 230#ifdef I_SYS_TIME
85e6fe83 231# ifdef I_SYS_TIME_KERNEL
663a0e37
LW
232# define KERNEL
233# endif
234# include <sys/time.h>
85e6fe83 235# ifdef I_SYS_TIME_KERNEL
663a0e37
LW
236# undef KERNEL
237# endif
a687059c 238#endif
135863df 239
d9d8d8de 240#ifndef MSDOS
a0d0e21e 241# if defined(HAS_TIMES) && defined(I_SYS_TIMES)
85e6fe83
LW
242# include <sys/times.h>
243# endif
d9d8d8de 244#endif
8d063cd8 245
fe14fcc3 246#if defined(HAS_STRERROR) && (!defined(HAS_MKDIR) || !defined(HAS_RMDIR))
79072805 247# undef HAS_STRERROR
663a0e37
LW
248#endif
249
a0d0e21e
LW
250#ifndef HAS_MKFIFO
251# ifndef mkfifo
252# define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
253# endif
254#endif /* !HAS_MKFIFO */
255
663a0e37 256#include <errno.h>
ed6116ce 257#ifdef HAS_SOCKET
85e6fe83 258# ifdef I_NET_ERRNO
ed6116ce
LW
259# include <net/errno.h>
260# endif
261#endif
748a9306
LW
262#ifndef VMS
263# define FIXSTATUS(sts) (U_L((sts) & 0xffff))
264# define SHIFTSTATUS(sts) ((sts) >> 8)
265# define SETERRNO(errcode,vmserrcode) errno = (errcode)
266#else
267# define FIXSTATUS(sts) (U_L(sts))
268# define SHIFTSTATUS(sts) (sts)
269# define SETERRNO(errcode,vmserrcode) {set_errno(errcode); set_vaxc_errno(vmserrcode);}
270#endif
ed6116ce 271
d9d8d8de 272#ifndef MSDOS
79072805
LW
273# ifndef errno
274 extern int errno; /* ANSI allows errno to be an lvalue expr */
275# endif
d9d8d8de 276#endif
663a0e37 277
2304df62 278#ifdef HAS_STRERROR
a0d0e21e
LW
279# ifdef VMS
280 char *strerror _((int,...));
281# else
282 char *strerror _((int));
283# endif
2304df62
AD
284# ifndef Strerror
285# define Strerror strerror
286# endif
287#else
288# ifdef HAS_SYS_ERRLIST
79072805
LW
289 extern int sys_nerr;
290 extern char *sys_errlist[];
2304df62
AD
291# ifndef Strerror
292# define Strerror(e) \
79072805 293 ((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e])
2304df62 294# endif
79072805 295# endif
35c8bce7 296#endif
663a0e37 297
2304df62 298#ifdef I_SYS_IOCTL
79072805
LW
299# ifndef _IOCTL_
300# include <sys/ioctl.h>
301# endif
a687059c
LW
302#endif
303
ee0007ab 304#if defined(mc300) || defined(mc500) || defined(mc700) || defined(mc6000)
79072805
LW
305# ifdef HAS_SOCKETPAIR
306# undef HAS_SOCKETPAIR
307# endif
2304df62
AD
308# ifdef I_NDBM
309# undef I_NDBM
79072805 310# endif
a687059c
LW
311#endif
312
a687059c 313#if INTSIZE == 2
79072805
LW
314# define htoni htons
315# define ntohi ntohs
a687059c 316#else
79072805
LW
317# define htoni htonl
318# define ntohi ntohl
a687059c
LW
319#endif
320
a0d0e21e 321/* Configure already sets Direntry_t */
35c8bce7 322#if defined(I_DIRENT)
663a0e37 323# include <dirent.h>
a0d0e21e
LW
324# if defined(NeXT) && defined(I_SYS_DIR) /* NeXT needs dirent + sys/dir.h */
325# include <sys/dir.h>
326# endif
ae986130 327#else
fe14fcc3 328# ifdef I_SYS_NDIR
79a0689e 329# include <sys/ndir.h>
663a0e37 330# else
fe14fcc3 331# ifdef I_SYS_DIR
79a0689e
LW
332# ifdef hp9000s500
333# include <ndir.h> /* may be wrong in the future */
334# else
335# include <sys/dir.h>
336# endif
663a0e37
LW
337# endif
338# endif
a0d0e21e 339#endif
a687059c 340
352d5a3a
LW
341#ifdef FPUTS_BOTCH
342/* work around botch in SunOS 4.0.1 and 4.0.2 */
343# ifndef fputs
79072805 344# define fputs(sv,fp) fprintf(fp,"%s",sv)
352d5a3a
LW
345# endif
346#endif
347
c623bd54
LW
348/*
349 * The following gobbledygook brought to you on behalf of __STDC__.
350 * (I could just use #ifndef __STDC__, but this is more bulletproof
351 * in the face of half-implementations.)
352 */
353
354#ifndef S_IFMT
355# ifdef _S_IFMT
356# define S_IFMT _S_IFMT
357# else
358# define S_IFMT 0170000
359# endif
360#endif
361
362#ifndef S_ISDIR
363# define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR)
364#endif
365
366#ifndef S_ISCHR
367# define S_ISCHR(m) ((m & S_IFMT) == S_IFCHR)
368#endif
369
370#ifndef S_ISBLK
fe14fcc3
LW
371# ifdef S_IFBLK
372# define S_ISBLK(m) ((m & S_IFMT) == S_IFBLK)
373# else
374# define S_ISBLK(m) (0)
375# endif
c623bd54
LW
376#endif
377
378#ifndef S_ISREG
379# define S_ISREG(m) ((m & S_IFMT) == S_IFREG)
380#endif
381
382#ifndef S_ISFIFO
fe14fcc3
LW
383# ifdef S_IFIFO
384# define S_ISFIFO(m) ((m & S_IFMT) == S_IFIFO)
385# else
386# define S_ISFIFO(m) (0)
387# endif
c623bd54
LW
388#endif
389
390#ifndef S_ISLNK
391# ifdef _S_ISLNK
392# define S_ISLNK(m) _S_ISLNK(m)
393# else
394# ifdef _S_IFLNK
395# define S_ISLNK(m) ((m & S_IFMT) == _S_IFLNK)
396# else
397# ifdef S_IFLNK
398# define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK)
399# else
400# define S_ISLNK(m) (0)
401# endif
402# endif
403# endif
404#endif
405
406#ifndef S_ISSOCK
407# ifdef _S_ISSOCK
408# define S_ISSOCK(m) _S_ISSOCK(m)
409# else
410# ifdef _S_IFSOCK
411# define S_ISSOCK(m) ((m & S_IFMT) == _S_IFSOCK)
412# else
413# ifdef S_IFSOCK
414# define S_ISSOCK(m) ((m & S_IFMT) == S_IFSOCK)
415# else
416# define S_ISSOCK(m) (0)
417# endif
418# endif
419# endif
420#endif
421
422#ifndef S_IRUSR
423# ifdef S_IREAD
424# define S_IRUSR S_IREAD
425# define S_IWUSR S_IWRITE
426# define S_IXUSR S_IEXEC
427# else
428# define S_IRUSR 0400
429# define S_IWUSR 0200
430# define S_IXUSR 0100
431# endif
432# define S_IRGRP (S_IRUSR>>3)
433# define S_IWGRP (S_IWUSR>>3)
434# define S_IXGRP (S_IXUSR>>3)
435# define S_IROTH (S_IRUSR>>6)
436# define S_IWOTH (S_IWUSR>>6)
437# define S_IXOTH (S_IXUSR>>6)
438#endif
439
440#ifndef S_ISUID
441# define S_ISUID 04000
442#endif
443
444#ifndef S_ISGID
445# define S_ISGID 02000
446#endif
447
79072805
LW
448#ifdef ff_next
449# undef ff_next
352d5a3a
LW
450#endif
451
a0d0e21e 452#if defined(cray) || defined(gould) || defined(i860) || defined(pyr)
45d8adaa
LW
453# define SLOPPYDIVIDE
454#endif
455
988174c1 456#if defined(cray) || defined(convex) || defined (uts) || BYTEORDER > 0xffff
ecfc5424 457# define HAS_QUAD
45d8adaa
LW
458#endif
459
748a9306
LW
460#ifdef UV
461#undef UV
462#endif
463
ecfc5424 464#ifdef HAS_QUAD
45d8adaa 465# ifdef cray
ecfc5424 466# define Quad_t int
45d8adaa 467# else
988174c1 468# if defined(convex) || defined (uts)
ecfc5424 469# define Quad_t long long
45d8adaa 470# else
ecfc5424 471# define Quad_t long
45d8adaa
LW
472# endif
473# endif
748a9306
LW
474 typedef Quad_t IV;
475 typedef unsigned Quad_t UV;
79072805 476#else
748a9306
LW
477 typedef long IV;
478 typedef unsigned long UV;
79072805
LW
479#endif
480
ee0007ab 481typedef MEM_SIZE STRLEN;
450a55e4 482
79072805
LW
483typedef struct op OP;
484typedef struct cop COP;
485typedef struct unop UNOP;
486typedef struct binop BINOP;
487typedef struct listop LISTOP;
488typedef struct logop LOGOP;
489typedef struct condop CONDOP;
490typedef struct pmop PMOP;
491typedef struct svop SVOP;
492typedef struct gvop GVOP;
493typedef struct pvop PVOP;
494typedef struct cvop CVOP;
495typedef struct loop LOOP;
496
497typedef struct Outrec Outrec;
93a17b20 498typedef struct interpreter PerlInterpreter;
79072805 499typedef struct ff FF;
79072805
LW
500typedef struct sv SV;
501typedef struct av AV;
502typedef struct hv HV;
503typedef struct cv CV;
378cc40b 504typedef struct regexp REGEXP;
79072805
LW
505typedef struct gp GP;
506typedef struct sv GV;
8990e307 507typedef struct io IO;
79072805
LW
508typedef struct context CONTEXT;
509typedef struct block BLOCK;
510
511typedef struct magic MAGIC;
ed6116ce 512typedef struct xrv XRV;
79072805
LW
513typedef struct xpv XPV;
514typedef struct xpviv XPVIV;
515typedef struct xpvnv XPVNV;
516typedef struct xpvmg XPVMG;
517typedef struct xpvlv XPVLV;
518typedef struct xpvav XPVAV;
519typedef struct xpvhv XPVHV;
520typedef struct xpvgv XPVGV;
521typedef struct xpvcv XPVCV;
522typedef struct xpvbm XPVBM;
523typedef struct xpvfm XPVFM;
8990e307 524typedef struct xpvio XPVIO;
79072805
LW
525typedef struct mgvtbl MGVTBL;
526typedef union any ANY;
8d063cd8 527
748a9306 528typedef int (*cryptswitch_t) _((void));
a0d0e21e 529
378cc40b 530#include "handy.h"
a0d0e21e 531
748a9306
LW
532#ifdef DOSISH
533# include "dosish.h"
a0d0e21e 534#else
748a9306
LW
535# if defined(VMS)
536# include "vmsish.h"
537# else
538# include "unixish.h"
539# endif
540#endif
541
542#ifndef HAS_PAUSE
543#define pause() sleep((32767<<16)+32767)
544#endif
545
546#ifndef IOCPARM_LEN
547# ifdef IOCPARM_MASK
548 /* on BSDish systes we're safe */
549# define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK)
550# else
551 /* otherwise guess at what's safe */
552# define IOCPARM_LEN(x) 256
553# endif
a0d0e21e
LW
554#endif
555
79072805
LW
556union any {
557 void* any_ptr;
558 I32 any_i32;
a0d0e21e 559 IV any_iv;
85e6fe83 560 long any_long;
a0d0e21e 561 void (*any_dptr) _((void*));
79072805
LW
562};
563
378cc40b 564#include "regexp.h"
79072805 565#include "sv.h"
378cc40b 566#include "util.h"
8d063cd8 567#include "form.h"
79072805
LW
568#include "gv.h"
569#include "cv.h"
570#include "opcode.h"
571#include "op.h"
572#include "cop.h"
573#include "av.h"
574#include "hv.h"
575#include "mg.h"
576#include "scope.h"
8d063cd8 577
450a55e4 578#if defined(iAPX286) || defined(M_I286) || defined(I80286)
a687059c
LW
579# define I286
580#endif
581
fe14fcc3
LW
582#if defined(htonl) && !defined(HAS_HTONL)
583#define HAS_HTONL
ae986130 584#endif
fe14fcc3
LW
585#if defined(htons) && !defined(HAS_HTONS)
586#define HAS_HTONS
ae986130 587#endif
fe14fcc3
LW
588#if defined(ntohl) && !defined(HAS_NTOHL)
589#define HAS_NTOHL
ae986130 590#endif
fe14fcc3
LW
591#if defined(ntohs) && !defined(HAS_NTOHS)
592#define HAS_NTOHS
ae986130 593#endif
fe14fcc3 594#ifndef HAS_HTONL
d9d8d8de 595#if (BYTEORDER & 0xffff) != 0x4321
fe14fcc3
LW
596#define HAS_HTONS
597#define HAS_HTONL
598#define HAS_NTOHS
599#define HAS_NTOHL
a687059c
LW
600#define MYSWAP
601#define htons my_swap
602#define htonl my_htonl
603#define ntohs my_swap
604#define ntohl my_ntohl
605#endif
606#else
d9d8d8de 607#if (BYTEORDER & 0xffff) == 0x4321
fe14fcc3
LW
608#undef HAS_HTONS
609#undef HAS_HTONL
610#undef HAS_NTOHS
611#undef HAS_NTOHL
a687059c
LW
612#endif
613#endif
614
988174c1
LW
615/*
616 * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
617 * -DWS
618 */
619#if BYTEORDER != 0x1234
620# define HAS_VTOHL
621# define HAS_VTOHS
622# define HAS_HTOVL
623# define HAS_HTOVS
624# if BYTEORDER == 0x4321
625# define vtohl(x) ((((x)&0xFF)<<24) \
626 +(((x)>>24)&0xFF) \
627 +(((x)&0x0000FF00)<<8) \
628 +(((x)&0x00FF0000)>>8) )
629# define vtohs(x) ((((x)&0xFF)<<8) + (((x)>>8)&0xFF))
630# define htovl(x) vtohl(x)
631# define htovs(x) vtohs(x)
632# endif
633 /* otherwise default to functions in util.c */
634#endif
635
0f85fab0 636#ifdef CASTNEGFLOAT
79072805 637#define U_S(what) ((U16)(what))
0f85fab0 638#define U_I(what) ((unsigned int)(what))
79072805 639#define U_L(what) ((U32)(what))
0f85fab0 640#else
a0d0e21e 641U32 cast_ulong _((double));
79072805
LW
642#define U_S(what) ((U16)cast_ulong(what))
643#define U_I(what) ((unsigned int)cast_ulong(what))
644#define U_L(what) (cast_ulong(what))
ee0007ab
LW
645#endif
646
ed6116ce
LW
647#ifdef CASTI32
648#define I_32(what) ((I32)(what))
a0d0e21e 649#define I_V(what) ((IV)(what))
ed6116ce 650#else
a0d0e21e 651I32 cast_i32 _((double));
ed6116ce 652#define I_32(what) (cast_i32(what))
a0d0e21e
LW
653IV cast_iv _((double));
654#define I_V(what) (cast_iv(what))
ed6116ce
LW
655#endif
656
79072805
LW
657struct Outrec {
658 I32 o_lines;
d9d8d8de 659 char *o_str;
79072805 660 U32 o_len;
8d063cd8
LW
661};
662
352d5a3a
LW
663#ifndef MAXSYSFD
664# define MAXSYSFD 2
665#endif
ee0007ab 666
a0d0e21e 667#ifdef DOSISH
57ebbfd0 668#define TMPPATH "plXXXXXX"
a0d0e21e
LW
669#else
670#ifdef VMS
748a9306 671#define TMPPATH "sys$scratch:perl-eXXXXXX"
a0d0e21e
LW
672#else
673#define TMPPATH "/tmp/perl-eXXXXXX"
674#endif
675#endif
79072805
LW
676
677#ifndef __cplusplus
a0d0e21e
LW
678Uid_t getuid _((void));
679Uid_t geteuid _((void));
680Gid_t getgid _((void));
681Gid_t getegid _((void));
79072805 682#endif
8d063cd8
LW
683
684#ifdef DEBUGGING
d96024cf 685#define YYDEBUG 1
79072805
LW
686#define DEB(a) a
687#define DEBUG(a) if (debug) a
688#define DEBUG_p(a) if (debug & 1) a
689#define DEBUG_s(a) if (debug & 2) a
690#define DEBUG_l(a) if (debug & 4) a
691#define DEBUG_t(a) if (debug & 8) a
692#define DEBUG_o(a) if (debug & 16) a
693#define DEBUG_c(a) if (debug & 32) a
694#define DEBUG_P(a) if (debug & 64) a
695#define DEBUG_m(a) if (debug & 128) a
696#define DEBUG_f(a) if (debug & 256) a
697#define DEBUG_r(a) if (debug & 512) a
698#define DEBUG_x(a) if (debug & 1024) a
699#define DEBUG_u(a) if (debug & 2048) a
700#define DEBUG_L(a) if (debug & 4096) a
701#define DEBUG_H(a) if (debug & 8192) a
702#define DEBUG_X(a) if (debug & 16384) a
8990e307 703#define DEBUG_D(a) if (debug & 32768) a
79072805
LW
704#else
705#define DEB(a)
706#define DEBUG(a)
707#define DEBUG_p(a)
708#define DEBUG_s(a)
709#define DEBUG_l(a)
710#define DEBUG_t(a)
711#define DEBUG_o(a)
712#define DEBUG_c(a)
713#define DEBUG_P(a)
714#define DEBUG_m(a)
715#define DEBUG_f(a)
716#define DEBUG_r(a)
717#define DEBUG_x(a)
718#define DEBUG_u(a)
719#define DEBUG_L(a)
720#define DEBUG_H(a)
721#define DEBUG_X(a)
8990e307 722#define DEBUG_D(a)
8d063cd8 723#endif
fe14fcc3 724#define YYMAXDEPTH 300
8d063cd8 725
79072805
LW
726#define assert(what) DEB( { \
727 if (!(what)) { \
463ee0b2 728 croak("Assertion failed: file \"%s\", line %d", \
79072805
LW
729 __FILE__, __LINE__); \
730 exit(1); \
731 }})
8d063cd8 732
450a55e4 733struct ufuncs {
a0d0e21e
LW
734 I32 (*uf_val)_((IV, SV*));
735 I32 (*uf_set)_((IV, SV*));
736 IV uf_index;
450a55e4
LW
737};
738
fe14fcc3 739/* Fix these up for __STDC__ */
a0d0e21e
LW
740#ifndef __cplusplus
741char *mktemp _((char*));
742double atof _((const char*));
743#endif
79072805 744
352d5a3a 745#ifndef STANDARD_C
fe14fcc3 746/* All of these are in stdlib.h or time.h for ANSI C */
85e6fe83 747Time_t time();
8d063cd8 748struct tm *gmtime(), *localtime();
93a17b20 749char *strchr(), *strrchr();
378cc40b 750char *strcpy(), *strcat();
352d5a3a 751#endif /* ! STANDARD_C */
8d063cd8 752
79072805
LW
753
754#ifdef I_MATH
755# include <math.h>
756#else
757# ifdef __cplusplus
758 extern "C" {
759# endif
a0d0e21e
LW
760 double exp _((double));
761 double fmod _((double,double));
762 double log _((double));
763 double sqrt _((double));
764 double modf _((double,double*));
765 double sin _((double));
766 double cos _((double));
767 double atan2 _((double,double));
768 double pow _((double,double));
79072805
LW
769# ifdef __cplusplus
770 };
771# endif
772#endif
773
75f92628
AD
774#ifndef HAS_FMOD
775# ifdef HAS_DREM
776# define fmod(x,y) drem((x),(y))
777# else
778# define USE_MY_FMOD
779# define fmod(x,y) my_fmod(x,y)
780# endif
a0d0e21e 781#endif
79072805 782
a0d0e21e
LW
783#ifndef __cplusplus
784char *crypt _((const char*, const char*));
785char *getenv _((const char*));
786Off_t lseek _((int,Off_t,int));
787char *getlogin _((void));
788#endif
79072805 789
8d063cd8 790#ifdef EUNICE
378cc40b 791#define UNLINK unlnk
a0d0e21e 792I32 unlnk _((char*));
8d063cd8
LW
793#else
794#define UNLINK unlink
795#endif
a687059c 796
fe14fcc3 797#ifndef HAS_SETREUID
85e6fe83
LW
798# ifdef HAS_SETRESUID
799# define setreuid(r,e) setresuid(r,e,(Uid_t)-1)
800# define HAS_SETREUID
801# endif
a687059c 802#endif
fe14fcc3 803#ifndef HAS_SETREGID
85e6fe83
LW
804# ifdef HAS_SETRESGID
805# define setregid(r,e) setresgid(r,e,(Gid_t)-1)
806# define HAS_SETREGID
807# endif
a687059c 808#endif
ee0007ab
LW
809
810#define SCAN_DEF 0
811#define SCAN_TR 1
812#define SCAN_REPL 2
79072805
LW
813
814#ifdef DEBUGGING
a0d0e21e
LW
815# ifndef register
816# define register
817# endif
818# define PAD_SV(po) pad_sv(po)
79072805 819#else
a0d0e21e 820# define PAD_SV(po) curpad[po]
79072805
LW
821#endif
822
823/****************/
824/* Truly global */
825/****************/
826
827/* global state */
a0d0e21e
LW
828EXT PerlInterpreter * curinterp; /* currently running interpreter */
829#ifndef VMS /* VMS doesn't use environ array */
79072805 830extern char ** environ; /* environment variables supplied via exec */
a0d0e21e 831#endif
79072805
LW
832EXT int uid; /* current real user id */
833EXT int euid; /* current effective user id */
834EXT int gid; /* current real group id */
835EXT int egid; /* current effective group id */
836EXT bool nomemok; /* let malloc context handle nomem */
837EXT U32 an; /* malloc sequence number */
463ee0b2
LW
838EXT U32 cop_seqmax; /* statement sequence number */
839EXT U32 op_seqmax; /* op sequence number */
8990e307 840EXT U32 evalseq; /* eval sequence number */
463ee0b2 841EXT U32 sub_generation; /* inc to force methods to be looked up again */
79072805
LW
842EXT char ** origenviron;
843EXT U32 origalen;
a0d0e21e 844EXT U32 * profiledata;
79072805 845
a0d0e21e
LW
846EXT XPV* xiv_arenaroot; /* list of allocated xiv areas */
847EXT IV ** xiv_root; /* free xiv list--shared by interpreters */
8990e307
LW
848EXT double * xnv_root; /* free xnv list--shared by interpreters */
849EXT XRV * xrv_root; /* free xrv list--shared by interpreters */
850EXT XPV * xpv_root; /* free xpv list--shared by interpreters */
851
79072805
LW
852/* Stack for currently executing thread--context switch must handle this. */
853EXT SV ** stack_base; /* stack->array_ary */
854EXT SV ** stack_sp; /* stack pointer now */
855EXT SV ** stack_max; /* stack->array_ary + stack->array_max */
856
857/* likewise for these */
858
859EXT OP * op; /* current op--oughta be in a global register */
860
861EXT I32 * scopestack; /* blocks we've entered */
862EXT I32 scopestack_ix;
863EXT I32 scopestack_max;
864
865EXT ANY* savestack; /* to save non-local values on */
866EXT I32 savestack_ix;
867EXT I32 savestack_max;
868
869EXT OP ** retstack; /* returns we've pushed */
870EXT I32 retstack_ix;
871EXT I32 retstack_max;
872
873EXT I32 * markstack; /* stackmarks we're remembering */
874EXT I32 * markstack_ptr; /* stackmarks we're remembering */
875EXT I32 * markstack_max; /* stackmarks we're remembering */
876
877EXT SV ** curpad;
878
879/* temp space */
880EXT SV * Sv;
881EXT XPV * Xpv;
882EXT char buf[1024];
883EXT char tokenbuf[256];
884EXT struct stat statbuf;
ecfc5424 885#ifdef HAS_TIMES
79072805
LW
886EXT struct tms timesbuf;
887#endif
463ee0b2 888EXT STRLEN na; /* for use in SvPV when length is Not Applicable */
79072805
LW
889
890/* for tmp use in stupid debuggers */
891EXT int * di;
892EXT short * ds;
893EXT char * dc;
894
895/* handy constants */
896EXT char * Yes INIT("1");
897EXT char * No INIT("");
898EXT char * hexdigit INIT("0123456789abcdef0123456789ABCDEFx");
79072805
LW
899EXT char * patleave INIT("\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}");
900EXT char * vert INIT("|");
901
8990e307 902EXT char warn_uninit[]
a0d0e21e 903 INIT("Use of uninitialized value");
463ee0b2
LW
904EXT char warn_nosemi[]
905 INIT("Semicolon seems to be missing");
906EXT char warn_reserved[]
907 INIT("Unquoted string \"%s\" may clash with future reserved word");
908EXT char warn_nl[]
93a17b20 909 INIT("Unsuccessful %s on filename containing newline");
a0d0e21e
LW
910EXT char no_wrongref[]
911 INIT("Can't use %s ref as %s ref");
912EXT char no_symref[]
748a9306 913 INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
93a17b20 914EXT char no_usym[]
8990e307 915 INIT("Can't use an undefined value as %s reference");
93a17b20
LW
916EXT char no_aelem[]
917 INIT("Modification of non-creatable array value attempted, subscript %d");
918EXT char no_helem[]
919 INIT("Modification of non-creatable hash value attempted, subscript \"%s\"");
920EXT char no_modify[]
921 INIT("Modification of a read-only value attempted");
922EXT char no_mem[]
923 INIT("Out of memory!\n");
924EXT char no_security[]
463ee0b2 925 INIT("Insecure dependency in %s%s");
93a17b20
LW
926EXT char no_sock_func[]
927 INIT("Unsupported socket function \"%s\" called");
928EXT char no_dir_func[]
929 INIT("Unsupported directory function \"%s\" called");
930EXT char no_func[]
931 INIT("The %s function is unimplemented");
748a9306
LW
932EXT char no_myglob[]
933 INIT("\"my\" variable %s can't be in a package");
93a17b20 934
79072805
LW
935EXT SV sv_undef;
936EXT SV sv_no;
937EXT SV sv_yes;
938#ifdef CSH
939 EXT char * cshname INIT(CSH);
940 EXT I32 cshlen;
941#endif
942
943#ifdef DOINIT
944EXT char *sig_name[] = {
945 SIG_NAME,0
946};
947#else
948EXT char *sig_name[];
949#endif
950
951#ifdef DOINIT
79072805
LW
952EXT unsigned char fold[] = { /* fast case folding table */
953 0, 1, 2, 3, 4, 5, 6, 7,
954 8, 9, 10, 11, 12, 13, 14, 15,
955 16, 17, 18, 19, 20, 21, 22, 23,
956 24, 25, 26, 27, 28, 29, 30, 31,
957 32, 33, 34, 35, 36, 37, 38, 39,
958 40, 41, 42, 43, 44, 45, 46, 47,
959 48, 49, 50, 51, 52, 53, 54, 55,
960 56, 57, 58, 59, 60, 61, 62, 63,
961 64, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
962 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
963 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
964 'x', 'y', 'z', 91, 92, 93, 94, 95,
965 96, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
966 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
967 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
968 'X', 'Y', 'Z', 123, 124, 125, 126, 127,
969 128, 129, 130, 131, 132, 133, 134, 135,
970 136, 137, 138, 139, 140, 141, 142, 143,
971 144, 145, 146, 147, 148, 149, 150, 151,
972 152, 153, 154, 155, 156, 157, 158, 159,
973 160, 161, 162, 163, 164, 165, 166, 167,
974 168, 169, 170, 171, 172, 173, 174, 175,
975 176, 177, 178, 179, 180, 181, 182, 183,
976 184, 185, 186, 187, 188, 189, 190, 191,
977 192, 193, 194, 195, 196, 197, 198, 199,
978 200, 201, 202, 203, 204, 205, 206, 207,
979 208, 209, 210, 211, 212, 213, 214, 215,
980 216, 217, 218, 219, 220, 221, 222, 223,
981 224, 225, 226, 227, 228, 229, 230, 231,
982 232, 233, 234, 235, 236, 237, 238, 239,
983 240, 241, 242, 243, 244, 245, 246, 247,
984 248, 249, 250, 251, 252, 253, 254, 255
985};
986#else
987EXT unsigned char fold[];
988#endif
989
990#ifdef DOINIT
991EXT unsigned char freq[] = { /* letter frequencies for mixed English/C */
992 1, 2, 84, 151, 154, 155, 156, 157,
993 165, 246, 250, 3, 158, 7, 18, 29,
994 40, 51, 62, 73, 85, 96, 107, 118,
995 129, 140, 147, 148, 149, 150, 152, 153,
996 255, 182, 224, 205, 174, 176, 180, 217,
997 233, 232, 236, 187, 235, 228, 234, 226,
998 222, 219, 211, 195, 188, 193, 185, 184,
999 191, 183, 201, 229, 181, 220, 194, 162,
1000 163, 208, 186, 202, 200, 218, 198, 179,
1001 178, 214, 166, 170, 207, 199, 209, 206,
1002 204, 160, 212, 216, 215, 192, 175, 173,
1003 243, 172, 161, 190, 203, 189, 164, 230,
1004 167, 248, 227, 244, 242, 255, 241, 231,
1005 240, 253, 169, 210, 245, 237, 249, 247,
1006 239, 168, 252, 251, 254, 238, 223, 221,
1007 213, 225, 177, 197, 171, 196, 159, 4,
1008 5, 6, 8, 9, 10, 11, 12, 13,
1009 14, 15, 16, 17, 19, 20, 21, 22,
1010 23, 24, 25, 26, 27, 28, 30, 31,
1011 32, 33, 34, 35, 36, 37, 38, 39,
1012 41, 42, 43, 44, 45, 46, 47, 48,
1013 49, 50, 52, 53, 54, 55, 56, 57,
1014 58, 59, 60, 61, 63, 64, 65, 66,
1015 67, 68, 69, 70, 71, 72, 74, 75,
1016 76, 77, 78, 79, 80, 81, 82, 83,
1017 86, 87, 88, 89, 90, 91, 92, 93,
1018 94, 95, 97, 98, 99, 100, 101, 102,
1019 103, 104, 105, 106, 108, 109, 110, 111,
1020 112, 113, 114, 115, 116, 117, 119, 120,
1021 121, 122, 123, 124, 125, 126, 127, 128,
1022 130, 131, 132, 133, 134, 135, 136, 137,
1023 138, 139, 141, 142, 143, 144, 145, 146
1024};
1025#else
1026EXT unsigned char freq[];
1027#endif
1028
8990e307
LW
1029#ifdef DEBUGGING
1030#ifdef DOINIT
1031EXT char* block_type[] = {
1032 "NULL",
1033 "SUB",
1034 "EVAL",
1035 "LOOP",
1036 "SUBST",
1037 "BLOCK",
1038};
1039#else
1040EXT char* block_type[];
1041#endif
1042#endif
1043
79072805
LW
1044/*****************************************************************************/
1045/* This lexer/parser stuff is currently global since yacc is hard to reenter */
1046/*****************************************************************************/
8990e307 1047/* XXX This needs to be revisited, since BEGIN makes yacc re-enter... */
79072805 1048
a0d0e21e
LW
1049#include "perly.h"
1050
79072805
LW
1051typedef enum {
1052 XOPERATOR,
1053 XTERM,
79072805 1054 XREF,
8990e307 1055 XSTATE,
a0d0e21e
LW
1056 XBLOCK,
1057 XTERMBLOCK
79072805
LW
1058} expectation;
1059
a0d0e21e
LW
1060EXT U32 lex_state; /* next token is determined */
1061EXT U32 lex_defer; /* state after determined token */
1062EXT expectation lex_expect; /* expect after determined token */
1063EXT I32 lex_brackets; /* bracket count */
1064EXT I32 lex_formbrack; /* bracket count at outer format level */
1065EXT I32 lex_fakebrack; /* outer bracket is mere delimiter */
1066EXT I32 lex_casemods; /* casemod count */
1067EXT I32 lex_dojoin; /* doing an array interpolation */
1068EXT I32 lex_starts; /* how many interps done on level */
1069EXT SV * lex_stuff; /* runtime pattern from m// or s/// */
1070EXT SV * lex_repl; /* runtime replacement from s/// */
1071EXT OP * lex_op; /* extra info to pass back on op */
1072EXT OP * lex_inpat; /* in pattern $) and $| are special */
1073EXT I32 lex_inwhat; /* what kind of quoting are we in */
1074EXT char * lex_brackstack; /* what kind of brackets to pop */
1075EXT char * lex_casestack; /* what kind of case mods in effect */
1076
1077/* What we know when we're in LEX_KNOWNEXT state. */
1078EXT YYSTYPE nextval[5]; /* value of next token, if any */
1079EXT I32 nexttype[5]; /* type of next token */
1080EXT I32 nexttoke;
1081
79072805
LW
1082EXT FILE * VOL rsfp INIT(Nullfp);
1083EXT SV * linestr;
1084EXT char * bufptr;
1085EXT char * oldbufptr;
1086EXT char * oldoldbufptr;
1087EXT char * bufend;
8990e307 1088EXT expectation expect INIT(XSTATE); /* how to interpret ambiguous tokens */
a0d0e21e 1089EXT char * autoboot_preamble INIT(Nullch);
748a9306 1090EXT cryptswitch_t cryptswitch_fp;
79072805
LW
1091
1092EXT I32 multi_start; /* 1st line of multi-line string */
1093EXT I32 multi_end; /* last line of multi-line string */
1094EXT I32 multi_open; /* delimiter of said string */
1095EXT I32 multi_close; /* delimiter of said string */
1096
1097EXT GV * scrgv;
1098EXT I32 error_count; /* how many errors so far, max 10 */
1099EXT I32 subline; /* line this subroutine began on */
1100EXT SV * subname; /* name of current subroutine */
1101
748a9306 1102EXT CV * compcv; /* currently compiling subroutine */
93a17b20 1103EXT AV * comppad; /* storage for lexically scoped temporaries */
8990e307
LW
1104EXT AV * comppad_name; /* variable names for "my" variables */
1105EXT I32 comppad_name_fill;/* last "introduced" variable offset */
1106EXT I32 min_intro_pending;/* start of vars to introduce */
1107EXT I32 max_intro_pending;/* end of vars to introduce */
79072805 1108EXT I32 padix; /* max used index in current "register" pad */
a0d0e21e 1109EXT I32 padix_floor; /* how low may inner block reset padix */
748a9306 1110EXT I32 pad_reset_pending; /* reset pad on next attempted alloc */
79072805
LW
1111EXT COP compiling;
1112
79072805
LW
1113EXT I32 thisexpr; /* name id for nothing_in_common() */
1114EXT char * last_uni; /* position of last named-unary operator */
1115EXT char * last_lop; /* position of last list operator */
8990e307 1116EXT OPCODE last_lop_op; /* last list operator */
93a17b20 1117EXT bool in_my; /* we're compiling a "my" declaration */
79072805
LW
1118#ifdef FCRYPT
1119EXT I32 cryptseen; /* has fast crypt() been initialized? */
1120#endif
1121
85e6fe83
LW
1122EXT U32 hints; /* various compilation flags */
1123
1124 /* Note: the lowest 8 bits are reserved for
1125 stuffing into op->op_private */
1126#define HINT_INTEGER 0x00000001
1127#define HINT_STRICT_REFS 0x00000002
1128
1129#define HINT_BLOCK_SCOPE 0x00000100
1130#define HINT_STRICT_SUBS 0x00000200
1131#define HINT_STRICT_VARS 0x00000400
1132
79072805
LW
1133/**************************************************************************/
1134/* This regexp stuff is global since it always happens within 1 expr eval */
1135/**************************************************************************/
1136
1137EXT char * regprecomp; /* uncompiled string. */
1138EXT char * regparse; /* Input-scan pointer. */
1139EXT char * regxend; /* End of input for compile */
1140EXT I32 regnpar; /* () count. */
1141EXT char * regcode; /* Code-emit pointer; &regdummy = don't. */
1142EXT I32 regsize; /* Code size. */
a0d0e21e 1143EXT I32 regnaughty; /* How bad is this pattern? */
79072805
LW
1144EXT I32 regsawback; /* Did we see \1, ...? */
1145
1146EXT char * reginput; /* String-input pointer. */
79072805
LW
1147EXT char * regbol; /* Beginning of input, for ^ check. */
1148EXT char * regeol; /* End of input, for $ check. */
1149EXT char ** regstartp; /* Pointer to startp array. */
1150EXT char ** regendp; /* Ditto for endp. */
a0d0e21e 1151EXT U32 * reglastparen; /* Similarly for lastparen. */
79072805 1152EXT char * regtill; /* How far we are required to go. */
a0d0e21e
LW
1153EXT U16 regflags; /* are we folding, multilining? */
1154EXT char regprev; /* char before regbol, \n if none */
79072805
LW
1155
1156/***********************************************/
1157/* Global only to current interpreter instance */
1158/***********************************************/
1159
8990e307 1160#ifdef MULTIPLICITY
79072805
LW
1161#define IEXT
1162#define IINIT(x)
1163struct interpreter {
1164#else
1165#define IEXT EXT
1166#define IINIT(x) INIT(x)
1167#endif
1168
1169/* pseudo environmental stuff */
1170IEXT int Iorigargc;
1171IEXT char ** Iorigargv;
1172IEXT GV * Ienvgv;
1173IEXT GV * Isiggv;
1174IEXT GV * Iincgv;
1175IEXT char * Iorigfilename;
748a9306
LW
1176IEXT SV * Idiehook;
1177IEXT SV * Iwarnhook;
1178IEXT SV * Iparsehook;
79072805
LW
1179
1180/* switches */
1181IEXT char * Icddir;
1182IEXT bool Iminus_c;
1183IEXT char Ipatchlevel[6];
1184IEXT char * Inrs IINIT("\n");
1185IEXT U32 Inrschar IINIT('\n'); /* final char of rs, or 0777 if none */
1186IEXT I32 Inrslen IINIT(1);
2304df62 1187IEXT char * Isplitstr IINIT(" ");
79072805
LW
1188IEXT bool Ipreprocess;
1189IEXT bool Iminus_n;
1190IEXT bool Iminus_p;
1191IEXT bool Iminus_l;
1192IEXT bool Iminus_a;
2304df62 1193IEXT bool Iminus_F;
79072805
LW
1194IEXT bool Idoswitches;
1195IEXT bool Idowarn;
1196IEXT bool Idoextract;
79072805
LW
1197IEXT bool Isawampersand; /* must save all match strings */
1198IEXT bool Isawstudy; /* do fbm_instr on all strings */
1199IEXT bool Isawi; /* study must assume case insensitive */
1200IEXT bool Isawvec;
1201IEXT bool Iunsafe;
1202IEXT bool Ido_undump; /* -u or dump seen? */
1203IEXT char * Iinplace;
1204IEXT char * Ie_tmpname;
1205IEXT FILE * Ie_fp;
1206IEXT VOL U32 Idebug;
1207IEXT U32 Iperldb;
748a9306
LW
1208 /* This value may be raised by extensions for testing purposes */
1209IEXT int Iperl_destruct_level; /* 0=none, 1=full, 2=full with checks */
79072805
LW
1210
1211/* magical thingies */
85e6fe83 1212IEXT Time_t Ibasetime; /* $^T */
79072805
LW
1213IEXT SV * Iformfeed; /* $^L */
1214IEXT char * Ichopset IINIT(" \n-"); /* $: */
1215IEXT char * Irs IINIT("\n"); /* $/ */
1216IEXT U32 Irschar IINIT('\n'); /* final char of rs, or 0777 if none */
8990e307 1217IEXT STRLEN Irslen IINIT(1);
79072805
LW
1218IEXT bool Irspara;
1219IEXT char * Iofs; /* $, */
8990e307 1220IEXT STRLEN Iofslen;
79072805 1221IEXT char * Iors; /* $\ */
8990e307 1222IEXT STRLEN Iorslen;
79072805
LW
1223IEXT char * Iofmt; /* $# */
1224IEXT I32 Imaxsysfd IINIT(MAXSYSFD); /* top fd to pass to subprocesses */
1225IEXT int Imultiline; /* $*--do strings hold >1 line? */
748a9306 1226IEXT U32 Istatusvalue; /* $? */
79072805
LW
1227
1228IEXT struct stat Istatcache; /* _ */
1229IEXT GV * Istatgv;
1230IEXT SV * Istatname IINIT(Nullsv);
1231
1232/* shortcuts to various I/O objects */
1233IEXT GV * Istdingv;
1234IEXT GV * Ilast_in_gv;
1235IEXT GV * Idefgv;
1236IEXT GV * Iargvgv;
1237IEXT GV * Idefoutgv;
79072805
LW
1238IEXT GV * Iargvoutgv;
1239
1240/* shortcuts to regexp stuff */
1241IEXT GV * Ileftgv;
1242IEXT GV * Iampergv;
1243IEXT GV * Irightgv;
1244IEXT PMOP * Icurpm; /* what to do \ interps from */
79072805
LW
1245IEXT I32 * Iscreamfirst;
1246IEXT I32 * Iscreamnext;
1247IEXT I32 Imaxscream IINIT(-1);
1248IEXT SV * Ilastscream;
1249
1250/* shortcuts to debugging objects */
1251IEXT GV * IDBgv;
1252IEXT GV * IDBline;
1253IEXT GV * IDBsub;
1254IEXT SV * IDBsingle;
1255IEXT SV * IDBtrace;
1256IEXT SV * IDBsignal;
1257IEXT AV * Ilineary; /* lines of script for debugger */
1258IEXT AV * Idbargs; /* args to call listed by caller function */
1259
1260/* symbol tables */
1261IEXT HV * Idefstash; /* main symbol table */
1262IEXT HV * Icurstash; /* symbol table for current package */
1263IEXT HV * Idebstash; /* symbol table for perldb package */
1264IEXT SV * Icurstname; /* name of current package */
93a17b20
LW
1265IEXT AV * Ibeginav; /* names of BEGIN subroutines */
1266IEXT AV * Iendav; /* names of END subroutines */
1267IEXT AV * Ipad; /* storage for lexically scoped temporaries */
1268IEXT AV * Ipadname; /* variable names for "my" variables */
79072805
LW
1269
1270/* memory management */
79072805
LW
1271IEXT SV ** Itmps_stack;
1272IEXT I32 Itmps_ix IINIT(-1);
1273IEXT I32 Itmps_floor IINIT(-1);
8990e307
LW
1274IEXT I32 Itmps_max;
1275IEXT I32 Isv_count; /* how many SV* are currently allocated */
a0d0e21e 1276IEXT I32 Isv_objcount; /* how many objects are currently allocated */
8990e307
LW
1277IEXT SV* Isv_root; /* storage for SVs belonging to interp */
1278IEXT SV* Isv_arenaroot; /* list of areas for garbage collection */
79072805
LW
1279
1280/* funky return mechanisms */
1281IEXT I32 Ilastspbase;
1282IEXT I32 Ilastsize;
1283IEXT int Iforkprocess; /* so do_open |- can return proc# */
1284
1285/* subprocess state */
1286IEXT AV * Ifdpid; /* keep fd-to-pid mappings for my_popen */
1287IEXT HV * Ipidstatus; /* keep pid-to-status mappings for waitpid */
1288
1289/* internal state */
463ee0b2
LW
1290IEXT VOL int Iin_eval; /* trap "fatal" errors? */
1291IEXT OP * Irestartop; /* Are we propagating an error from croak? */
79072805 1292IEXT int Idelaymagic; /* ($<,$>) = ... */
2304df62 1293IEXT bool Idirty; /* In the middle of tearing things down? */
748a9306 1294IEXT U8 Ilocalizing; /* are we processing a local() list? */
79072805 1295IEXT bool Itainted; /* using variables controlled by $< */
463ee0b2 1296IEXT bool Itainting; /* doing taint checks */
79072805
LW
1297
1298/* trace state */
1299IEXT I32 Idlevel;
1300IEXT I32 Idlmax IINIT(128);
1301IEXT char * Idebname;
1302IEXT char * Idebdelim;
1303
1304/* current interpreter roots */
748a9306 1305IEXT CV * Imain_cv;
463ee0b2
LW
1306IEXT OP * Imain_root;
1307IEXT OP * Imain_start;
1308IEXT OP * Ieval_root;
1309IEXT OP * Ieval_start;
79072805
LW
1310
1311/* runtime control stuff */
1312IEXT COP * VOL Icurcop IINIT(&compiling);
1313IEXT line_t Icopline IINIT(NOLINE);
1314IEXT CONTEXT * Icxstack;
1315IEXT I32 Icxstack_ix IINIT(-1);
1316IEXT I32 Icxstack_max IINIT(128);
1317IEXT jmp_buf Itop_env;
a0d0e21e 1318IEXT I32 Irunlevel;
79072805
LW
1319
1320/* stack stuff */
1321IEXT AV * Istack; /* THE STACK */
1322IEXT AV * Imainstack; /* the stack when nothing funny is happening */
1323IEXT SV ** Imystack_base; /* stack->array_ary */
1324IEXT SV ** Imystack_sp; /* stack pointer now */
1325IEXT SV ** Imystack_max; /* stack->array_ary + stack->array_max */
1326
1327/* format accumulators */
463ee0b2
LW
1328IEXT SV * Iformtarget;
1329IEXT SV * Ibodytarget;
1330IEXT SV * Itoptarget;
79072805
LW
1331
1332/* statics moved here for shared library purposes */
93a17b20 1333IEXT SV Istrchop; /* return value from chop */
79072805
LW
1334IEXT int Ifilemode; /* so nextargv() can preserve mode */
1335IEXT int Ilastfd; /* what to preserve mode on */
1336IEXT char * Ioldname; /* what to preserve mode on */
1337IEXT char ** IArgv; /* stuff to free from do_aexec, vfork safe */
1338IEXT char * ICmd; /* stuff to free from do_aexec, vfork safe */
1339IEXT OP * Isortcop; /* user defined sort routine */
1340IEXT HV * Isortstash; /* which is in some package or other */
1341IEXT GV * Ifirstgv; /* $a */
1342IEXT GV * Isecondgv; /* $b */
1343IEXT AV * Isortstack; /* temp stack during pp_sort() */
1344IEXT AV * Isignalstack; /* temp stack during sighandler() */
1345IEXT SV * Imystrk; /* temp key string for do_each() */
1346IEXT I32 Idumplvl; /* indentation level on syntax tree dump */
79072805
LW
1347IEXT PMOP * Ioldlastpm; /* for saving regexp context during debugger */
1348IEXT I32 Igensym; /* next symbol for getsym() to define */
1349IEXT bool Ipreambled;
1350IEXT int Ilaststatval IINIT(-1);
1351IEXT I32 Ilaststype IINIT(OP_STAT);
1352
1353#undef IEXT
1354#undef IINIT
1355
8990e307 1356#ifdef MULTIPLICITY
79072805
LW
1357};
1358#else
1359struct interpreter {
1360 char broiled;
1361};
1362#endif
1363
1364#include "pp.h"
1365
1366#ifdef __cplusplus
1367extern "C" {
1368#endif
1369
a0d0e21e
LW
1370#ifdef __cplusplus
1371# ifndef I_STDARG
1372# define I_STDARG 1
1373# endif
1374#endif
1375
1376#ifdef I_STDARG
2304df62
AD
1377# include <stdarg.h>
1378#else
1379# ifdef I_VARARGS
1380# include <varargs.h>
1381# endif
1382#endif
1383
79072805
LW
1384#include "proto.h"
1385
a0d0e21e
LW
1386#ifdef EMBED
1387#define Perl_sv_setptrobj(rv,ptr,name) Perl_sv_setref_iv(rv,name,(IV)ptr)
1388#define Perl_sv_setptrref(rv,ptr) Perl_sv_setref_iv(rv,Nullch,(IV)ptr)
1389#else
1390#define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,(IV)ptr)
1391#define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,(IV)ptr)
1392#endif
1393
79072805
LW
1394#ifdef __cplusplus
1395};
1396#endif
1397
93a17b20 1398/* The following must follow proto.h */
79072805
LW
1399
1400#ifdef DOINIT
463ee0b2
LW
1401MGVTBL vtbl_sv = {magic_get,
1402 magic_set,
1403 magic_len,
1404 0, 0};
1405MGVTBL vtbl_env = {0, 0, 0, 0, 0};
1406MGVTBL vtbl_envelem = {0, magic_setenv,
85e6fe83
LW
1407 0, magic_clearenv,
1408 0};
463ee0b2
LW
1409MGVTBL vtbl_sig = {0, 0, 0, 0, 0};
1410MGVTBL vtbl_sigelem = {0, magic_setsig,
1411 0, 0, 0};
a0d0e21e
LW
1412MGVTBL vtbl_pack = {0, 0, 0, magic_wipepack,
1413 0};
463ee0b2
LW
1414MGVTBL vtbl_packelem = {magic_getpack,
1415 magic_setpack,
1416 0, magic_clearpack,
1417 0};
1418MGVTBL vtbl_dbline = {0, magic_setdbline,
1419 0, 0, 0};
1420MGVTBL vtbl_isa = {0, magic_setisa,
1421 0, 0, 0};
1422MGVTBL vtbl_isaelem = {0, magic_setisa,
1423 0, 0, 0};
1424MGVTBL vtbl_arylen = {magic_getarylen,
1425 magic_setarylen,
1426 0, 0, 0};
1427MGVTBL vtbl_glob = {magic_getglob,
1428 magic_setglob,
1429 0, 0, 0};
1430MGVTBL vtbl_mglob = {0, magic_setmglob,
1431 0, 0, 0};
1432MGVTBL vtbl_taint = {magic_gettaint,magic_settaint,
1433 0, 0, 0};
1434MGVTBL vtbl_substr = {0, magic_setsubstr,
1435 0, 0, 0};
1436MGVTBL vtbl_vec = {0, magic_setvec,
1437 0, 0, 0};
a0d0e21e
LW
1438MGVTBL vtbl_pos = {magic_getpos,
1439 magic_setpos,
1440 0, 0, 0};
463ee0b2
LW
1441MGVTBL vtbl_bm = {0, magic_setbm,
1442 0, 0, 0};
1443MGVTBL vtbl_uvar = {magic_getuvar,
1444 magic_setuvar,
1445 0, 0, 0};
a0d0e21e
LW
1446
1447#ifdef OVERLOAD
1448MGVTBL vtbl_amagic = {0, magic_setamagic,
748a9306 1449 0, 0, magic_setamagic};
a0d0e21e 1450MGVTBL vtbl_amagicelem = {0, magic_setamagic,
748a9306 1451 0, 0, magic_setamagic};
a0d0e21e
LW
1452#endif /* OVERLOAD */
1453
79072805
LW
1454#else
1455EXT MGVTBL vtbl_sv;
1456EXT MGVTBL vtbl_env;
1457EXT MGVTBL vtbl_envelem;
1458EXT MGVTBL vtbl_sig;
1459EXT MGVTBL vtbl_sigelem;
463ee0b2
LW
1460EXT MGVTBL vtbl_pack;
1461EXT MGVTBL vtbl_packelem;
79072805 1462EXT MGVTBL vtbl_dbline;
463ee0b2
LW
1463EXT MGVTBL vtbl_isa;
1464EXT MGVTBL vtbl_isaelem;
79072805
LW
1465EXT MGVTBL vtbl_arylen;
1466EXT MGVTBL vtbl_glob;
93a17b20 1467EXT MGVTBL vtbl_mglob;
463ee0b2 1468EXT MGVTBL vtbl_taint;
79072805
LW
1469EXT MGVTBL vtbl_substr;
1470EXT MGVTBL vtbl_vec;
a0d0e21e 1471EXT MGVTBL vtbl_pos;
79072805
LW
1472EXT MGVTBL vtbl_bm;
1473EXT MGVTBL vtbl_uvar;
a0d0e21e
LW
1474
1475#ifdef OVERLOAD
1476EXT MGVTBL vtbl_amagic;
1477EXT MGVTBL vtbl_amagicelem;
1478#endif /* OVERLOAD */
1479
79072805 1480#endif
85e6fe83 1481
a0d0e21e
LW
1482#ifdef OVERLOAD
1483EXT long amagic_generation;
1484
748a9306 1485#define NofAMmeth 29
a0d0e21e
LW
1486#ifdef DOINIT
1487EXT char * AMG_names[NofAMmeth][2] = {
1488 {"fallback","abs"},
1489 {"bool", "nomethod"},
1490 {"\"\"", "0+"},
1491 {"+","+="},
1492 {"-","-="},
1493 {"*", "*="},
1494 {"/", "/="},
1495 {"%", "%="},
1496 {"**", "**="},
1497 {"<<", "<<="},
1498 {">>", ">>="},
748a9306
LW
1499 {"&", "&="},
1500 {"|", "|="},
1501 {"^", "^="},
a0d0e21e
LW
1502 {"<", "<="},
1503 {">", ">="},
1504 {"==", "!="},
1505 {"<=>", "cmp"},
1506 {"lt", "le"},
1507 {"gt", "ge"},
1508 {"eq", "ne"},
a0d0e21e
LW
1509 {"!", "~"},
1510 {"++", "--"},
1511 {"atan2", "cos"},
1512 {"sin", "exp"},
1513 {"log", "sqrt"},
1514 {"x","x="},
748a9306
LW
1515 {".",".="},
1516 {"=","neg"}
a0d0e21e
LW
1517};
1518#else
1519EXT char * AMG_names[NofAMmeth][2];
1520#endif /* def INITAMAGIC */
1521
1522struct am_table {
1523 long was_ok_sub;
1524 long was_ok_am;
1525 CV* table[NofAMmeth*2];
1526 long fallback;
1527};
1528typedef struct am_table AMT;
1529
1530#define AMGfallNEVER 1
1531#define AMGfallNO 2
1532#define AMGfallYES 3
1533
1534enum {
1535 fallback_amg, abs_amg,
1536 bool__amg, nomethod_amg,
1537 string_amg, numer_amg,
1538 add_amg, add_ass_amg,
1539 subtr_amg, subtr_ass_amg,
1540 mult_amg, mult_ass_amg,
1541 div_amg, div_ass_amg,
1542 mod_amg, mod_ass_amg,
1543 pow_amg, pow_ass_amg,
1544 lshift_amg, lshift_ass_amg,
1545 rshift_amg, rshift_ass_amg,
748a9306
LW
1546 band_amg, band_ass_amg,
1547 bor_amg, bor_ass_amg,
1548 bxor_amg, bxor_ass_amg,
a0d0e21e
LW
1549 lt_amg, le_amg,
1550 gt_amg, ge_amg,
1551 eq_amg, ne_amg,
1552 ncmp_amg, scmp_amg,
1553 slt_amg, sle_amg,
1554 sgt_amg, sge_amg,
1555 seq_amg, sne_amg,
a0d0e21e
LW
1556 not_amg, compl_amg,
1557 inc_amg, dec_amg,
1558 atan2_amg, cos_amg,
1559 sin_amg, exp_amg,
1560 log_amg, sqrt_amg,
1561 repeat_amg, repeat_ass_amg,
748a9306
LW
1562 concat_amg, concat_ass_amg,
1563 copy_amg, neg_amg
a0d0e21e
LW
1564};
1565#endif /* OVERLOAD */
1566
85e6fe83 1567#endif /* Include guard */