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