This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate mainline changes into win32 branch. Now would be a good time
[perl5.git] / perl.h
1 /*    perl.h
2  *
3  *    Copyright (c) 1987-1997, 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 #ifdef PERL_FOR_X2P
14 /*
15  * This file is being used for x2p stuff. 
16  * Above symbol is defined via -D in 'x2p/Makefile.SH'
17  * Decouple x2p stuff from some of perls more extreme eccentricities. 
18  */
19 #undef EMBED
20 #undef NO_EMBED
21 #define NO_EMBED
22 #undef MULTIPLICITY
23 #undef USE_STDIO
24 #define USE_STDIO
25 #endif /* PERL_FOR_X2P */
26
27 #define VOIDUSED 1
28 #include "config.h"
29
30 #include "embed.h"
31
32 #undef START_EXTERN_C
33 #undef END_EXTERN_C
34 #undef EXTERN_C
35 #ifdef __cplusplus
36 #  define START_EXTERN_C extern "C" {
37 #  define END_EXTERN_C }
38 #  define EXTERN_C extern "C"
39 #else
40 #  define START_EXTERN_C 
41 #  define END_EXTERN_C 
42 #  define EXTERN_C
43 #endif
44
45 #if defined(USE_THREADS) /* && !defined(PERL_CORE) && !defined(PERLDLL) */
46 #ifndef CRIPPLED_CC
47 #define CRIPPLED_CC
48 #endif
49 #endif
50
51 #ifdef OP_IN_REGISTER
52 #  ifdef __GNUC__
53 #    define stringify_immed(s) #s
54 #    define stringify(s) stringify_immed(s)
55 register struct op *op asm(stringify(OP_IN_REGISTER));
56 #  endif
57 #endif
58
59 /*
60  * STMT_START { statements; } STMT_END;
61  * can be used as a single statement, as in
62  * if (x) STMT_START { ... } STMT_END; else ...
63  *
64  * Trying to select a version that gives no warnings...
65  */
66 #if !(defined(STMT_START) && defined(STMT_END))
67 # if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(__cplusplus)
68 #   define STMT_START   (void)( /* gcc supports ``({ STATEMENTS; })'' */
69 #   define STMT_END     )
70 # else
71    /* Now which other defined()s do we need here ??? */
72 #  if (VOIDFLAGS) && (defined(sun) || defined(__sun__))
73 #   define STMT_START   if (1)
74 #   define STMT_END     else (void)0
75 #  else
76 #   define STMT_START   do
77 #   define STMT_END     while (0)
78 #  endif
79 # endif
80 #endif
81
82 #define NOOP (void)0
83
84 #define WITH_THR(s) do { dTHR; s; } while (0)
85
86 /*
87  * SOFT_CAST can be used for args to prototyped functions to retain some
88  * type checking; it only casts if the compiler does not know prototypes.
89  */
90 #if defined(CAN_PROTOTYPE) && defined(DEBUGGING_COMPILE)
91 #define SOFT_CAST(type) 
92 #else
93 #define SOFT_CAST(type) (type)
94 #endif
95
96 #ifndef BYTEORDER
97 #   define BYTEORDER 0x1234
98 #endif
99
100 /* Overall memory policy? */
101 #ifndef CONSERVATIVE
102 #   define LIBERAL 1
103 #endif
104
105 /*
106  * The following contortions are brought to you on behalf of all the
107  * standards, semi-standards, de facto standards, not-so-de-facto standards
108  * of the world, as well as all the other botches anyone ever thought of.
109  * The basic theory is that if we work hard enough here, the rest of the
110  * code can be a lot prettier.  Well, so much for theory.  Sorry, Henry...
111  */
112
113 /* define this once if either system, instead of cluttering up the src */
114 #if defined(MSDOS) || defined(atarist) || defined(WIN32)
115 #define DOSISH 1
116 #endif
117
118 #if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus)
119 # define STANDARD_C 1
120 #endif
121
122 #if defined(__cplusplus) || defined(WIN32)
123 # define DONT_DECLARE_STD 1
124 #endif
125
126 #if defined(HASVOLATILE) || defined(STANDARD_C)
127 #   ifdef __cplusplus
128 #       define VOL              // to temporarily suppress warnings
129 #   else
130 #       define VOL volatile
131 #   endif
132 #else
133 #   define VOL
134 #endif
135
136 #define TAINT           (tainted = TRUE)
137 #define TAINT_NOT       (tainted = FALSE)
138 #define TAINT_IF(c)     if (c) { tainted = TRUE; }
139 #define TAINT_ENV()     if (tainting) { taint_env(); }
140 #define TAINT_PROPER(s) if (tainting) { taint_proper(no_security, s); }
141
142 /* XXX All process group stuff is handled in pp_sys.c.  Should these 
143    defines move there?  If so, I could simplify this a lot. --AD  9/96.
144 */
145 /* Process group stuff changed from traditional BSD to POSIX.
146    perlfunc.pod documents the traditional BSD-style syntax, so we'll
147    try to preserve that, if possible.
148 */
149 #ifdef HAS_SETPGID
150 #  define BSD_SETPGRP(pid, pgrp)        setpgid((pid), (pgrp))
151 #else
152 #  if defined(HAS_SETPGRP) && defined(USE_BSD_SETPGRP)
153 #    define BSD_SETPGRP(pid, pgrp)      setpgrp((pid), (pgrp))
154 #  else
155 #    ifdef HAS_SETPGRP2  /* DG/UX */
156 #      define BSD_SETPGRP(pid, pgrp)    setpgrp2((pid), (pgrp))
157 #    endif
158 #  endif
159 #endif
160 #if defined(BSD_SETPGRP) && !defined(HAS_SETPGRP)
161 #  define HAS_SETPGRP  /* Well, effectively it does . . . */
162 #endif
163
164 /* getpgid isn't POSIX, but at least Solaris and Linux have it, and it makes
165     our life easier :-) so we'll try it.
166 */
167 #ifdef HAS_GETPGID
168 #  define BSD_GETPGRP(pid)              getpgid((pid))
169 #else
170 #  if defined(HAS_GETPGRP) && defined(USE_BSD_GETPGRP)
171 #    define BSD_GETPGRP(pid)            getpgrp((pid))
172 #  else
173 #    ifdef HAS_GETPGRP2  /* DG/UX */
174 #      define BSD_GETPGRP(pid)          getpgrp2((pid))
175 #    endif
176 #  endif
177 #endif
178 #if defined(BSD_GETPGRP) && !defined(HAS_GETPGRP)
179 #  define HAS_GETPGRP  /* Well, effectively it does . . . */
180 #endif
181
182 /* These are not exact synonyms, since setpgrp() and getpgrp() may 
183    have different behaviors, but perl.h used to define USE_BSDPGRP
184    (prior to 5.003_05) so some extension might depend on it.
185 */
186 #if defined(USE_BSD_SETPGRP) || defined(USE_BSD_GETPGRP)
187 #  ifndef USE_BSDPGRP
188 #    define USE_BSDPGRP
189 #  endif
190 #endif
191
192 #ifndef _TYPES_         /* If types.h defines this it's easy. */
193 #   ifndef major                /* Does everyone's types.h define this? */
194 #       include <sys/types.h>
195 #   endif
196 #endif
197
198 #ifdef __cplusplus
199 #  ifndef I_STDARG
200 #    define I_STDARG 1
201 #  endif
202 #endif
203
204 #ifdef I_STDARG
205 #  include <stdarg.h>
206 #else
207 #  ifdef I_VARARGS
208 #    include <varargs.h>
209 #  endif
210 #endif
211
212 #include "perlio.h"
213
214 #ifdef USE_NEXT_CTYPE
215
216 #if NX_CURRENT_COMPILER_RELEASE >= 400
217 #include <objc/NXCType.h>
218 #else /*  NX_CURRENT_COMPILER_RELEASE < 400 */
219 #include <appkit/NXCType.h>
220 #endif /*  NX_CURRENT_COMPILER_RELEASE >= 400 */
221
222 #else /* !USE_NEXT_CTYPE */
223 #include <ctype.h>
224 #endif /* USE_NEXT_CTYPE */
225
226 #ifdef METHOD   /* Defined by OSF/1 v3.0 by ctype.h */
227 #undef METHOD
228 #endif
229
230 #ifdef I_LOCALE
231 #   include <locale.h>
232 #endif
233
234 #if !defined(NO_LOCALE) && defined(HAS_SETLOCALE)
235 #   define USE_LOCALE
236 #   if !defined(NO_LOCALE_COLLATE) && defined(LC_COLLATE) \
237        && defined(HAS_STRXFRM)
238 #       define USE_LOCALE_COLLATE
239 #   endif
240 #   if !defined(NO_LOCALE_CTYPE) && defined(LC_CTYPE)
241 #       define USE_LOCALE_CTYPE
242 #   endif
243 #   if !defined(NO_LOCALE_NUMERIC) && defined(LC_NUMERIC)
244 #       define USE_LOCALE_NUMERIC
245 #   endif
246 #endif /* !NO_LOCALE && HAS_SETLOCALE */
247
248 #include <setjmp.h>
249
250 #ifdef I_SYS_PARAM
251 #   ifdef PARAM_NEEDS_TYPES
252 #       include <sys/types.h>
253 #   endif
254 #   include <sys/param.h>
255 #endif
256
257
258 /* Use all the "standard" definitions? */
259 #if defined(STANDARD_C) && defined(I_STDLIB)
260 #   include <stdlib.h>
261 #endif
262
263 /* This comes after <stdlib.h> so we don't try to change the standard
264  * library prototypes; we'll use our own in proto.h instead. */
265
266 #ifdef MYMALLOC
267
268 #   ifdef HIDEMYMALLOC
269 #       define malloc  Mymalloc
270 #       define calloc  Mycalloc
271 #       define realloc Myremalloc
272 #       define free    Myfree
273 #   endif
274 #   ifdef EMBEDMYMALLOC
275 #       define malloc  Perl_malloc
276 #       define calloc  Perl_calloc
277 #       define realloc Perl_realloc
278 #       define free    Perl_free
279 #   endif
280
281 #   undef safemalloc
282 #   undef safecalloc
283 #   undef saferealloc
284 #   undef safefree
285 #   define safemalloc  malloc
286 #   define safecalloc  calloc
287 #   define saferealloc realloc
288 #   define safefree    free
289
290 #endif /* MYMALLOC */
291
292 #define MEM_SIZE Size_t
293
294 #if defined(STANDARD_C) && defined(I_STDDEF)
295 #   include <stddef.h>
296 #   define STRUCT_OFFSET(s,m)  offsetof(s,m)
297 #else
298 #   define STRUCT_OFFSET(s,m)  (Size_t)(&(((s *)0)->m))
299 #endif
300
301 #if defined(I_STRING) || defined(__cplusplus)
302 #   include <string.h>
303 #else
304 #   include <strings.h>
305 #endif
306
307 #if !defined(HAS_STRCHR) && defined(HAS_INDEX) && !defined(strchr)
308 #define strchr index
309 #define strrchr rindex
310 #endif
311
312 #ifdef I_MEMORY
313 #  include <memory.h>
314 #endif
315
316 #ifdef HAS_MEMCPY
317 #  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
318 #    ifndef memcpy
319         extern char * memcpy _((char*, char*, int));
320 #    endif
321 #  endif
322 #else
323 #   ifndef memcpy
324 #       ifdef HAS_BCOPY
325 #           define memcpy(d,s,l) bcopy(s,d,l)
326 #       else
327 #           define memcpy(d,s,l) my_bcopy(s,d,l)
328 #       endif
329 #   endif
330 #endif /* HAS_MEMCPY */
331
332 #ifdef HAS_MEMSET
333 #  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
334 #    ifndef memset
335         extern char *memset _((char*, int, int));
336 #    endif
337 #  endif
338 #else
339 #  define memset(d,c,l) my_memset(d,c,l)
340 #endif /* HAS_MEMSET */
341
342 #if !defined(HAS_MEMMOVE) && !defined(memmove)
343 #   if defined(HAS_BCOPY) && defined(HAS_SAFE_BCOPY)
344 #       define memmove(d,s,l) bcopy(s,d,l)
345 #   else
346 #       if defined(HAS_MEMCPY) && defined(HAS_SAFE_MEMCPY)
347 #           define memmove(d,s,l) memcpy(d,s,l)
348 #       else
349 #           define memmove(d,s,l) my_bcopy(s,d,l)
350 #       endif
351 #   endif
352 #endif
353
354 #if defined(mips) && defined(ultrix) && !defined(__STDC__)
355 #   undef HAS_MEMCMP
356 #endif
357
358 #if defined(HAS_MEMCMP) && defined(HAS_SANE_MEMCMP)
359 #  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
360 #    ifndef memcmp
361         extern int memcmp _((char*, char*, int));
362 #    endif
363 #  endif
364 #  ifdef BUGGY_MSC
365   #  pragma function(memcmp)
366 #  endif
367 #else
368 #   ifndef memcmp
369 #       define memcmp   my_memcmp
370 #   endif
371 #endif /* HAS_MEMCMP && HAS_SANE_MEMCMP */
372
373 #ifndef memzero
374 #   ifdef HAS_MEMSET
375 #       define memzero(d,l) memset(d,0,l)
376 #   else
377 #       ifdef HAS_BZERO
378 #           define memzero(d,l) bzero(d,l)
379 #       else
380 #           define memzero(d,l) my_bzero(d,l)
381 #       endif
382 #   endif
383 #endif
384
385 #ifndef HAS_BCMP
386 #   ifndef bcmp
387 #       define bcmp(s1,s2,l) memcmp(s1,s2,l)
388 #   endif
389 #endif /* !HAS_BCMP */
390
391 #ifdef I_NETINET_IN
392 #   include <netinet/in.h>
393 #endif
394
395 #if defined(SF_APPEND) && defined(USE_SFIO) && defined(I_SFIO)
396 /* <sfio.h> defines SF_APPEND and <sys/stat.h> might define SF_APPEND
397  * (the neo-BSD seem to do this).  */
398 #   undef SF_APPEND
399 #endif
400
401 #ifdef I_SYS_STAT
402 #   include <sys/stat.h>
403 #endif
404
405 /* The stat macros for Amdahl UTS, Unisoft System V/88 (and derivatives
406    like UTekV) are broken, sometimes giving false positives.  Undefine
407    them here and let the code below set them to proper values.
408
409    The ghs macro stands for GreenHills Software C-1.8.5 which
410    is the C compiler for sysV88 and the various derivatives.
411    This header file bug is corrected in gcc-2.5.8 and later versions.
412    --Kaveh Ghazi (ghazi@noc.rutgers.edu) 10/3/94.  */
413
414 #if defined(uts) || (defined(m88k) && defined(ghs))
415 #   undef S_ISDIR
416 #   undef S_ISCHR
417 #   undef S_ISBLK
418 #   undef S_ISREG
419 #   undef S_ISFIFO
420 #   undef S_ISLNK
421 #endif
422
423 #ifdef I_TIME
424 #   include <time.h>
425 #endif
426
427 #ifdef I_SYS_TIME
428 #   ifdef I_SYS_TIME_KERNEL
429 #       define KERNEL
430 #   endif
431 #   include <sys/time.h>
432 #   ifdef I_SYS_TIME_KERNEL
433 #       undef KERNEL
434 #   endif
435 #endif
436
437 #if defined(HAS_TIMES) && defined(I_SYS_TIMES)
438 #    include <sys/times.h>
439 #endif
440
441 #if defined(HAS_STRERROR) && (!defined(HAS_MKDIR) || !defined(HAS_RMDIR))
442 #   undef HAS_STRERROR
443 #endif
444
445 #ifndef HAS_MKFIFO
446 #  ifndef mkfifo
447 #    define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
448 #  endif
449 #endif /* !HAS_MKFIFO */
450
451 #include <errno.h>
452 #ifdef HAS_SOCKET
453 #   ifdef I_NET_ERRNO
454 #     include <net/errno.h>
455 #   endif
456 #endif
457
458 #ifdef VMS
459 #   define SETERRNO(errcode,vmserrcode) \
460         STMT_START {                    \
461             set_errno(errcode);         \
462             set_vaxc_errno(vmserrcode); \
463         } STMT_END
464 #else
465 #   define SETERRNO(errcode,vmserrcode) errno = (errcode)
466 #endif
467
468 #ifdef USE_THREADS
469 #  define ERRSV (thr->errsv)
470 #  define ERRHV (thr->errhv)
471 #else
472 #  define ERRSV GvSV(errgv)
473 #  define ERRHV GvHV(errgv)
474 #endif /* USE_THREADS */
475
476 #ifndef errno
477         extern int errno;     /* ANSI allows errno to be an lvalue expr */
478 #endif
479
480 #ifdef HAS_STRERROR
481 #       ifdef VMS
482         char *strerror _((int,...));
483 #       else
484 #ifndef DONT_DECLARE_STD
485         char *strerror _((int));
486 #endif
487 #       endif
488 #       ifndef Strerror
489 #           define Strerror strerror
490 #       endif
491 #else
492 #    ifdef HAS_SYS_ERRLIST
493         extern int sys_nerr;
494         extern char *sys_errlist[];
495 #       ifndef Strerror
496 #           define Strerror(e) \
497                 ((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e])
498 #       endif
499 #   endif
500 #endif
501
502 #ifdef I_SYS_IOCTL
503 #   ifndef _IOCTL_
504 #       include <sys/ioctl.h>
505 #   endif
506 #endif
507
508 #if defined(mc300) || defined(mc500) || defined(mc700) || defined(mc6000)
509 #   ifdef HAS_SOCKETPAIR
510 #       undef HAS_SOCKETPAIR
511 #   endif
512 #   ifdef I_NDBM
513 #       undef I_NDBM
514 #   endif
515 #endif
516
517 #if INTSIZE == 2
518 #   define htoni htons
519 #   define ntohi ntohs
520 #else
521 #   define htoni htonl
522 #   define ntohi ntohl
523 #endif
524
525 /* Configure already sets Direntry_t */
526 #if defined(I_DIRENT)
527 #   include <dirent.h>
528 #   if defined(NeXT) && defined(I_SYS_DIR) /* NeXT needs dirent + sys/dir.h */
529 #       include <sys/dir.h>
530 #   endif
531 #else
532 #   ifdef I_SYS_NDIR
533 #       include <sys/ndir.h>
534 #   else
535 #       ifdef I_SYS_DIR
536 #           ifdef hp9000s500
537 #               include <ndir.h>        /* may be wrong in the future */
538 #           else
539 #               include <sys/dir.h>
540 #           endif
541 #       endif
542 #   endif
543 #endif
544
545 #ifdef FPUTS_BOTCH
546 /* work around botch in SunOS 4.0.1 and 4.0.2 */
547 #   ifndef fputs
548 #       define fputs(sv,fp) fprintf(fp,"%s",sv)
549 #   endif
550 #endif
551
552 /*
553  * The following gobbledygook brought to you on behalf of __STDC__.
554  * (I could just use #ifndef __STDC__, but this is more bulletproof
555  * in the face of half-implementations.)
556  */
557
558 #ifndef S_IFMT
559 #   ifdef _S_IFMT
560 #       define S_IFMT _S_IFMT
561 #   else
562 #       define S_IFMT 0170000
563 #   endif
564 #endif
565
566 #ifndef S_ISDIR
567 #   define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR)
568 #endif
569
570 #ifndef S_ISCHR
571 #   define S_ISCHR(m) ((m & S_IFMT) == S_IFCHR)
572 #endif
573
574 #ifndef S_ISBLK
575 #   ifdef S_IFBLK
576 #       define S_ISBLK(m) ((m & S_IFMT) == S_IFBLK)
577 #   else
578 #       define S_ISBLK(m) (0)
579 #   endif
580 #endif
581
582 #ifndef S_ISREG
583 #   define S_ISREG(m) ((m & S_IFMT) == S_IFREG)
584 #endif
585
586 #ifndef S_ISFIFO
587 #   ifdef S_IFIFO
588 #       define S_ISFIFO(m) ((m & S_IFMT) == S_IFIFO)
589 #   else
590 #       define S_ISFIFO(m) (0)
591 #   endif
592 #endif
593
594 #ifndef S_ISLNK
595 #   ifdef _S_ISLNK
596 #       define S_ISLNK(m) _S_ISLNK(m)
597 #   else
598 #       ifdef _S_IFLNK
599 #           define S_ISLNK(m) ((m & S_IFMT) == _S_IFLNK)
600 #       else
601 #           ifdef S_IFLNK
602 #               define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK)
603 #           else
604 #               define S_ISLNK(m) (0)
605 #           endif
606 #       endif
607 #   endif
608 #endif
609
610 #ifndef S_ISSOCK
611 #   ifdef _S_ISSOCK
612 #       define S_ISSOCK(m) _S_ISSOCK(m)
613 #   else
614 #       ifdef _S_IFSOCK
615 #           define S_ISSOCK(m) ((m & S_IFMT) == _S_IFSOCK)
616 #       else
617 #           ifdef S_IFSOCK
618 #               define S_ISSOCK(m) ((m & S_IFMT) == S_IFSOCK)
619 #           else
620 #               define S_ISSOCK(m) (0)
621 #           endif
622 #       endif
623 #   endif
624 #endif
625
626 #ifndef S_IRUSR
627 #   ifdef S_IREAD
628 #       define S_IRUSR S_IREAD
629 #       define S_IWUSR S_IWRITE
630 #       define S_IXUSR S_IEXEC
631 #   else
632 #       define S_IRUSR 0400
633 #       define S_IWUSR 0200
634 #       define S_IXUSR 0100
635 #   endif
636 #   define S_IRGRP (S_IRUSR>>3)
637 #   define S_IWGRP (S_IWUSR>>3)
638 #   define S_IXGRP (S_IXUSR>>3)
639 #   define S_IROTH (S_IRUSR>>6)
640 #   define S_IWOTH (S_IWUSR>>6)
641 #   define S_IXOTH (S_IXUSR>>6)
642 #endif
643
644 #ifndef S_ISUID
645 #   define S_ISUID 04000
646 #endif
647
648 #ifndef S_ISGID
649 #   define S_ISGID 02000
650 #endif
651
652 #ifdef ff_next
653 #   undef ff_next
654 #endif
655
656 #if defined(cray) || defined(gould) || defined(i860) || defined(pyr)
657 #   define SLOPPYDIVIDE
658 #endif
659
660 #ifdef UV
661 #undef UV
662 #endif
663
664 /*  XXX QUAD stuff is not currently supported on most systems.
665     Specifically, perl internals don't support long long.  Among
666     the many problems is that some compilers support long long,
667     but the underlying library functions (such as sprintf) don't.
668     Some things do work (such as quad pack/unpack on convex);
669     also some systems use long long for the fpos_t typedef.  That
670     seems to work too.
671
672     The IV type is supposed to be long enough to hold any integral
673     value or a pointer.
674     --Andy Dougherty    August 1996
675 */
676
677 #ifdef cray
678 #   define Quad_t int
679 #else
680 #   ifdef convex
681 #       define Quad_t long long
682 #   else
683 #       if BYTEORDER > 0xFFFF
684 #           define Quad_t long
685 #       endif
686 #   endif
687 #endif
688
689 #ifdef Quad_t
690 #   define HAS_QUAD
691     typedef Quad_t IV;
692     typedef unsigned Quad_t UV;
693 #   define IV_MAX PERL_QUAD_MAX
694 #   define IV_MIN PERL_QUAD_MIN
695 #   define UV_MAX PERL_UQUAD_MAX
696 #   define UV_MIN PERL_UQUAD_MIN
697 #else
698     typedef long IV;
699     typedef unsigned long UV;
700 #   define IV_MAX PERL_LONG_MAX
701 #   define IV_MIN PERL_LONG_MIN
702 #   define UV_MAX PERL_ULONG_MAX
703 #   define UV_MIN PERL_ULONG_MIN
704 #endif
705
706 /* Previously these definitions used hardcoded figures. 
707  * It is hoped these formula are more portable, although
708  * no data one way or another is presently known to me.
709  * The "PERL_" names are used because these calculated constants
710  * do not meet the ANSI requirements for LONG_MAX, etc., which
711  * need to be constants acceptable to #if - kja
712  *    define PERL_LONG_MAX        2147483647L
713  *    define PERL_LONG_MIN        (-LONG_MAX - 1)
714  *    define PERL ULONG_MAX       4294967295L
715  */
716
717 #ifdef I_LIMITS  /* Needed for cast_xxx() functions below. */
718 #  include <limits.h>
719 #else
720 #ifdef I_VALUES
721 #  include <values.h>
722 #endif
723 #endif
724
725 /*
726  * Try to figure out max and min values for the integral types.  THE CORRECT
727  * SOLUTION TO THIS MESS: ADAPT enquire.c FROM GCC INTO CONFIGURE.  The
728  * following hacks are used if neither limits.h or values.h provide them:
729  * U<TYPE>_MAX: for types >= int: ~(unsigned TYPE)0
730  *              for types <  int:  (unsigned TYPE)~(unsigned)0
731  *      The argument to ~ must be unsigned so that later signed->unsigned
732  *      conversion can't modify the value's bit pattern (e.g. -0 -> +0),
733  *      and it must not be smaller than int because ~ does integral promotion.
734  * <type>_MAX: (<type>) (U<type>_MAX >> 1)
735  * <type>_MIN: -<type>_MAX - <is_twos_complement_architecture: (3 & -1) == 3>.
736  *      The latter is a hack which happens to work on some machines but
737  *      does *not* catch any random system, or things like integer types
738  *      with NaN if that is possible.
739  *
740  * All of the types are explicitly cast to prevent accidental loss of
741  * numeric range, and in the hope that they will be less likely to confuse
742  * over-eager optimizers.
743  *
744  */
745
746 #define PERL_UCHAR_MIN ((unsigned char)0)
747
748 #ifdef UCHAR_MAX
749 #  define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
750 #else
751 #  ifdef MAXUCHAR
752 #    define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
753 #  else
754 #    define PERL_UCHAR_MAX       ((unsigned char)~(unsigned)0)
755 #  endif
756 #endif
757  
758 /*
759  * CHAR_MIN and CHAR_MAX are not included here, as the (char) type may be
760  * ambiguous. It may be equivalent to (signed char) or (unsigned char)
761  * depending on local options. Until Configure detects this (or at least
762  * detects whether the "signed" keyword is available) the CHAR ranges
763  * will not be included. UCHAR functions normally.
764  *                                                           - kja
765  */
766
767 #define PERL_USHORT_MIN ((unsigned short)0)
768
769 #ifdef USHORT_MAX
770 #  define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
771 #else
772 #  ifdef MAXUSHORT
773 #    define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
774 #  else
775 #    define PERL_USHORT_MAX       ((unsigned short)~(unsigned)0)
776 #  endif
777 #endif
778
779 #ifdef SHORT_MAX
780 #  define PERL_SHORT_MAX ((short)SHORT_MAX)
781 #else
782 #  ifdef MAXSHORT    /* Often used in <values.h> */
783 #    define PERL_SHORT_MAX ((short)MAXSHORT)
784 #  else
785 #    define PERL_SHORT_MAX      ((short) (PERL_USHORT_MAX >> 1))
786 #  endif
787 #endif
788
789 #ifdef SHORT_MIN
790 #  define PERL_SHORT_MIN ((short)SHORT_MIN)
791 #else
792 #  ifdef MINSHORT
793 #    define PERL_SHORT_MIN ((short)MINSHORT)
794 #  else
795 #    define PERL_SHORT_MIN        (-PERL_SHORT_MAX - ((3 & -1) == 3))
796 #  endif
797 #endif
798
799 #ifdef UINT_MAX
800 #  define PERL_UINT_MAX ((unsigned int)UINT_MAX)
801 #else
802 #  ifdef MAXUINT
803 #    define PERL_UINT_MAX ((unsigned int)MAXUINT)
804 #  else
805 #    define PERL_UINT_MAX       (~(unsigned int)0)
806 #  endif
807 #endif
808
809 #define PERL_UINT_MIN ((unsigned int)0)
810
811 #ifdef INT_MAX
812 #  define PERL_INT_MAX ((int)INT_MAX)
813 #else
814 #  ifdef MAXINT    /* Often used in <values.h> */
815 #    define PERL_INT_MAX ((int)MAXINT)
816 #  else
817 #    define PERL_INT_MAX        ((int)(PERL_UINT_MAX >> 1))
818 #  endif
819 #endif
820
821 #ifdef INT_MIN
822 #  define PERL_INT_MIN ((int)INT_MIN)
823 #else
824 #  ifdef MININT
825 #    define PERL_INT_MIN ((int)MININT)
826 #  else
827 #    define PERL_INT_MIN        (-PERL_INT_MAX - ((3 & -1) == 3))
828 #  endif
829 #endif
830
831 #ifdef ULONG_MAX
832 #  define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
833 #else
834 #  ifdef MAXULONG
835 #    define PERL_ULONG_MAX ((unsigned long)MAXULONG)
836 #  else
837 #    define PERL_ULONG_MAX       (~(unsigned long)0)
838 #  endif
839 #endif
840
841 #define PERL_ULONG_MIN ((unsigned long)0L)
842
843 #ifdef LONG_MAX
844 #  define PERL_LONG_MAX ((long)LONG_MAX)
845 #else
846 #  ifdef MAXLONG    /* Often used in <values.h> */
847 #    define PERL_LONG_MAX ((long)MAXLONG)
848 #  else
849 #    define PERL_LONG_MAX        ((long) (PERL_ULONG_MAX >> 1))
850 #  endif
851 #endif
852
853 #ifdef LONG_MIN
854 #  define PERL_LONG_MIN ((long)LONG_MIN)
855 #else
856 #  ifdef MINLONG
857 #    define PERL_LONG_MIN ((long)MINLONG)
858 #  else
859 #    define PERL_LONG_MIN        (-PERL_LONG_MAX - ((3 & -1) == 3))
860 #  endif
861 #endif
862
863 #ifdef HAS_QUAD
864
865 #  ifdef UQUAD_MAX
866 #    define PERL_UQUAD_MAX ((UV)UQUAD_MAX)
867 #  else
868 #    define PERL_UQUAD_MAX      (~(UV)0)
869 #  endif
870
871 #  define PERL_UQUAD_MIN ((UV)0)
872
873 #  ifdef QUAD_MAX
874 #    define PERL_QUAD_MAX ((IV)QUAD_MAX)
875 #  else
876 #    define PERL_QUAD_MAX       ((IV) (PERL_UQUAD_MAX >> 1))
877 #  endif
878
879 #  ifdef QUAD_MIN
880 #    define PERL_QUAD_MIN ((IV)QUAD_MIN)
881 #  else
882 #    define PERL_QUAD_MIN       (-PERL_QUAD_MAX - ((3 & -1) == 3))
883 #  endif
884
885 #endif
886
887 typedef MEM_SIZE STRLEN;
888
889 typedef struct op OP;
890 typedef struct cop COP;
891 typedef struct unop UNOP;
892 typedef struct binop BINOP;
893 typedef struct listop LISTOP;
894 typedef struct logop LOGOP;
895 typedef struct condop CONDOP;
896 typedef struct pmop PMOP;
897 typedef struct svop SVOP;
898 typedef struct gvop GVOP;
899 typedef struct pvop PVOP;
900 typedef struct loop LOOP;
901
902 typedef struct Outrec Outrec;
903 typedef struct interpreter PerlInterpreter;
904 #ifndef __BORLANDC__
905 typedef struct ff FF;           /* XXX not defined anywhere, should go? */
906 #endif
907 typedef struct sv SV;
908 typedef struct av AV;
909 typedef struct hv HV;
910 typedef struct cv CV;
911 typedef struct regexp REGEXP;
912 typedef struct gp GP;
913 typedef struct gv GV;
914 typedef struct io IO;
915 typedef struct context PERL_CONTEXT;
916 typedef struct block BLOCK;
917
918 typedef struct magic MAGIC;
919 typedef struct xrv XRV;
920 typedef struct xpv XPV;
921 typedef struct xpviv XPVIV;
922 typedef struct xpvuv XPVUV;
923 typedef struct xpvnv XPVNV;
924 typedef struct xpvmg XPVMG;
925 typedef struct xpvlv XPVLV;
926 typedef struct xpvav XPVAV;
927 typedef struct xpvhv XPVHV;
928 typedef struct xpvgv XPVGV;
929 typedef struct xpvcv XPVCV;
930 typedef struct xpvbm XPVBM;
931 typedef struct xpvfm XPVFM;
932 typedef struct xpvio XPVIO;
933 typedef struct mgvtbl MGVTBL;
934 typedef union any ANY;
935
936 #include "handy.h"
937
938 typedef I32 (*filter_t) _((int, SV *, int));
939 #define FILTER_READ(idx, sv, len)  filter_read(idx, sv, len)
940 #define FILTER_DATA(idx)           (AvARRAY(rsfp_filters)[idx])
941 #define FILTER_ISREADER(idx)       (idx >= AvFILL(rsfp_filters))
942
943 #ifdef DOSISH
944 # if defined(OS2)
945 #   include "os2ish.h"
946 # else
947 #   include "dosish.h"
948 # endif
949 #else
950 # if defined(VMS)
951 #   include "vmsish.h"
952 # else
953 #   if defined(PLAN9)
954 #     include "./plan9/plan9ish.h"
955 #   else
956 #     include "unixish.h"
957 #   endif
958 # endif
959 #endif         
960
961 /* 
962  * USE_THREADS needs to be after unixish.h as <pthread.h> includes <sys/signal.h>
963  * which defines NSIG - which will stop inclusion of <signal.h>
964  * this results in many functions being undeclared which bothers C++
965  * May make sense to have threads after "*ish.h" anyway
966  */
967
968 #ifdef USE_THREADS
969 #  ifdef FAKE_THREADS
970 #    include "fakethr.h"
971 #  else
972 #    ifdef WIN32
973 #      include <win32thread.h>
974 #    else
975 #      include <pthread.h>
976 typedef pthread_mutex_t perl_mutex;
977 typedef pthread_cond_t perl_cond;
978 typedef pthread_key_t perl_key;
979 #    endif /* WIN32 */
980 #  endif /* FAKE_THREADS */
981 #endif /* USE_THREADS */
982
983
984   
985 #ifdef VMS
986 #   define STATUS_NATIVE        statusvalue_vms
987 #   define STATUS_NATIVE_EXPORT \
988         ((I32)statusvalue_vms == -1 ? 44 : statusvalue_vms)
989 #   define STATUS_NATIVE_SET(n)                                         \
990         STMT_START {                                                    \
991             statusvalue_vms = (n);                                      \
992             if ((I32)statusvalue_vms == -1)                             \
993                 statusvalue = -1;                                       \
994             else if (statusvalue_vms & STS$M_SUCCESS)                   \
995                 statusvalue = 0;                                        \
996             else if ((statusvalue_vms & STS$M_SEVERITY) == 0)           \
997                 statusvalue = 1 << 8;                                   \
998             else                                                        \
999                 statusvalue = (statusvalue_vms & STS$M_SEVERITY) << 8;  \
1000         } STMT_END
1001 #   define STATUS_POSIX statusvalue
1002 #   ifdef VMSISH_STATUS
1003 #       define STATUS_CURRENT   (VMSISH_STATUS ? STATUS_NATIVE : STATUS_POSIX)
1004 #   else
1005 #       define STATUS_CURRENT   STATUS_POSIX
1006 #   endif
1007 #   define STATUS_POSIX_SET(n)                          \
1008         STMT_START {                                    \
1009             statusvalue = (n);                          \
1010             if (statusvalue != -1) {                    \
1011                 statusvalue &= 0xFFFF;                  \
1012                 statusvalue_vms = statusvalue ? 44 : 1; \
1013             }                                           \
1014             else statusvalue_vms = -1;                  \
1015         } STMT_END
1016 #   define STATUS_ALL_SUCCESS   (statusvalue = 0, statusvalue_vms = 1)
1017 #   define STATUS_ALL_FAILURE   (statusvalue = 1, statusvalue_vms = 44)
1018 #else
1019 #   define STATUS_NATIVE        STATUS_POSIX
1020 #   define STATUS_NATIVE_EXPORT STATUS_POSIX
1021 #   define STATUS_NATIVE_SET    STATUS_POSIX_SET
1022 #   define STATUS_POSIX         statusvalue
1023 #   define STATUS_POSIX_SET(n)          \
1024         STMT_START {                    \
1025             statusvalue = (n);          \
1026             if (statusvalue != -1)      \
1027                 statusvalue &= 0xFFFF;  \
1028         } STMT_END
1029 #   define STATUS_CURRENT STATUS_POSIX
1030 #   define STATUS_ALL_SUCCESS   (statusvalue = 0)
1031 #   define STATUS_ALL_FAILURE   (statusvalue = 1)
1032 #endif
1033
1034 /* Some unistd.h's give a prototype for pause() even though
1035    HAS_PAUSE ends up undefined.  This causes the #define
1036    below to be rejected by the compmiler.  Sigh.
1037 */
1038 #ifdef HAS_PAUSE
1039 #define Pause   pause
1040 #else
1041 #define Pause() sleep((32767<<16)+32767)
1042 #endif
1043
1044 #ifndef IOCPARM_LEN
1045 #   ifdef IOCPARM_MASK
1046         /* on BSDish systes we're safe */
1047 #       define IOCPARM_LEN(x)  (((x) >> 16) & IOCPARM_MASK)
1048 #   else
1049         /* otherwise guess at what's safe */
1050 #       define IOCPARM_LEN(x)   256
1051 #   endif
1052 #endif
1053
1054 union any {
1055     void*       any_ptr;
1056     I32         any_i32;
1057     IV          any_iv;
1058     long        any_long;
1059     void        (*any_dptr) _((void*));
1060 };
1061
1062 #ifdef USE_THREADS
1063 #define ARGSproto struct thread *thr
1064 #else
1065 #define ARGSproto void
1066 #endif /* USE_THREADS */
1067
1068 /* Work around some cygwin32 problems with importing global symbols */
1069 #if defined(CYGWIN32) && defined(DLLIMPORT) 
1070 #   include "cw32imp.h"
1071 #endif
1072
1073 #include "regexp.h"
1074 #include "sv.h"
1075 #include "util.h"
1076 #include "form.h"
1077 #include "gv.h"
1078 #include "cv.h"
1079 #include "opcode.h"
1080 #include "op.h"
1081 #include "cop.h"
1082 #include "av.h"
1083 #include "hv.h"
1084 #include "mg.h"
1085 #include "scope.h"
1086
1087 /* work around some libPW problems */
1088 #ifdef DOINIT
1089 EXT char Error[1];
1090 #endif
1091
1092 #if defined(iAPX286) || defined(M_I286) || defined(I80286)
1093 #   define I286
1094 #endif
1095
1096 #if defined(htonl) && !defined(HAS_HTONL)
1097 #define HAS_HTONL
1098 #endif
1099 #if defined(htons) && !defined(HAS_HTONS)
1100 #define HAS_HTONS
1101 #endif
1102 #if defined(ntohl) && !defined(HAS_NTOHL)
1103 #define HAS_NTOHL
1104 #endif
1105 #if defined(ntohs) && !defined(HAS_NTOHS)
1106 #define HAS_NTOHS
1107 #endif
1108 #ifndef HAS_HTONL
1109 #if (BYTEORDER & 0xffff) != 0x4321
1110 #define HAS_HTONS
1111 #define HAS_HTONL
1112 #define HAS_NTOHS
1113 #define HAS_NTOHL
1114 #define MYSWAP
1115 #define htons my_swap
1116 #define htonl my_htonl
1117 #define ntohs my_swap
1118 #define ntohl my_ntohl
1119 #endif
1120 #else
1121 #if (BYTEORDER & 0xffff) == 0x4321
1122 #undef HAS_HTONS
1123 #undef HAS_HTONL
1124 #undef HAS_NTOHS
1125 #undef HAS_NTOHL
1126 #endif
1127 #endif
1128
1129 /*
1130  * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
1131  * -DWS
1132  */
1133 #if BYTEORDER != 0x1234
1134 # define HAS_VTOHL
1135 # define HAS_VTOHS
1136 # define HAS_HTOVL
1137 # define HAS_HTOVS
1138 # if BYTEORDER == 0x4321
1139 #  define vtohl(x)      ((((x)&0xFF)<<24)       \
1140                         +(((x)>>24)&0xFF)       \
1141                         +(((x)&0x0000FF00)<<8)  \
1142                         +(((x)&0x00FF0000)>>8)  )
1143 #  define vtohs(x)      ((((x)&0xFF)<<8) + (((x)>>8)&0xFF))
1144 #  define htovl(x)      vtohl(x)
1145 #  define htovs(x)      vtohs(x)
1146 # endif
1147         /* otherwise default to functions in util.c */
1148 #endif
1149
1150 #ifdef CASTNEGFLOAT
1151 #define U_S(what) ((U16)(what))
1152 #define U_I(what) ((unsigned int)(what))
1153 #define U_L(what) ((U32)(what))
1154 #else
1155 EXTERN_C U32 cast_ulong _((double));
1156 #define U_S(what) ((U16)cast_ulong((double)(what)))
1157 #define U_I(what) ((unsigned int)cast_ulong((double)(what)))
1158 #define U_L(what) (cast_ulong((double)(what)))
1159 #endif
1160
1161 #ifdef CASTI32
1162 #define I_32(what) ((I32)(what))
1163 #define I_V(what) ((IV)(what))
1164 #define U_V(what) ((UV)(what))
1165 #else
1166 START_EXTERN_C
1167 I32 cast_i32 _((double));
1168 IV cast_iv _((double));
1169 UV cast_uv _((double));
1170 END_EXTERN_C
1171 #define I_32(what) (cast_i32((double)(what)))
1172 #define I_V(what) (cast_iv((double)(what)))
1173 #define U_V(what) (cast_uv((double)(what)))
1174 #endif
1175
1176 struct Outrec {
1177     I32         o_lines;
1178     char        *o_str;
1179     U32         o_len;
1180 };
1181
1182 #ifndef MAXSYSFD
1183 #   define MAXSYSFD 2
1184 #endif
1185
1186 #ifndef TMPPATH
1187 #  define TMPPATH "/tmp/perl-eXXXXXX"
1188 #endif
1189
1190 #ifndef __cplusplus
1191 Uid_t getuid _((void));
1192 Uid_t geteuid _((void));
1193 Gid_t getgid _((void));
1194 Gid_t getegid _((void));
1195 #endif
1196
1197 #ifdef DEBUGGING
1198 #ifndef Perl_debug_log
1199 #define Perl_debug_log  PerlIO_stderr()
1200 #endif
1201 #define YYDEBUG 1
1202 #define DEB(a)                          a
1203 #define DEBUG(a)   if (debug)           a
1204 #define DEBUG_p(a) if (debug & 1)       a
1205 #define DEBUG_s(a) if (debug & 2)       a
1206 #define DEBUG_l(a) if (debug & 4)       a
1207 #define DEBUG_t(a) if (debug & 8)       a
1208 #define DEBUG_o(a) if (debug & 16)      a
1209 #define DEBUG_c(a) if (debug & 32)      a
1210 #define DEBUG_P(a) if (debug & 64)      a
1211 #define DEBUG_m(a) if (curinterp && debug & 128)        a
1212 #define DEBUG_f(a) if (debug & 256)     a
1213 #define DEBUG_r(a) if (debug & 512)     a
1214 #define DEBUG_x(a) if (debug & 1024)    a
1215 #define DEBUG_u(a) if (debug & 2048)    a
1216 #define DEBUG_L(a) if (debug & 4096)    a
1217 #define DEBUG_H(a) if (debug & 8192)    a
1218 #define DEBUG_X(a) if (debug & 16384)   a
1219 #define DEBUG_D(a) if (debug & 32768)   a
1220 #else
1221 #define DEB(a)
1222 #define DEBUG(a)
1223 #define DEBUG_p(a)
1224 #define DEBUG_s(a)
1225 #define DEBUG_l(a)
1226 #define DEBUG_t(a)
1227 #define DEBUG_o(a)
1228 #define DEBUG_c(a)
1229 #define DEBUG_P(a)
1230 #define DEBUG_m(a)
1231 #define DEBUG_f(a)
1232 #define DEBUG_r(a)
1233 #define DEBUG_x(a)
1234 #define DEBUG_u(a)
1235 #define DEBUG_L(a)
1236 #define DEBUG_H(a)
1237 #define DEBUG_X(a)
1238 #define DEBUG_D(a)
1239 #endif
1240 #define YYMAXDEPTH 300
1241
1242 #ifndef assert  /* <assert.h> might have been included somehow */
1243 #define assert(what)    DEB( {                                          \
1244         if (!(what)) {                                                  \
1245             croak("Assertion failed: file \"%s\", line %d",             \
1246                 __FILE__, __LINE__);                                    \
1247             exit(1);                                                    \
1248         }})
1249 #endif
1250
1251 struct ufuncs {
1252     I32 (*uf_val)_((IV, SV*));
1253     I32 (*uf_set)_((IV, SV*));
1254     IV uf_index;
1255 };
1256
1257 /* Fix these up for __STDC__ */
1258 #ifndef DONT_DECLARE_STD
1259 char *mktemp _((char*));
1260 double atof _((const char*));
1261 #endif
1262
1263 #ifndef STANDARD_C
1264 /* All of these are in stdlib.h or time.h for ANSI C */
1265 Time_t time();
1266 struct tm *gmtime(), *localtime();
1267 char *strchr(), *strrchr();
1268 char *strcpy(), *strcat();
1269 #endif /* ! STANDARD_C */
1270
1271
1272 #ifdef I_MATH
1273 #    include <math.h>
1274 #else
1275 START_EXTERN_C
1276             double exp _((double));
1277             double log _((double));
1278             double log10 _((double));
1279             double sqrt _((double));
1280             double frexp _((double,int*));
1281             double ldexp _((double,int));
1282             double modf _((double,double*));
1283             double sin _((double));
1284             double cos _((double));
1285             double atan2 _((double,double));
1286             double pow _((double,double));
1287 END_EXTERN_C
1288 #endif
1289
1290 #ifndef __cplusplus
1291 #ifdef __NeXT__ /* or whatever catches all NeXTs */
1292 char *crypt ();       /* Maybe more hosts will need the unprototyped version */
1293 #else
1294 char *crypt _((const char*, const char*));
1295 #endif
1296 #ifndef DONT_DECLARE_STD
1297 #ifndef getenv
1298 char *getenv _((const char*));
1299 #endif
1300 Off_t lseek _((int,Off_t,int));
1301 #endif
1302 char *getlogin _((void));
1303 #endif
1304
1305 #ifdef UNLINK_ALL_VERSIONS /* Currently only makes sense for VMS */
1306 #define UNLINK unlnk
1307 I32 unlnk _((char*));
1308 #else
1309 #define UNLINK unlink
1310 #endif
1311
1312 #ifndef HAS_SETREUID
1313 #  ifdef HAS_SETRESUID
1314 #    define setreuid(r,e) setresuid(r,e,(Uid_t)-1)
1315 #    define HAS_SETREUID
1316 #  endif
1317 #endif
1318 #ifndef HAS_SETREGID
1319 #  ifdef HAS_SETRESGID
1320 #    define setregid(r,e) setresgid(r,e,(Gid_t)-1)
1321 #    define HAS_SETREGID
1322 #  endif
1323 #endif
1324
1325 typedef Signal_t (*Sighandler_t) _((int));
1326
1327 #ifdef HAS_SIGACTION
1328 typedef struct sigaction Sigsave_t;
1329 #else
1330 typedef Sighandler_t Sigsave_t;
1331 #endif
1332
1333 #define SCAN_DEF 0
1334 #define SCAN_TR 1
1335 #define SCAN_REPL 2
1336
1337 #ifdef DEBUGGING
1338 # ifndef register
1339 #  define register
1340 # endif
1341 # define PAD_SV(po) pad_sv(po)
1342 # define RUNOPS_DEFAULT runops_debug
1343 #else
1344 # define PAD_SV(po) curpad[po]
1345 # define RUNOPS_DEFAULT runops_standard
1346 #endif
1347
1348 /*
1349  * These need prototyping here because <proto.h> isn't
1350  * included until after runops is initialised.
1351  */
1352
1353 int runops_standard _((void));
1354 #ifdef DEBUGGING
1355 int runops_debug _((void));
1356 #endif
1357
1358 #define PER_THREAD_MAGICALS "123456789&`'+/.,\\\";^-%=|~:\001\005!@"
1359
1360 /****************/
1361 /* Truly global */
1362 /****************/
1363
1364 /* global state */
1365 EXT PerlInterpreter *   curinterp;      /* currently running interpreter */
1366 #ifdef USE_THREADS
1367 EXT perl_key            thr_key;        /* For per-thread struct thread ptr */
1368 EXT perl_mutex          sv_mutex;       /* Mutex for allocating SVs in sv.c */
1369 EXT perl_mutex          malloc_mutex;   /* Mutex for malloc */
1370 EXT perl_mutex          eval_mutex;     /* Mutex for doeval */
1371 EXT perl_cond           eval_cond;      /* Condition variable for doeval */
1372 EXT struct thread *     eval_owner;     /* Owner thread for doeval */
1373 EXT int                 nthreads;       /* Number of threads currently */
1374 EXT perl_mutex          threads_mutex;  /* Mutex for nthreads and thread list */
1375 EXT perl_cond           nthreads_cond;  /* Condition variable for nthreads */
1376 EXT char *              per_thread_magicals INIT(PER_THREAD_MAGICALS);
1377 #ifdef FAKE_THREADS
1378 EXT struct thread *     thr;            /* Currently executing (fake) thread */
1379 #endif
1380 #endif /* USE_THREADS */
1381
1382 /* VMS doesn't use environ array and NeXT has problems with crt0.o globals */
1383 #if !defined(VMS) && !(defined(NeXT) && defined(__DYNAMIC__))
1384 #if !defined(DONT_DECLARE_STD) || (defined(__svr4__) && defined(__GNUC__) && defined(sun))
1385 extern char **  environ;        /* environment variables supplied via exec */
1386 #endif
1387 #else
1388 #  if defined(NeXT) && defined(__DYNAMIC__)
1389
1390 #  include <mach-o/dyld.h>
1391 EXT char *** environ_pointer;
1392 #  define environ (*environ_pointer)
1393 #  endif
1394 #endif /* environ processing */
1395
1396 EXT int         uid;            /* current real user id */
1397 EXT int         euid;           /* current effective user id */
1398 EXT int         gid;            /* current real group id */
1399 EXT int         egid;           /* current effective group id */
1400 EXT bool        nomemok;        /* let malloc context handle nomem */
1401 EXT U32         an;             /* malloc sequence number */
1402 EXT U32         cop_seqmax;     /* statement sequence number */
1403 EXT U16         op_seqmax;      /* op sequence number */
1404 EXT U32         evalseq;        /* eval sequence number */
1405 EXT U32         sub_generation; /* inc to force methods to be looked up again */
1406 EXT char **     origenviron;
1407 EXT U32         origalen;
1408 EXT HV *        pidstatus;      /* pid-to-status mappings for waitpid */
1409 EXT U32 *       profiledata;
1410 EXT int         maxo INIT(MAXO);/* Number of ops */
1411 EXT char *      osname;         /* operating system */
1412 EXT char *      sh_path INIT(SH_PATH); /* full path of shell */
1413 EXT Sighandler_t        sighandlerp;
1414
1415 EXT XPV*        xiv_arenaroot;  /* list of allocated xiv areas */
1416 EXT IV **       xiv_root;       /* free xiv list--shared by interpreters */
1417 EXT double *    xnv_root;       /* free xnv list--shared by interpreters */
1418 EXT XRV *       xrv_root;       /* free xrv list--shared by interpreters */
1419 EXT XPV *       xpv_root;       /* free xpv list--shared by interpreters */
1420 EXT HE *        he_root;        /* free he list--shared by interpreters */
1421 EXT char *      nice_chunk;     /* a nice chunk of memory to reuse */
1422 EXT U32         nice_chunk_size;/* how nice the chunk of memory is */
1423
1424 /* Stack for currently executing thread--context switch must handle this.     */
1425 EXT SV **       stack_base;     /* stack->array_ary */
1426 EXT SV **       stack_sp;       /* stack pointer now */
1427 EXT SV **       stack_max;      /* stack->array_ary + stack->array_max */
1428
1429 /* likewise for these */
1430
1431 #ifdef OP_IN_REGISTER
1432 EXT OP *        opsave;         /* save current op register across longjmps */
1433 #else
1434 EXT OP *        op;             /* current op--when not in a global register */
1435 #endif
1436 EXT int         (*runops) _((void)) INIT(RUNOPS_DEFAULT);
1437 EXT I32 *       scopestack;     /* blocks we've entered */
1438 EXT I32         scopestack_ix;
1439 EXT I32         scopestack_max;
1440
1441 EXT ANY*        savestack;      /* to save non-local values on */
1442 EXT I32         savestack_ix;
1443 EXT I32         savestack_max;
1444
1445 EXT OP **       retstack;       /* returns we've pushed */
1446 EXT I32         retstack_ix;
1447 EXT I32         retstack_max;
1448
1449 EXT I32 *       markstack;      /* stackmarks we're remembering */
1450 EXT I32 *       markstack_ptr;  /* stackmarks we're remembering */
1451 EXT I32 *       markstack_max;  /* stackmarks we're remembering */
1452
1453 EXT SV **       curpad;
1454
1455 /* temp space */
1456 EXT SV *        Sv;
1457 EXT XPV *       Xpv;
1458 EXT char        tokenbuf[256];
1459 EXT struct stat statbuf;
1460 #ifdef HAS_TIMES
1461 EXT struct tms  timesbuf;
1462 #endif
1463 EXT STRLEN na;          /* for use in SvPV when length is Not Applicable */
1464
1465 /* for tmp use in stupid debuggers */
1466 EXT int *       di;
1467 EXT short *     ds;
1468 EXT char *      dc;
1469
1470 /* handy constants */
1471 EXTCONST char * Yes INIT("1");
1472 EXTCONST char * No INIT("");
1473 EXTCONST char * hexdigit INIT("0123456789abcdef0123456789ABCDEFx");
1474 EXTCONST char * patleave INIT("\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}");
1475 EXTCONST char * vert INIT("|");
1476
1477 EXTCONST char warn_uninit[]
1478   INIT("Use of uninitialized value");
1479 EXTCONST char warn_nosemi[]
1480   INIT("Semicolon seems to be missing");
1481 EXTCONST char warn_reserved[]
1482   INIT("Unquoted string \"%s\" may clash with future reserved word");
1483 EXTCONST char warn_nl[]
1484   INIT("Unsuccessful %s on filename containing newline");
1485 EXTCONST char no_wrongref[]
1486   INIT("Can't use %s ref as %s ref");
1487 EXTCONST char no_symref[]
1488   INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
1489 EXTCONST char no_usym[]
1490   INIT("Can't use an undefined value as %s reference");
1491 EXTCONST char no_aelem[]
1492   INIT("Modification of non-creatable array value attempted, subscript %d");
1493 EXTCONST char no_helem[]
1494   INIT("Modification of non-creatable hash value attempted, subscript \"%s\"");
1495 EXTCONST char no_modify[]
1496   INIT("Modification of a read-only value attempted");
1497 EXTCONST char no_mem[]
1498   INIT("Out of memory!\n");
1499 EXTCONST char no_security[]
1500   INIT("Insecure dependency in %s%s");
1501 EXTCONST char no_sock_func[]
1502   INIT("Unsupported socket function \"%s\" called");
1503 EXTCONST char no_dir_func[]
1504   INIT("Unsupported directory function \"%s\" called");
1505 EXTCONST char no_func[]
1506   INIT("The %s function is unimplemented");
1507 EXTCONST char no_myglob[]
1508   INIT("\"my\" variable %s can't be in a package");
1509
1510 EXT SV          sv_undef;
1511 EXT SV          sv_no;
1512 EXT SV          sv_yes;
1513 #ifdef CSH
1514     EXT char *  cshname INIT(CSH);
1515     EXT I32     cshlen;
1516 #endif
1517
1518 #ifdef DOINIT
1519 EXT char *sig_name[] = { SIG_NAME };
1520 EXT int   sig_num[]  = { SIG_NUM };
1521 EXT SV  * psig_ptr[sizeof(sig_num)/sizeof(*sig_num)];
1522 EXT SV  * psig_name[sizeof(sig_num)/sizeof(*sig_num)];
1523 #else
1524 EXT char *sig_name[];
1525 EXT int   sig_num[];
1526 EXT SV  * psig_ptr[];
1527 EXT SV  * psig_name[];
1528 #endif
1529
1530 /* fast case folding tables */
1531
1532 #ifdef DOINIT
1533 EXTCONST  unsigned char fold[] = {
1534         0,      1,      2,      3,      4,      5,      6,      7,
1535         8,      9,      10,     11,     12,     13,     14,     15,
1536         16,     17,     18,     19,     20,     21,     22,     23,
1537         24,     25,     26,     27,     28,     29,     30,     31,
1538         32,     33,     34,     35,     36,     37,     38,     39,
1539         40,     41,     42,     43,     44,     45,     46,     47,
1540         48,     49,     50,     51,     52,     53,     54,     55,
1541         56,     57,     58,     59,     60,     61,     62,     63,
1542         64,     'a',    'b',    'c',    'd',    'e',    'f',    'g',
1543         'h',    'i',    'j',    'k',    'l',    'm',    'n',    'o',
1544         'p',    'q',    'r',    's',    't',    'u',    'v',    'w',
1545         'x',    'y',    'z',    91,     92,     93,     94,     95,
1546         96,     'A',    'B',    'C',    'D',    'E',    'F',    'G',
1547         'H',    'I',    'J',    'K',    'L',    'M',    'N',    'O',
1548         'P',    'Q',    'R',    'S',    'T',    'U',    'V',    'W',
1549         'X',    'Y',    'Z',    123,    124,    125,    126,    127,
1550         128,    129,    130,    131,    132,    133,    134,    135,
1551         136,    137,    138,    139,    140,    141,    142,    143,
1552         144,    145,    146,    147,    148,    149,    150,    151,
1553         152,    153,    154,    155,    156,    157,    158,    159,
1554         160,    161,    162,    163,    164,    165,    166,    167,
1555         168,    169,    170,    171,    172,    173,    174,    175,
1556         176,    177,    178,    179,    180,    181,    182,    183,
1557         184,    185,    186,    187,    188,    189,    190,    191,
1558         192,    193,    194,    195,    196,    197,    198,    199,
1559         200,    201,    202,    203,    204,    205,    206,    207,
1560         208,    209,    210,    211,    212,    213,    214,    215,
1561         216,    217,    218,    219,    220,    221,    222,    223,    
1562         224,    225,    226,    227,    228,    229,    230,    231,
1563         232,    233,    234,    235,    236,    237,    238,    239,
1564         240,    241,    242,    243,    244,    245,    246,    247,
1565         248,    249,    250,    251,    252,    253,    254,    255
1566 };
1567 #else
1568 EXTCONST unsigned char fold[];
1569 #endif
1570
1571 #ifdef DOINIT
1572 EXT unsigned char fold_locale[] = {
1573         0,      1,      2,      3,      4,      5,      6,      7,
1574         8,      9,      10,     11,     12,     13,     14,     15,
1575         16,     17,     18,     19,     20,     21,     22,     23,
1576         24,     25,     26,     27,     28,     29,     30,     31,
1577         32,     33,     34,     35,     36,     37,     38,     39,
1578         40,     41,     42,     43,     44,     45,     46,     47,
1579         48,     49,     50,     51,     52,     53,     54,     55,
1580         56,     57,     58,     59,     60,     61,     62,     63,
1581         64,     'a',    'b',    'c',    'd',    'e',    'f',    'g',
1582         'h',    'i',    'j',    'k',    'l',    'm',    'n',    'o',
1583         'p',    'q',    'r',    's',    't',    'u',    'v',    'w',
1584         'x',    'y',    'z',    91,     92,     93,     94,     95,
1585         96,     'A',    'B',    'C',    'D',    'E',    'F',    'G',
1586         'H',    'I',    'J',    'K',    'L',    'M',    'N',    'O',
1587         'P',    'Q',    'R',    'S',    'T',    'U',    'V',    'W',
1588         'X',    'Y',    'Z',    123,    124,    125,    126,    127,
1589         128,    129,    130,    131,    132,    133,    134,    135,
1590         136,    137,    138,    139,    140,    141,    142,    143,
1591         144,    145,    146,    147,    148,    149,    150,    151,
1592         152,    153,    154,    155,    156,    157,    158,    159,
1593         160,    161,    162,    163,    164,    165,    166,    167,
1594         168,    169,    170,    171,    172,    173,    174,    175,
1595         176,    177,    178,    179,    180,    181,    182,    183,
1596         184,    185,    186,    187,    188,    189,    190,    191,
1597         192,    193,    194,    195,    196,    197,    198,    199,
1598         200,    201,    202,    203,    204,    205,    206,    207,
1599         208,    209,    210,    211,    212,    213,    214,    215,
1600         216,    217,    218,    219,    220,    221,    222,    223,    
1601         224,    225,    226,    227,    228,    229,    230,    231,
1602         232,    233,    234,    235,    236,    237,    238,    239,
1603         240,    241,    242,    243,    244,    245,    246,    247,
1604         248,    249,    250,    251,    252,    253,    254,    255
1605 };
1606 #else
1607 EXT unsigned char fold_locale[];
1608 #endif
1609
1610 #ifdef DOINIT
1611 EXTCONST unsigned char freq[] = {       /* letter frequencies for mixed English/C */
1612         1,      2,      84,     151,    154,    155,    156,    157,
1613         165,    246,    250,    3,      158,    7,      18,     29,
1614         40,     51,     62,     73,     85,     96,     107,    118,
1615         129,    140,    147,    148,    149,    150,    152,    153,
1616         255,    182,    224,    205,    174,    176,    180,    217,
1617         233,    232,    236,    187,    235,    228,    234,    226,
1618         222,    219,    211,    195,    188,    193,    185,    184,
1619         191,    183,    201,    229,    181,    220,    194,    162,
1620         163,    208,    186,    202,    200,    218,    198,    179,
1621         178,    214,    166,    170,    207,    199,    209,    206,
1622         204,    160,    212,    216,    215,    192,    175,    173,
1623         243,    172,    161,    190,    203,    189,    164,    230,
1624         167,    248,    227,    244,    242,    255,    241,    231,
1625         240,    253,    169,    210,    245,    237,    249,    247,
1626         239,    168,    252,    251,    254,    238,    223,    221,
1627         213,    225,    177,    197,    171,    196,    159,    4,
1628         5,      6,      8,      9,      10,     11,     12,     13,
1629         14,     15,     16,     17,     19,     20,     21,     22,
1630         23,     24,     25,     26,     27,     28,     30,     31,
1631         32,     33,     34,     35,     36,     37,     38,     39,
1632         41,     42,     43,     44,     45,     46,     47,     48,
1633         49,     50,     52,     53,     54,     55,     56,     57,
1634         58,     59,     60,     61,     63,     64,     65,     66,
1635         67,     68,     69,     70,     71,     72,     74,     75,
1636         76,     77,     78,     79,     80,     81,     82,     83,
1637         86,     87,     88,     89,     90,     91,     92,     93,
1638         94,     95,     97,     98,     99,     100,    101,    102,
1639         103,    104,    105,    106,    108,    109,    110,    111,
1640         112,    113,    114,    115,    116,    117,    119,    120,
1641         121,    122,    123,    124,    125,    126,    127,    128,
1642         130,    131,    132,    133,    134,    135,    136,    137,
1643         138,    139,    141,    142,    143,    144,    145,    146
1644 };
1645 #else
1646 EXTCONST unsigned char freq[];
1647 #endif
1648
1649 #ifdef DEBUGGING
1650 #ifdef DOINIT
1651 EXTCONST char* block_type[] = {
1652         "NULL",
1653         "SUB",
1654         "EVAL",
1655         "LOOP",
1656         "SUBST",
1657         "BLOCK",
1658 };
1659 #else
1660 EXTCONST char* block_type[];
1661 #endif
1662 #endif
1663
1664 /*****************************************************************************/
1665 /* This lexer/parser stuff is currently global since yacc is hard to reenter */
1666 /*****************************************************************************/
1667 /* XXX This needs to be revisited, since BEGIN makes yacc re-enter... */
1668
1669 #include "perly.h"
1670
1671 #define LEX_NOTPARSING          11      /* borrowed from toke.c */
1672
1673 typedef enum {
1674     XOPERATOR,
1675     XTERM,
1676     XREF,
1677     XSTATE,
1678     XBLOCK,
1679     XTERMBLOCK
1680 } expectation;
1681
1682 EXT U32         lex_state;      /* next token is determined */
1683 EXT U32         lex_defer;      /* state after determined token */
1684 EXT expectation lex_expect;     /* expect after determined token */
1685 EXT I32         lex_brackets;   /* bracket count */
1686 EXT I32         lex_formbrack;  /* bracket count at outer format level */
1687 EXT I32         lex_fakebrack;  /* outer bracket is mere delimiter */
1688 EXT I32         lex_casemods;   /* casemod count */
1689 EXT I32         lex_dojoin;     /* doing an array interpolation */
1690 EXT I32         lex_starts;     /* how many interps done on level */
1691 EXT SV *        lex_stuff;      /* runtime pattern from m// or s/// */
1692 EXT SV *        lex_repl;       /* runtime replacement from s/// */
1693 EXT OP *        lex_op;         /* extra info to pass back on op */
1694 EXT OP *        lex_inpat;      /* in pattern $) and $| are special */
1695 EXT I32         lex_inwhat;     /* what kind of quoting are we in */
1696 EXT char *      lex_brackstack; /* what kind of brackets to pop */
1697 EXT char *      lex_casestack;  /* what kind of case mods in effect */
1698
1699 /* What we know when we're in LEX_KNOWNEXT state. */
1700 EXT YYSTYPE     nextval[5];     /* value of next token, if any */
1701 EXT I32         nexttype[5];    /* type of next token */
1702 EXT I32         nexttoke;
1703
1704 EXT PerlIO * VOL        rsfp INIT(Nullfp);
1705 EXT SV *        linestr;
1706 EXT char *      bufptr;
1707 EXT char *      oldbufptr;
1708 EXT char *      oldoldbufptr;
1709 EXT char *      bufend;
1710 EXT expectation expect INIT(XSTATE);    /* how to interpret ambiguous tokens */
1711 EXT AV *        rsfp_filters;
1712
1713 EXT I32         multi_start;    /* 1st line of multi-line string */
1714 EXT I32         multi_end;      /* last line of multi-line string */
1715 EXT I32         multi_open;     /* delimiter of said string */
1716 EXT I32         multi_close;    /* delimiter of said string */
1717
1718 EXT GV *        scrgv;
1719 EXT I32         error_count;    /* how many errors so far, max 10 */
1720 EXT I32         subline;        /* line this subroutine began on */
1721 EXT SV *        subname;        /* name of current subroutine */
1722
1723 EXT CV *        compcv;         /* currently compiling subroutine */
1724 EXT AV *        comppad;        /* storage for lexically scoped temporaries */
1725 EXT AV *        comppad_name;   /* variable names for "my" variables */
1726 EXT I32         comppad_name_fill;/* last "introduced" variable offset */
1727 EXT I32         comppad_name_floor;/* start of vars in innermost block */
1728 EXT I32         min_intro_pending;/* start of vars to introduce */
1729 EXT I32         max_intro_pending;/* end of vars to introduce */
1730 EXT I32         padix;          /* max used index in current "register" pad */
1731 EXT I32         padix_floor;    /* how low may inner block reset padix */
1732 EXT I32         pad_reset_pending; /* reset pad on next attempted alloc */
1733 EXT COP         compiling;
1734
1735 EXT I32         thisexpr;       /* name id for nothing_in_common() */
1736 EXT char *      last_uni;       /* position of last named-unary operator */
1737 EXT char *      last_lop;       /* position of last list operator */
1738 EXT OPCODE      last_lop_op;    /* last list operator */
1739 EXT bool        in_my;          /* we're compiling a "my" declaration */
1740 EXT HV *        in_my_stash;    /* declared class of this "my" declaration */
1741 #ifdef FCRYPT
1742 EXT I32         cryptseen;      /* has fast crypt() been initialized? */
1743 #endif
1744
1745 EXT U32         hints;          /* various compilation flags */
1746
1747                                 /* Note: the lowest 8 bits are reserved for
1748                                    stuffing into op->op_private */
1749 #define HINT_INTEGER            0x00000001
1750 #define HINT_STRICT_REFS        0x00000002
1751
1752 #define HINT_BLOCK_SCOPE        0x00000100
1753 #define HINT_STRICT_SUBS        0x00000200
1754 #define HINT_STRICT_VARS        0x00000400
1755 #define HINT_LOCALE             0x00000800
1756
1757 /**************************************************************************/
1758 /* This regexp stuff is global since it always happens within 1 expr eval */
1759 /**************************************************************************/
1760
1761 EXT char *      regprecomp;     /* uncompiled string. */
1762 EXT char *      regparse;       /* Input-scan pointer. */
1763 EXT char *      regxend;        /* End of input for compile */
1764 EXT I32         regnpar;        /* () count. */
1765 EXT char *      regcode;        /* Code-emit pointer; &regdummy = don't. */
1766 EXT I32         regsize;        /* Code size. */
1767 EXT I32         regnaughty;     /* How bad is this pattern? */
1768 EXT I32         regsawback;     /* Did we see \1, ...? */
1769
1770 EXT char *      reginput;       /* String-input pointer. */
1771 EXT char *      regbol;         /* Beginning of input, for ^ check. */
1772 EXT char *      regeol;         /* End of input, for $ check. */
1773 EXT char **     regstartp;      /* Pointer to startp array. */
1774 EXT char **     regendp;        /* Ditto for endp. */
1775 EXT U32 *       reglastparen;   /* Similarly for lastparen. */
1776 EXT char *      regtill;        /* How far we are required to go. */
1777 EXT U16         regflags;       /* are we folding, multilining? */
1778 EXT char        regprev;        /* char before regbol, \n if none */
1779
1780 EXT bool        do_undump;      /* -u or dump seen? */
1781 EXT VOL U32     debug;
1782
1783 /***********************************************/
1784 /* Global only to current interpreter instance */
1785 /***********************************************/
1786
1787 #ifdef MULTIPLICITY
1788 #define IEXT
1789 #define IINIT(x)
1790 struct interpreter {
1791 #else
1792 #define IEXT EXT
1793 #define IINIT(x) INIT(x)
1794 #endif
1795
1796 /* pseudo environmental stuff */
1797 IEXT int        Iorigargc;
1798 IEXT char **    Iorigargv;
1799 IEXT GV *       Ienvgv;
1800 IEXT GV *       Isiggv;
1801 IEXT GV *       Iincgv;
1802 IEXT char *     Iorigfilename;
1803 IEXT SV *       Idiehook;
1804 IEXT SV *       Iwarnhook;
1805 IEXT SV *       Iparsehook;
1806
1807 /* Various states of an input record separator SV (rs, nrs) */
1808 #define RsSNARF(sv)   (! SvOK(sv))
1809 #define RsSIMPLE(sv)  (SvOK(sv) && SvCUR(sv))
1810 #define RsPARA(sv)    (SvOK(sv) && ! SvCUR(sv))
1811
1812 /* switches */
1813 IEXT char *     Icddir;
1814 IEXT bool       Iminus_c;
1815 IEXT char       Ipatchlevel[10];
1816 IEXT char **    Ilocalpatches;
1817 IEXT SV *       Inrs;
1818 IEXT char *     Isplitstr IINIT(" ");
1819 IEXT bool       Ipreprocess;
1820 IEXT bool       Iminus_n;
1821 IEXT bool       Iminus_p;
1822 IEXT bool       Iminus_l;
1823 IEXT bool       Iminus_a;
1824 IEXT bool       Iminus_F;
1825 IEXT bool       Idoswitches;
1826 IEXT bool       Idowarn;
1827 IEXT bool       Idoextract;
1828 IEXT bool       Isawampersand;  /* must save all match strings */
1829 IEXT bool       Isawstudy;      /* do fbm_instr on all strings */
1830 IEXT bool       Isawvec;
1831 IEXT bool       Iunsafe;
1832 IEXT char *     Iinplace;
1833 IEXT char *     Ie_tmpname;
1834 IEXT PerlIO *   Ie_fp;
1835 IEXT U32        Iperldb;
1836         /* This value may be raised by extensions for testing purposes */
1837 IEXT int        Iperl_destruct_level IINIT(0);  /* 0=none, 1=full, 2=full with checks */
1838
1839 /* magical thingies */
1840 IEXT Time_t     Ibasetime;              /* $^T */
1841 IEXT SV *       Iformfeed;              /* $^L */
1842 IEXT char *     Ichopset IINIT(" \n-"); /* $: */
1843 IEXT SV *       Irs;                    /* $/ */
1844 IEXT char *     Iofs;                   /* $, */
1845 IEXT STRLEN     Iofslen;
1846 IEXT char *     Iors;                   /* $\ */
1847 IEXT STRLEN     Iorslen;
1848 IEXT char *     Iofmt;                  /* $# */
1849 IEXT I32        Imaxsysfd IINIT(MAXSYSFD); /* top fd to pass to subprocesses */
1850 IEXT int        Imultiline;             /* $*--do strings hold >1 line? */
1851 IEXT I32        Istatusvalue;           /* $? */
1852 #ifdef VMS
1853 IEXT U32        Istatusvalue_vms;
1854 #endif
1855
1856 IEXT struct stat Istatcache;            /* _ */
1857 IEXT GV *       Istatgv;
1858 IEXT SV *       Istatname IINIT(Nullsv);
1859
1860 /* shortcuts to various I/O objects */
1861 IEXT GV *       Istdingv;
1862 IEXT GV *       Ilast_in_gv;
1863 IEXT GV *       Idefgv;
1864 IEXT GV *       Iargvgv;
1865 IEXT GV *       Idefoutgv;
1866 IEXT GV *       Iargvoutgv;
1867
1868 /* shortcuts to regexp stuff */
1869 IEXT GV *       Ileftgv;
1870 IEXT GV *       Iampergv;
1871 IEXT GV *       Irightgv;
1872 IEXT PMOP *     Icurpm;         /* what to do \ interps from */
1873 IEXT I32 *      Iscreamfirst;
1874 IEXT I32 *      Iscreamnext;
1875 IEXT I32        Imaxscream IINIT(-1);
1876 IEXT SV *       Ilastscream;
1877
1878 /* shortcuts to misc objects */
1879 IEXT GV *       Ierrgv;
1880
1881 /* shortcuts to debugging objects */
1882 IEXT GV *       IDBgv;
1883 IEXT GV *       IDBline;
1884 IEXT GV *       IDBsub;
1885 IEXT SV *       IDBsingle;
1886 IEXT SV *       IDBtrace;
1887 IEXT SV *       IDBsignal;
1888 IEXT AV *       Ilineary;       /* lines of script for debugger */
1889 IEXT AV *       Idbargs;        /* args to call listed by caller function */
1890
1891 /* symbol tables */
1892 IEXT HV *       Idefstash;      /* main symbol table */
1893 IEXT HV *       Icurstash;      /* symbol table for current package */
1894 IEXT HV *       Idebstash;      /* symbol table for perldb package */
1895 IEXT HV *       Iglobalstash;   /* global keyword overrides imported here */
1896 IEXT SV *       Icurstname;     /* name of current package */
1897 IEXT AV *       Ibeginav;       /* names of BEGIN subroutines */
1898 IEXT AV *       Iendav;         /* names of END subroutines */
1899 IEXT AV *       Iinitav;        /* names of INIT subroutines */
1900 IEXT HV *       Istrtab;        /* shared string table */
1901
1902 /* memory management */
1903 IEXT SV **      Itmps_stack;
1904 IEXT I32        Itmps_ix IINIT(-1);
1905 IEXT I32        Itmps_floor IINIT(-1);
1906 IEXT I32        Itmps_max;
1907 IEXT I32        Isv_count;      /* how many SV* are currently allocated */
1908 IEXT I32        Isv_objcount;   /* how many objects are currently allocated */
1909 IEXT SV*        Isv_root;       /* storage for SVs belonging to interp */
1910 IEXT SV*        Isv_arenaroot;  /* list of areas for garbage collection */
1911
1912 /* funky return mechanisms */
1913 IEXT I32        Ilastspbase;
1914 IEXT I32        Ilastsize;
1915 IEXT int        Iforkprocess;   /* so do_open |- can return proc# */
1916
1917 /* subprocess state */
1918 IEXT AV *       Ifdpid;         /* keep fd-to-pid mappings for my_popen */
1919
1920 /* internal state */
1921 IEXT VOL int    Iin_eval;       /* trap "fatal" errors? */
1922 IEXT OP *       Irestartop;     /* Are we propagating an error from croak? */
1923 IEXT int        Idelaymagic;    /* ($<,$>) = ... */
1924 IEXT bool       Idirty;         /* In the middle of tearing things down? */
1925 IEXT U8         Ilocalizing;    /* are we processing a local() list? */
1926 IEXT bool       Itainted;       /* using variables controlled by $< */
1927 IEXT bool       Itainting;      /* doing taint checks */
1928 IEXT char *     Iop_mask IINIT(NULL);   /* masked operations for safe evals */
1929
1930 /* trace state */
1931 IEXT I32        Idlevel;
1932 IEXT I32        Idlmax IINIT(128);
1933 IEXT char *     Idebname;
1934 IEXT char *     Idebdelim;
1935
1936 /* current interpreter roots */
1937 IEXT CV *       Imain_cv;
1938 IEXT OP *       Imain_root;
1939 IEXT OP *       Imain_start;
1940 IEXT OP *       Ieval_root;
1941 IEXT OP *       Ieval_start;
1942
1943 /* runtime control stuff */
1944 IEXT COP * VOL  Icurcop IINIT(&compiling);
1945 IEXT COP *      Icurcopdb IINIT(NULL);
1946 IEXT line_t     Icopline IINIT(NOLINE);
1947 IEXT PERL_CONTEXT *     Icxstack;
1948 IEXT I32        Icxstack_ix IINIT(-1);
1949 IEXT I32        Icxstack_max IINIT(128);
1950 IEXT JMPENV     Istart_env;     /* empty startup sigjmp() environment */
1951 IEXT JMPENV *   Itop_env;       /* ptr. to current sigjmp() environment */
1952
1953 /* stack stuff */
1954 IEXT AV *       Icurstack;              /* THE STACK */
1955 IEXT AV *       Imainstack;     /* the stack when nothing funny is happening */
1956
1957 /* format accumulators */
1958 IEXT SV *       Iformtarget;
1959 IEXT SV *       Ibodytarget;
1960 IEXT SV *       Itoptarget;
1961
1962 /* statics moved here for shared library purposes */
1963 IEXT SV         Istrchop;       /* return value from chop */
1964 IEXT int        Ifilemode;      /* so nextargv() can preserve mode */
1965 IEXT int        Ilastfd;        /* what to preserve mode on */
1966 IEXT char *     Ioldname;       /* what to preserve mode on */
1967 IEXT char **    IArgv;          /* stuff to free from do_aexec, vfork safe */
1968 IEXT char *     ICmd;           /* stuff to free from do_aexec, vfork safe */
1969 IEXT OP *       Isortcop;       /* user defined sort routine */
1970 IEXT HV *       Isortstash;     /* which is in some package or other */
1971 IEXT GV *       Ifirstgv;       /* $a */
1972 IEXT GV *       Isecondgv;      /* $b */
1973 IEXT AV *       Isortstack;     /* temp stack during pp_sort() */
1974 IEXT AV *       Isignalstack;   /* temp stack during sighandler() */
1975 IEXT SV *       Imystrk;        /* temp key string for do_each() */
1976 IEXT I32        Idumplvl;       /* indentation level on syntax tree dump */
1977 IEXT PMOP *     Ioldlastpm;     /* for saving regexp context during debugger */
1978 IEXT I32        Igensym;        /* next symbol for getsym() to define */
1979 IEXT bool       Ipreambled;
1980 IEXT AV *       Ipreambleav;
1981 IEXT int        Ilaststatval IINIT(-1);
1982 IEXT I32        Ilaststype IINIT(OP_STAT);
1983 IEXT SV *       Imess_sv;
1984
1985 #ifdef USE_THREADS
1986 /* threads stuff */
1987 IEXT SV *       Ithrsv;         /* holds struct thread for main thread */
1988 #endif /* USE_THREADS */
1989
1990 #undef IEXT
1991 #undef IINIT
1992
1993 #ifdef MULTIPLICITY
1994 };
1995 #else
1996 struct interpreter {
1997     char broiled;
1998 };
1999 #endif
2000
2001 #include "thread.h"
2002 #include "pp.h"
2003
2004 START_EXTERN_C
2005 #include "proto.h"
2006
2007 #ifdef EMBED
2008 #define Perl_sv_setptrobj(rv,ptr,name) Perl_sv_setref_iv(rv,name,(IV)ptr)
2009 #define Perl_sv_setptrref(rv,ptr) Perl_sv_setref_iv(rv,Nullch,(IV)ptr)
2010 #else
2011 #define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,(IV)ptr)
2012 #define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,(IV)ptr)
2013 #endif
2014
2015 END_EXTERN_C
2016
2017 /* The following must follow proto.h */
2018
2019 #ifdef DOINIT
2020
2021 EXT MGVTBL vtbl_sv =    {magic_get,
2022                                 magic_set,
2023                                         magic_len,
2024                                                 0,      0};
2025 EXT MGVTBL vtbl_env =   {0,     magic_set_all_env,
2026                                 0,      magic_clear_all_env,
2027                                                         0};
2028 EXT MGVTBL vtbl_envelem =       {0,     magic_setenv,
2029                                         0,      magic_clearenv,
2030                                                         0};
2031 EXT MGVTBL vtbl_sig =   {0,     0,               0, 0, 0};
2032 EXT MGVTBL vtbl_sigelem =       {magic_getsig,
2033                                         magic_setsig,
2034                                         0,      magic_clearsig,
2035                                                         0};
2036 EXT MGVTBL vtbl_pack =  {0,     0,      0,      magic_wipepack,
2037                                                         0};
2038 EXT MGVTBL vtbl_packelem =      {magic_getpack,
2039                                 magic_setpack,
2040                                         0,      magic_clearpack,
2041                                                         0};
2042 EXT MGVTBL vtbl_dbline =        {0,     magic_setdbline,
2043                                         0,      0,      0};
2044 EXT MGVTBL vtbl_isa =   {0,     magic_setisa,
2045                                         0,      magic_setisa,
2046                                                         0};
2047 EXT MGVTBL vtbl_isaelem =       {0,     magic_setisa,
2048                                         0,      0,      0};
2049 EXT MGVTBL vtbl_arylen =        {magic_getarylen,
2050                                 magic_setarylen,
2051                                         0,      0,      0};
2052 EXT MGVTBL vtbl_glob =  {magic_getglob,
2053                                 magic_setglob,
2054                                         0,      0,      0};
2055 EXT MGVTBL vtbl_mglob = {0,     magic_setmglob,
2056                                         0,      0,      0};
2057 EXT MGVTBL vtbl_nkeys = {0,     magic_setnkeys,
2058                                         0,      0,      0};
2059 EXT MGVTBL vtbl_taint = {magic_gettaint,magic_settaint,
2060                                         0,      0,      0};
2061 EXT MGVTBL vtbl_substr =        {0,     magic_setsubstr,
2062                                         0,      0,      0};
2063 EXT MGVTBL vtbl_vec =   {0,     magic_setvec,
2064                                         0,      0,      0};
2065 EXT MGVTBL vtbl_pos =   {magic_getpos,
2066                                 magic_setpos,
2067                                         0,      0,      0};
2068 EXT MGVTBL vtbl_bm =    {0,     magic_setbm,
2069                                         0,      0,      0};
2070 EXT MGVTBL vtbl_fm =    {0,     magic_setfm,
2071                                         0,      0,      0};
2072 EXT MGVTBL vtbl_uvar =  {magic_getuvar,
2073                                 magic_setuvar,
2074                                         0,      0,      0};
2075 #ifdef USE_THREADS
2076 EXT MGVTBL vtbl_mutex = {0,     0,      0,      0,      magic_mutexfree};
2077 #endif /* USE_THREADS */
2078 EXT MGVTBL vtbl_defelem = {magic_getdefelem,magic_setdefelem,
2079                                         0,      0,      magic_freedefelem};
2080
2081 #ifdef USE_LOCALE_COLLATE
2082 EXT MGVTBL vtbl_collxfrm = {0,
2083                                 magic_setcollxfrm,
2084                                         0,      0,      0};
2085 #endif
2086
2087 #ifdef OVERLOAD
2088 EXT MGVTBL vtbl_amagic =       {0,     magic_setamagic,
2089                                         0,      0,      magic_setamagic};
2090 EXT MGVTBL vtbl_amagicelem =   {0,     magic_setamagic,
2091                                         0,      0,      magic_setamagic};
2092 #endif /* OVERLOAD */
2093
2094 #else /* !DOINIT */
2095
2096 EXT MGVTBL vtbl_sv;
2097 EXT MGVTBL vtbl_env;
2098 EXT MGVTBL vtbl_envelem;
2099 EXT MGVTBL vtbl_sig;
2100 EXT MGVTBL vtbl_sigelem;
2101 EXT MGVTBL vtbl_pack;
2102 EXT MGVTBL vtbl_packelem;
2103 EXT MGVTBL vtbl_dbline;
2104 EXT MGVTBL vtbl_isa;
2105 EXT MGVTBL vtbl_isaelem;
2106 EXT MGVTBL vtbl_arylen;
2107 EXT MGVTBL vtbl_glob;
2108 EXT MGVTBL vtbl_mglob;
2109 EXT MGVTBL vtbl_nkeys;
2110 EXT MGVTBL vtbl_taint;
2111 EXT MGVTBL vtbl_substr;
2112 EXT MGVTBL vtbl_vec;
2113 EXT MGVTBL vtbl_pos;
2114 EXT MGVTBL vtbl_bm;
2115 EXT MGVTBL vtbl_fm;
2116 EXT MGVTBL vtbl_uvar;
2117
2118 #ifdef USE_THREADS
2119 EXT MGVTBL vtbl_mutex;
2120 #endif /* USE_THREADS */
2121
2122 EXT MGVTBL vtbl_defelem;
2123
2124 #ifdef USE_LOCALE_COLLATE
2125 EXT MGVTBL vtbl_collxfrm;
2126 #endif
2127
2128 #ifdef OVERLOAD
2129 EXT MGVTBL vtbl_amagic;
2130 EXT MGVTBL vtbl_amagicelem;
2131 #endif /* OVERLOAD */
2132
2133 #endif /* !DOINIT */
2134
2135 #ifdef OVERLOAD
2136
2137 EXT long amagic_generation;
2138
2139 #define NofAMmeth 58
2140 #ifdef DOINIT
2141 EXTCONST char * AMG_names[NofAMmeth] = {
2142   "fallback",   "abs",                  /* "fallback" should be the first. */
2143   "bool",       "nomethod",
2144   "\"\"",       "0+",
2145   "+",          "+=",
2146   "-",          "-=",
2147   "*",          "*=",
2148   "/",          "/=",
2149   "%",          "%=",
2150   "**",         "**=",
2151   "<<",         "<<=",
2152   ">>",         ">>=",
2153   "&",          "&=",
2154   "|",          "|=",
2155   "^",          "^=",
2156   "<",          "<=",
2157   ">",          ">=",
2158   "==",         "!=",
2159   "<=>",        "cmp",
2160   "lt",         "le",
2161   "gt",         "ge",
2162   "eq",         "ne",
2163   "!",          "~",
2164   "++",         "--",
2165   "atan2",      "cos",
2166   "sin",        "exp",
2167   "log",        "sqrt",
2168   "x",          "x=",
2169   ".",          ".=",
2170   "=",          "neg"
2171 };
2172 #else
2173 EXTCONST char * AMG_names[NofAMmeth];
2174 #endif /* def INITAMAGIC */
2175
2176 struct am_table {
2177   long was_ok_sub;
2178   long was_ok_am;
2179   U32 flags;
2180   CV* table[NofAMmeth];
2181   long fallback;
2182 };
2183 struct am_table_short {
2184   long was_ok_sub;
2185   long was_ok_am;
2186   U32 flags;
2187 };
2188 typedef struct am_table AMT;
2189 typedef struct am_table_short AMTS;
2190
2191 #define AMGfallNEVER    1
2192 #define AMGfallNO       2
2193 #define AMGfallYES      3
2194
2195 #define AMTf_AMAGIC             1
2196 #define AMT_AMAGIC(amt)         ((amt)->flags & AMTf_AMAGIC)
2197 #define AMT_AMAGIC_on(amt)      ((amt)->flags |= AMTf_AMAGIC)
2198 #define AMT_AMAGIC_off(amt)     ((amt)->flags &= ~AMTf_AMAGIC)
2199
2200 enum {
2201   fallback_amg, abs_amg,
2202   bool__amg,    nomethod_amg,
2203   string_amg,   numer_amg,
2204   add_amg,      add_ass_amg,
2205   subtr_amg,    subtr_ass_amg,
2206   mult_amg,     mult_ass_amg,
2207   div_amg,      div_ass_amg,
2208   mod_amg,      mod_ass_amg,
2209   pow_amg,      pow_ass_amg,
2210   lshift_amg,   lshift_ass_amg,
2211   rshift_amg,   rshift_ass_amg,
2212   band_amg,     band_ass_amg,
2213   bor_amg,      bor_ass_amg,
2214   bxor_amg,     bxor_ass_amg,
2215   lt_amg,       le_amg,
2216   gt_amg,       ge_amg,
2217   eq_amg,       ne_amg,
2218   ncmp_amg,     scmp_amg,
2219   slt_amg,      sle_amg,
2220   sgt_amg,      sge_amg,
2221   seq_amg,      sne_amg,
2222   not_amg,      compl_amg,
2223   inc_amg,      dec_amg,
2224   atan2_amg,    cos_amg,
2225   sin_amg,      exp_amg,
2226   log_amg,      sqrt_amg,
2227   repeat_amg,   repeat_ass_amg,
2228   concat_amg,   concat_ass_amg,
2229   copy_amg,     neg_amg
2230 };
2231
2232 /*
2233  * some compilers like to redefine cos et alia as faster
2234  * (and less accurate?) versions called F_cos et cetera (Quidquid
2235  * latine dictum sit, altum viditur.)  This trick collides with
2236  * the Perl overloading (amg).  The following #defines fool both.
2237  */
2238
2239 #ifdef _FASTMATH
2240 #   ifdef atan2
2241 #       define F_atan2_amg  atan2_amg
2242 #   endif
2243 #   ifdef cos
2244 #       define F_cos_amg    cos_amg
2245 #   endif
2246 #   ifdef exp
2247 #       define F_exp_amg    exp_amg
2248 #   endif
2249 #   ifdef log
2250 #       define F_log_amg    log_amg
2251 #   endif
2252 #   ifdef pow
2253 #       define F_pow_amg    pow_amg
2254 #   endif
2255 #   ifdef sin
2256 #       define F_sin_amg    sin_amg
2257 #   endif
2258 #   ifdef sqrt
2259 #       define F_sqrt_amg   sqrt_amg
2260 #   endif
2261 #endif /* _FASTMATH */
2262
2263 #endif /* OVERLOAD */
2264
2265 #define PERLDB_ALL      0xff
2266 #define PERLDBf_SUB     0x01            /* Debug sub enter/exit. */
2267 #define PERLDBf_LINE    0x02            /* Keep line #. */
2268 #define PERLDBf_NOOPT   0x04            /* Switch off optimizations. */
2269 #define PERLDBf_INTER   0x08            /* Preserve more data for
2270                                            later inspections.  */
2271 #define PERLDBf_SUBLINE 0x10            /* Keep subr source lines. */
2272 #define PERLDBf_SINGLE  0x20            /* Start with single-step on. */
2273
2274 #define PERLDB_SUB      (perldb && (perldb & PERLDBf_SUB))
2275 #define PERLDB_LINE     (perldb && (perldb & PERLDBf_LINE))
2276 #define PERLDB_NOOPT    (perldb && (perldb & PERLDBf_NOOPT))
2277 #define PERLDB_INTER    (perldb && (perldb & PERLDBf_INTER))
2278 #define PERLDB_SUBLINE  (perldb && (perldb & PERLDBf_SUBLINE))
2279 #define PERLDB_SINGLE   (perldb && (perldb & PERLDBf_SINGLE))
2280
2281 #ifdef USE_LOCALE_COLLATE
2282 EXT U32         collation_ix;           /* Collation generation index */
2283 EXT char *      collation_name;         /* Name of current collation */
2284 EXT bool        collation_standard INIT(TRUE); /* Assume simple collation */
2285 EXT Size_t      collxfrm_base;          /* Basic overhead in *xfrm() */
2286 EXT Size_t      collxfrm_mult INIT(2);  /* Expansion factor in *xfrm() */
2287 #endif /* USE_LOCALE_COLLATE */
2288
2289 #ifdef USE_LOCALE_NUMERIC
2290
2291 EXT char *      numeric_name;           /* Name of current numeric locale */
2292 EXT bool        numeric_standard INIT(TRUE); /* Assume simple numerics */
2293 EXT bool        numeric_local INIT(TRUE);    /* Assume local numerics */
2294
2295 #define SET_NUMERIC_STANDARD() \
2296     STMT_START {                                \
2297         if (! numeric_standard)                 \
2298             perl_set_numeric_standard();        \
2299     } STMT_END
2300
2301 #define SET_NUMERIC_LOCAL() \
2302     STMT_START {                                \
2303         if (! numeric_local)                    \
2304             perl_set_numeric_local();           \
2305     } STMT_END
2306
2307 #else /* !USE_LOCALE_NUMERIC */
2308
2309 #define SET_NUMERIC_STANDARD()  /**/
2310 #define SET_NUMERIC_LOCAL()     /**/
2311
2312 #endif /* !USE_LOCALE_NUMERIC */
2313
2314 #if !defined(PERLIO_IS_STDIO) && defined(HAS_ATTRIBUTE)
2315 /* 
2316  * Now we have __attribute__ out of the way 
2317  * Remap printf 
2318  */
2319 #define printf PerlIO_stdoutf
2320 #endif
2321
2322 /*
2323  * nice_chunk and nice_chunk size need to be set
2324  * and queried under the protection of sv_mutex
2325  */
2326 #define offer_nice_chunk(chunk, chunk_size) do {        \
2327         MUTEX_LOCK(&sv_mutex);                          \
2328         if (!nice_chunk) {                              \
2329             nice_chunk = (char*)(chunk);                \
2330             nice_chunk_size = (chunk_size);             \
2331         }                                               \
2332         MUTEX_UNLOCK(&sv_mutex);                        \
2333     } while (0)
2334
2335 #endif /* Include guard */
2336