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