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