Fix various details in win32 makefiles and Config.pm setup.
[p5sagit/p5-mst-13.2.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 /* Digital UNIX defines a typedef CONTEXT when pthreads is in use */ 
888 #if defined(__osf__)
889 #  define CONTEXT PERL_CONTEXT
890 #endif
891
892 typedef MEM_SIZE STRLEN;
893
894 typedef struct op OP;
895 typedef struct cop COP;
896 typedef struct unop UNOP;
897 typedef struct binop BINOP;
898 typedef struct listop LISTOP;
899 typedef struct logop LOGOP;
900 typedef struct condop CONDOP;
901 typedef struct pmop PMOP;
902 typedef struct svop SVOP;
903 typedef struct gvop GVOP;
904 typedef struct pvop PVOP;
905 typedef struct loop LOOP;
906
907 typedef struct Outrec Outrec;
908 typedef struct interpreter PerlInterpreter;
909 #ifndef __BORLANDC__
910 typedef struct ff FF;           /* XXX not defined anywhere, should go? */
911 #endif
912 typedef struct sv SV;
913 typedef struct av AV;
914 typedef struct hv HV;
915 typedef struct cv CV;
916 typedef struct regexp REGEXP;
917 typedef struct gp GP;
918 typedef struct gv GV;
919 typedef struct io IO;
920 typedef struct context CONTEXT;
921 typedef struct block BLOCK;
922
923 typedef struct magic MAGIC;
924 typedef struct xrv XRV;
925 typedef struct xpv XPV;
926 typedef struct xpviv XPVIV;
927 typedef struct xpvuv XPVUV;
928 typedef struct xpvnv XPVNV;
929 typedef struct xpvmg XPVMG;
930 typedef struct xpvlv XPVLV;
931 typedef struct xpvav XPVAV;
932 typedef struct xpvhv XPVHV;
933 typedef struct xpvgv XPVGV;
934 typedef struct xpvcv XPVCV;
935 typedef struct xpvbm XPVBM;
936 typedef struct xpvfm XPVFM;
937 typedef struct xpvio XPVIO;
938 typedef struct mgvtbl MGVTBL;
939 typedef union any ANY;
940
941 #include "handy.h"
942
943 typedef I32 (*filter_t) _((int, SV *, int));
944 #define FILTER_READ(idx, sv, len)  filter_read(idx, sv, len)
945 #define FILTER_DATA(idx)           (AvARRAY(rsfp_filters)[idx])
946 #define FILTER_ISREADER(idx)       (idx >= AvFILL(rsfp_filters))
947
948 #ifdef DOSISH
949 # if defined(OS2)
950 #   include "os2ish.h"
951 # else
952 #   include "dosish.h"
953 # endif
954 #else
955 # if defined(VMS)
956 #   include "vmsish.h"
957 # else
958 #   if defined(PLAN9)
959 #     include "./plan9/plan9ish.h"
960 #   else
961 #     include "unixish.h"
962 #   endif
963 # endif
964 #endif         
965
966 /* 
967  * USE_THREADS needs to be after unixish.h as <pthread.h> includes <sys/signal.h>
968  * which defines NSIG - which will stop inclusion of <signal.h>
969  * this results in many functions being undeclared which bothers C++
970  * May make sense to have threads after "*ish.h" anyway
971  */
972
973 #ifdef USE_THREADS
974 #  ifdef FAKE_THREADS
975 #    include "fakethr.h"
976 #  else
977 #    ifdef WIN32
978 #      include <win32thread.h>
979 #    else
980 #      include <pthread.h>
981 typedef pthread_mutex_t perl_mutex;
982 typedef pthread_cond_t perl_cond;
983 typedef pthread_key_t perl_key;
984 #    endif /* WIN32 */
985 #  endif /* FAKE_THREADS */
986 #endif /* USE_THREADS */
987
988
989   
990 #ifdef VMS
991 #   define STATUS_NATIVE        statusvalue_vms
992 #   define STATUS_NATIVE_EXPORT \
993         ((I32)statusvalue_vms == -1 ? 44 : statusvalue_vms)
994 #   define STATUS_NATIVE_SET(n)                                         \
995         STMT_START {                                                    \
996             statusvalue_vms = (n);                                      \
997             if ((I32)statusvalue_vms == -1)                             \
998                 statusvalue = -1;                                       \
999             else if (statusvalue_vms & STS$M_SUCCESS)                   \
1000                 statusvalue = 0;                                        \
1001             else if ((statusvalue_vms & STS$M_SEVERITY) == 0)           \
1002                 statusvalue = 1 << 8;                                   \
1003             else                                                        \
1004                 statusvalue = (statusvalue_vms & STS$M_SEVERITY) << 8;  \
1005         } STMT_END
1006 #   define STATUS_POSIX statusvalue
1007 #   ifdef VMSISH_STATUS
1008 #       define STATUS_CURRENT   (VMSISH_STATUS ? STATUS_NATIVE : STATUS_POSIX)
1009 #   else
1010 #       define STATUS_CURRENT   STATUS_POSIX
1011 #   endif
1012 #   define STATUS_POSIX_SET(n)                          \
1013         STMT_START {                                    \
1014             statusvalue = (n);                          \
1015             if (statusvalue != -1) {                    \
1016                 statusvalue &= 0xFFFF;                  \
1017                 statusvalue_vms = statusvalue ? 44 : 1; \
1018             }                                           \
1019             else statusvalue_vms = -1;                  \
1020         } STMT_END
1021 #   define STATUS_ALL_SUCCESS   (statusvalue = 0, statusvalue_vms = 1)
1022 #   define STATUS_ALL_FAILURE   (statusvalue = 1, statusvalue_vms = 44)
1023 #else
1024 #   define STATUS_NATIVE        STATUS_POSIX
1025 #   define STATUS_NATIVE_EXPORT STATUS_POSIX
1026 #   define STATUS_NATIVE_SET    STATUS_POSIX_SET
1027 #   define STATUS_POSIX         statusvalue
1028 #   define STATUS_POSIX_SET(n)          \
1029         STMT_START {                    \
1030             statusvalue = (n);          \
1031             if (statusvalue != -1)      \
1032                 statusvalue &= 0xFFFF;  \
1033         } STMT_END
1034 #   define STATUS_CURRENT STATUS_POSIX
1035 #   define STATUS_ALL_SUCCESS   (statusvalue = 0)
1036 #   define STATUS_ALL_FAILURE   (statusvalue = 1)
1037 #endif
1038
1039 /* Some unistd.h's give a prototype for pause() even though
1040    HAS_PAUSE ends up undefined.  This causes the #define
1041    below to be rejected by the compmiler.  Sigh.
1042 */
1043 #ifdef HAS_PAUSE
1044 #define Pause   pause
1045 #else
1046 #define Pause() sleep((32767<<16)+32767)
1047 #endif
1048
1049 #ifndef IOCPARM_LEN
1050 #   ifdef IOCPARM_MASK
1051         /* on BSDish systes we're safe */
1052 #       define IOCPARM_LEN(x)  (((x) >> 16) & IOCPARM_MASK)
1053 #   else
1054         /* otherwise guess at what's safe */
1055 #       define IOCPARM_LEN(x)   256
1056 #   endif
1057 #endif
1058
1059 union any {
1060     void*       any_ptr;
1061     I32         any_i32;
1062     IV          any_iv;
1063     long        any_long;
1064     void        (*any_dptr) _((void*));
1065 };
1066
1067 #ifdef USE_THREADS
1068 #define ARGSproto struct thread *thr
1069 #else
1070 #define ARGSproto void
1071 #endif /* USE_THREADS */
1072
1073 /* Work around some cygwin32 problems with importing global symbols */
1074 #if defined(CYGWIN32) && defined(DLLIMPORT) 
1075 #   include "cw32imp.h"
1076 #endif
1077
1078 #include "regexp.h"
1079 #include "sv.h"
1080 #include "util.h"
1081 #include "form.h"
1082 #include "gv.h"
1083 #include "cv.h"
1084 #include "opcode.h"
1085 #include "op.h"
1086 #include "cop.h"
1087 #include "av.h"
1088 #include "hv.h"
1089 #include "mg.h"
1090 #include "scope.h"
1091
1092 /* work around some libPW problems */
1093 #ifdef DOINIT
1094 EXT char Error[1];
1095 #endif
1096
1097 #if defined(iAPX286) || defined(M_I286) || defined(I80286)
1098 #   define I286
1099 #endif
1100
1101 #if defined(htonl) && !defined(HAS_HTONL)
1102 #define HAS_HTONL
1103 #endif
1104 #if defined(htons) && !defined(HAS_HTONS)
1105 #define HAS_HTONS
1106 #endif
1107 #if defined(ntohl) && !defined(HAS_NTOHL)
1108 #define HAS_NTOHL
1109 #endif
1110 #if defined(ntohs) && !defined(HAS_NTOHS)
1111 #define HAS_NTOHS
1112 #endif
1113 #ifndef HAS_HTONL
1114 #if (BYTEORDER & 0xffff) != 0x4321
1115 #define HAS_HTONS
1116 #define HAS_HTONL
1117 #define HAS_NTOHS
1118 #define HAS_NTOHL
1119 #define MYSWAP
1120 #define htons my_swap
1121 #define htonl my_htonl
1122 #define ntohs my_swap
1123 #define ntohl my_ntohl
1124 #endif
1125 #else
1126 #if (BYTEORDER & 0xffff) == 0x4321
1127 #undef HAS_HTONS
1128 #undef HAS_HTONL
1129 #undef HAS_NTOHS
1130 #undef HAS_NTOHL
1131 #endif
1132 #endif
1133
1134 /*
1135  * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
1136  * -DWS
1137  */
1138 #if BYTEORDER != 0x1234
1139 # define HAS_VTOHL
1140 # define HAS_VTOHS
1141 # define HAS_HTOVL
1142 # define HAS_HTOVS
1143 # if BYTEORDER == 0x4321
1144 #  define vtohl(x)      ((((x)&0xFF)<<24)       \
1145                         +(((x)>>24)&0xFF)       \
1146                         +(((x)&0x0000FF00)<<8)  \
1147                         +(((x)&0x00FF0000)>>8)  )
1148 #  define vtohs(x)      ((((x)&0xFF)<<8) + (((x)>>8)&0xFF))
1149 #  define htovl(x)      vtohl(x)
1150 #  define htovs(x)      vtohs(x)
1151 # endif
1152         /* otherwise default to functions in util.c */
1153 #endif
1154
1155 #ifdef CASTNEGFLOAT
1156 #define U_S(what) ((U16)(what))
1157 #define U_I(what) ((unsigned int)(what))
1158 #define U_L(what) ((U32)(what))
1159 #else
1160 EXTERN_C U32 cast_ulong _((double));
1161 #define U_S(what) ((U16)cast_ulong((double)(what)))
1162 #define U_I(what) ((unsigned int)cast_ulong((double)(what)))
1163 #define U_L(what) (cast_ulong((double)(what)))
1164 #endif
1165
1166 #ifdef CASTI32
1167 #define I_32(what) ((I32)(what))
1168 #define I_V(what) ((IV)(what))
1169 #define U_V(what) ((UV)(what))
1170 #else
1171 START_EXTERN_C
1172 I32 cast_i32 _((double));
1173 IV cast_iv _((double));
1174 UV cast_uv _((double));
1175 END_EXTERN_C
1176 #define I_32(what) (cast_i32((double)(what)))
1177 #define I_V(what) (cast_iv((double)(what)))
1178 #define U_V(what) (cast_uv((double)(what)))
1179 #endif
1180
1181 struct Outrec {
1182     I32         o_lines;
1183     char        *o_str;
1184     U32         o_len;
1185 };
1186
1187 #ifndef MAXSYSFD
1188 #   define MAXSYSFD 2
1189 #endif
1190
1191 #ifndef TMPPATH
1192 #  define TMPPATH "/tmp/perl-eXXXXXX"
1193 #endif
1194
1195 #ifndef __cplusplus
1196 Uid_t getuid _((void));
1197 Uid_t geteuid _((void));
1198 Gid_t getgid _((void));
1199 Gid_t getegid _((void));
1200 #endif
1201
1202 #ifdef DEBUGGING
1203 #ifndef Perl_debug_log
1204 #define Perl_debug_log  PerlIO_stderr()
1205 #endif
1206 #define YYDEBUG 1
1207 #define DEB(a)                          a
1208 #define DEBUG(a)   if (debug)           a
1209 #define DEBUG_p(a) if (debug & 1)       a
1210 #define DEBUG_s(a) if (debug & 2)       a
1211 #define DEBUG_l(a) if (debug & 4)       a
1212 #define DEBUG_t(a) if (debug & 8)       a
1213 #define DEBUG_o(a) if (debug & 16)      a
1214 #define DEBUG_c(a) if (debug & 32)      a
1215 #define DEBUG_P(a) if (debug & 64)      a
1216 #define DEBUG_m(a) if (curinterp && debug & 128)        a
1217 #define DEBUG_f(a) if (debug & 256)     a
1218 #define DEBUG_r(a) if (debug & 512)     a
1219 #define DEBUG_x(a) if (debug & 1024)    a
1220 #define DEBUG_u(a) if (debug & 2048)    a
1221 #define DEBUG_L(a) if (debug & 4096)    a
1222 #define DEBUG_H(a) if (debug & 8192)    a
1223 #define DEBUG_X(a) if (debug & 16384)   a
1224 #define DEBUG_D(a) if (debug & 32768)   a
1225 #else
1226 #define DEB(a)
1227 #define DEBUG(a)
1228 #define DEBUG_p(a)
1229 #define DEBUG_s(a)
1230 #define DEBUG_l(a)
1231 #define DEBUG_t(a)
1232 #define DEBUG_o(a)
1233 #define DEBUG_c(a)
1234 #define DEBUG_P(a)
1235 #define DEBUG_m(a)
1236 #define DEBUG_f(a)
1237 #define DEBUG_r(a)
1238 #define DEBUG_x(a)
1239 #define DEBUG_u(a)
1240 #define DEBUG_L(a)
1241 #define DEBUG_H(a)
1242 #define DEBUG_X(a)
1243 #define DEBUG_D(a)
1244 #endif
1245 #define YYMAXDEPTH 300
1246
1247 #ifndef assert  /* <assert.h> might have been included somehow */
1248 #define assert(what)    DEB( {                                          \
1249         if (!(what)) {                                                  \
1250             croak("Assertion failed: file \"%s\", line %d",             \
1251                 __FILE__, __LINE__);                                    \
1252             exit(1);                                                    \
1253         }})
1254 #endif
1255
1256 struct ufuncs {
1257     I32 (*uf_val)_((IV, SV*));
1258     I32 (*uf_set)_((IV, SV*));
1259     IV uf_index;
1260 };
1261
1262 /* Fix these up for __STDC__ */
1263 #ifndef DONT_DECLARE_STD
1264 char *mktemp _((char*));
1265 double atof _((const char*));
1266 #endif
1267
1268 #ifndef STANDARD_C
1269 /* All of these are in stdlib.h or time.h for ANSI C */
1270 Time_t time();
1271 struct tm *gmtime(), *localtime();
1272 char *strchr(), *strrchr();
1273 char *strcpy(), *strcat();
1274 #endif /* ! STANDARD_C */
1275
1276
1277 #ifdef I_MATH
1278 #    include <math.h>
1279 #else
1280 START_EXTERN_C
1281             double exp _((double));
1282             double log _((double));
1283             double log10 _((double));
1284             double sqrt _((double));
1285             double frexp _((double,int*));
1286             double ldexp _((double,int));
1287             double modf _((double,double*));
1288             double sin _((double));
1289             double cos _((double));
1290             double atan2 _((double,double));
1291             double pow _((double,double));
1292 END_EXTERN_C
1293 #endif
1294
1295 #ifndef __cplusplus
1296 #ifdef __NeXT__ /* or whatever catches all NeXTs */
1297 char *crypt ();       /* Maybe more hosts will need the unprototyped version */
1298 #else
1299 char *crypt _((const char*, const char*));
1300 #endif
1301 #ifndef DONT_DECLARE_STD
1302 #ifndef getenv
1303 char *getenv _((const char*));
1304 #endif
1305 Off_t lseek _((int,Off_t,int));
1306 #endif
1307 char *getlogin _((void));
1308 #endif
1309
1310 #ifdef UNLINK_ALL_VERSIONS /* Currently only makes sense for VMS */
1311 #define UNLINK unlnk
1312 I32 unlnk _((char*));
1313 #else
1314 #define UNLINK unlink
1315 #endif
1316
1317 #ifndef HAS_SETREUID
1318 #  ifdef HAS_SETRESUID
1319 #    define setreuid(r,e) setresuid(r,e,(Uid_t)-1)
1320 #    define HAS_SETREUID
1321 #  endif
1322 #endif
1323 #ifndef HAS_SETREGID
1324 #  ifdef HAS_SETRESGID
1325 #    define setregid(r,e) setresgid(r,e,(Gid_t)-1)
1326 #    define HAS_SETREGID
1327 #  endif
1328 #endif
1329
1330 typedef Signal_t (*Sighandler_t) _((int));
1331
1332 #ifdef HAS_SIGACTION
1333 typedef struct sigaction Sigsave_t;
1334 #else
1335 typedef Sighandler_t Sigsave_t;
1336 #endif
1337
1338 #define SCAN_DEF 0
1339 #define SCAN_TR 1
1340 #define SCAN_REPL 2
1341
1342 #ifdef DEBUGGING
1343 # ifndef register
1344 #  define register
1345 # endif
1346 # define PAD_SV(po) pad_sv(po)
1347 # define RUNOPS_DEFAULT runops_debug
1348 #else
1349 # define PAD_SV(po) curpad[po]
1350 # define RUNOPS_DEFAULT runops_standard
1351 #endif
1352
1353 /*
1354  * These need prototyping here because <proto.h> isn't
1355  * included until after runops is initialised.
1356  */
1357
1358 int runops_standard _((void));
1359 #ifdef DEBUGGING
1360 int runops_debug _((void));
1361 #endif
1362
1363 #define PER_THREAD_MAGICALS "123456789&`'+/.,\\\";^-%=|~:\001\005!@"
1364
1365 /****************/
1366 /* Truly global */
1367 /****************/
1368
1369 /* global state */
1370 EXT PerlInterpreter *   curinterp;      /* currently running interpreter */
1371 #ifdef USE_THREADS
1372 EXT perl_key            thr_key;        /* For per-thread struct thread ptr */
1373 EXT perl_mutex          sv_mutex;       /* Mutex for allocating SVs in sv.c */
1374 EXT perl_mutex          malloc_mutex;   /* Mutex for malloc */
1375 EXT perl_mutex          eval_mutex;     /* Mutex for doeval */
1376 EXT perl_cond           eval_cond;      /* Condition variable for doeval */
1377 EXT struct thread *     eval_owner;     /* Owner thread for doeval */
1378 EXT int                 nthreads;       /* Number of threads currently */
1379 EXT perl_mutex          threads_mutex;  /* Mutex for nthreads and thread list */
1380 EXT perl_cond           nthreads_cond;  /* Condition variable for nthreads */
1381 EXT char *              per_thread_magicals INIT(PER_THREAD_MAGICALS);
1382 #ifdef FAKE_THREADS
1383 EXT struct thread *     thr;            /* Currently executing (fake) thread */
1384 #endif
1385 #endif /* USE_THREADS */
1386
1387 /* VMS doesn't use environ array and NeXT has problems with crt0.o globals */
1388 #if !defined(VMS) && !(defined(NeXT) && defined(__DYNAMIC__))
1389 #if !defined(DONT_DECLARE_STD) || (defined(__svr4__) && defined(__GNUC__) && defined(sun))
1390 extern char **  environ;        /* environment variables supplied via exec */
1391 #endif
1392 #else
1393 #  if defined(NeXT) && defined(__DYNAMIC__)
1394
1395 #  include <mach-o/dyld.h>
1396 EXT char *** environ_pointer;
1397 #  define environ (*environ_pointer)
1398 #  endif
1399 #endif /* environ processing */
1400
1401 EXT int         uid;            /* current real user id */
1402 EXT int         euid;           /* current effective user id */
1403 EXT int         gid;            /* current real group id */
1404 EXT int         egid;           /* current effective group id */
1405 EXT bool        nomemok;        /* let malloc context handle nomem */
1406 EXT U32         an;             /* malloc sequence number */
1407 EXT U32         cop_seqmax;     /* statement sequence number */
1408 EXT U16         op_seqmax;      /* op sequence number */
1409 EXT U32         evalseq;        /* eval sequence number */
1410 EXT U32         sub_generation; /* inc to force methods to be looked up again */
1411 EXT char **     origenviron;
1412 EXT U32         origalen;
1413 EXT HV *        pidstatus;      /* pid-to-status mappings for waitpid */
1414 EXT U32 *       profiledata;
1415 EXT int         maxo INIT(MAXO);/* Number of ops */
1416 EXT char *      osname;         /* operating system */
1417 EXT char *      sh_path INIT(SH_PATH); /* full path of shell */
1418 EXT Sighandler_t        sighandlerp;
1419
1420 EXT XPV*        xiv_arenaroot;  /* list of allocated xiv areas */
1421 EXT IV **       xiv_root;       /* free xiv list--shared by interpreters */
1422 EXT double *    xnv_root;       /* free xnv list--shared by interpreters */
1423 EXT XRV *       xrv_root;       /* free xrv list--shared by interpreters */
1424 EXT XPV *       xpv_root;       /* free xpv list--shared by interpreters */
1425 EXT HE *        he_root;        /* free he list--shared by interpreters */
1426 EXT char *      nice_chunk;     /* a nice chunk of memory to reuse */
1427 EXT U32         nice_chunk_size;/* how nice the chunk of memory is */
1428
1429 /* Stack for currently executing thread--context switch must handle this.     */
1430 EXT SV **       stack_base;     /* stack->array_ary */
1431 EXT SV **       stack_sp;       /* stack pointer now */
1432 EXT SV **       stack_max;      /* stack->array_ary + stack->array_max */
1433
1434 /* likewise for these */
1435
1436 #ifdef OP_IN_REGISTER
1437 EXT OP *        opsave;         /* save current op register across longjmps */
1438 #else
1439 EXT OP *        op;             /* current op--when not in a global register */
1440 #endif
1441 EXT int         (*runops) _((void)) INIT(RUNOPS_DEFAULT);
1442 EXT I32 *       scopestack;     /* blocks we've entered */
1443 EXT I32         scopestack_ix;
1444 EXT I32         scopestack_max;
1445
1446 EXT ANY*        savestack;      /* to save non-local values on */
1447 EXT I32         savestack_ix;
1448 EXT I32         savestack_max;
1449
1450 EXT OP **       retstack;       /* returns we've pushed */
1451 EXT I32         retstack_ix;
1452 EXT I32         retstack_max;
1453
1454 EXT I32 *       markstack;      /* stackmarks we're remembering */
1455 EXT I32 *       markstack_ptr;  /* stackmarks we're remembering */
1456 EXT I32 *       markstack_max;  /* stackmarks we're remembering */
1457
1458 EXT SV **       curpad;
1459
1460 /* temp space */
1461 EXT SV *        Sv;
1462 EXT XPV *       Xpv;
1463 EXT char        tokenbuf[256];
1464 EXT struct stat statbuf;
1465 #ifdef HAS_TIMES
1466 EXT struct tms  timesbuf;
1467 #endif
1468 EXT STRLEN na;          /* for use in SvPV when length is Not Applicable */
1469
1470 /* for tmp use in stupid debuggers */
1471 EXT int *       di;
1472 EXT short *     ds;
1473 EXT char *      dc;
1474
1475 /* handy constants */
1476 EXTCONST char * Yes INIT("1");
1477 EXTCONST char * No INIT("");
1478 EXTCONST char * hexdigit INIT("0123456789abcdef0123456789ABCDEFx");
1479 EXTCONST char * patleave INIT("\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}");
1480 EXTCONST char * vert INIT("|");
1481
1482 EXTCONST char warn_uninit[]
1483   INIT("Use of uninitialized value");
1484 EXTCONST char warn_nosemi[]
1485   INIT("Semicolon seems to be missing");
1486 EXTCONST char warn_reserved[]
1487   INIT("Unquoted string \"%s\" may clash with future reserved word");
1488 EXTCONST char warn_nl[]
1489   INIT("Unsuccessful %s on filename containing newline");
1490 EXTCONST char no_wrongref[]
1491   INIT("Can't use %s ref as %s ref");
1492 EXTCONST char no_symref[]
1493   INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
1494 EXTCONST char no_usym[]
1495   INIT("Can't use an undefined value as %s reference");
1496 EXTCONST char no_aelem[]
1497   INIT("Modification of non-creatable array value attempted, subscript %d");
1498 EXTCONST char no_helem[]
1499   INIT("Modification of non-creatable hash value attempted, subscript \"%s\"");
1500 EXTCONST char no_modify[]
1501   INIT("Modification of a read-only value attempted");
1502 EXTCONST char no_mem[]
1503   INIT("Out of memory!\n");
1504 EXTCONST char no_security[]
1505   INIT("Insecure dependency in %s%s");
1506 EXTCONST char no_sock_func[]
1507   INIT("Unsupported socket function \"%s\" called");
1508 EXTCONST char no_dir_func[]
1509   INIT("Unsupported directory function \"%s\" called");
1510 EXTCONST char no_func[]
1511   INIT("The %s function is unimplemented");
1512 EXTCONST char no_myglob[]
1513   INIT("\"my\" variable %s can't be in a package");
1514
1515 EXT SV          sv_undef;
1516 EXT SV          sv_no;
1517 EXT SV          sv_yes;
1518 #ifdef CSH
1519     EXT char *  cshname INIT(CSH);
1520     EXT I32     cshlen;
1521 #endif
1522
1523 #ifdef DOINIT
1524 EXT char *sig_name[] = { SIG_NAME };
1525 EXT int   sig_num[]  = { SIG_NUM };
1526 EXT SV  * psig_ptr[sizeof(sig_num)/sizeof(*sig_num)];
1527 EXT SV  * psig_name[sizeof(sig_num)/sizeof(*sig_num)];
1528 #else
1529 EXT char *sig_name[];
1530 EXT int   sig_num[];
1531 EXT SV  * psig_ptr[];
1532 EXT SV  * psig_name[];
1533 #endif
1534
1535 /* fast case folding tables */
1536
1537 #ifdef DOINIT
1538 EXTCONST  unsigned char fold[] = {
1539         0,      1,      2,      3,      4,      5,      6,      7,
1540         8,      9,      10,     11,     12,     13,     14,     15,
1541         16,     17,     18,     19,     20,     21,     22,     23,
1542         24,     25,     26,     27,     28,     29,     30,     31,
1543         32,     33,     34,     35,     36,     37,     38,     39,
1544         40,     41,     42,     43,     44,     45,     46,     47,
1545         48,     49,     50,     51,     52,     53,     54,     55,
1546         56,     57,     58,     59,     60,     61,     62,     63,
1547         64,     'a',    'b',    'c',    'd',    'e',    'f',    'g',
1548         'h',    'i',    'j',    'k',    'l',    'm',    'n',    'o',
1549         'p',    'q',    'r',    's',    't',    'u',    'v',    'w',
1550         'x',    'y',    'z',    91,     92,     93,     94,     95,
1551         96,     'A',    'B',    'C',    'D',    'E',    'F',    'G',
1552         'H',    'I',    'J',    'K',    'L',    'M',    'N',    'O',
1553         'P',    'Q',    'R',    'S',    'T',    'U',    'V',    'W',
1554         'X',    'Y',    'Z',    123,    124,    125,    126,    127,
1555         128,    129,    130,    131,    132,    133,    134,    135,
1556         136,    137,    138,    139,    140,    141,    142,    143,
1557         144,    145,    146,    147,    148,    149,    150,    151,
1558         152,    153,    154,    155,    156,    157,    158,    159,
1559         160,    161,    162,    163,    164,    165,    166,    167,
1560         168,    169,    170,    171,    172,    173,    174,    175,
1561         176,    177,    178,    179,    180,    181,    182,    183,
1562         184,    185,    186,    187,    188,    189,    190,    191,
1563         192,    193,    194,    195,    196,    197,    198,    199,
1564         200,    201,    202,    203,    204,    205,    206,    207,
1565         208,    209,    210,    211,    212,    213,    214,    215,
1566         216,    217,    218,    219,    220,    221,    222,    223,    
1567         224,    225,    226,    227,    228,    229,    230,    231,
1568         232,    233,    234,    235,    236,    237,    238,    239,
1569         240,    241,    242,    243,    244,    245,    246,    247,
1570         248,    249,    250,    251,    252,    253,    254,    255
1571 };
1572 #else
1573 EXTCONST unsigned char fold[];
1574 #endif
1575
1576 #ifdef DOINIT
1577 EXT unsigned char fold_locale[] = {
1578         0,      1,      2,      3,      4,      5,      6,      7,
1579         8,      9,      10,     11,     12,     13,     14,     15,
1580         16,     17,     18,     19,     20,     21,     22,     23,
1581         24,     25,     26,     27,     28,     29,     30,     31,
1582         32,     33,     34,     35,     36,     37,     38,     39,
1583         40,     41,     42,     43,     44,     45,     46,     47,
1584         48,     49,     50,     51,     52,     53,     54,     55,
1585         56,     57,     58,     59,     60,     61,     62,     63,
1586         64,     'a',    'b',    'c',    'd',    'e',    'f',    'g',
1587         'h',    'i',    'j',    'k',    'l',    'm',    'n',    'o',
1588         'p',    'q',    'r',    's',    't',    'u',    'v',    'w',
1589         'x',    'y',    'z',    91,     92,     93,     94,     95,
1590         96,     'A',    'B',    'C',    'D',    'E',    'F',    'G',
1591         'H',    'I',    'J',    'K',    'L',    'M',    'N',    'O',
1592         'P',    'Q',    'R',    'S',    'T',    'U',    'V',    'W',
1593         'X',    'Y',    'Z',    123,    124,    125,    126,    127,
1594         128,    129,    130,    131,    132,    133,    134,    135,
1595         136,    137,    138,    139,    140,    141,    142,    143,
1596         144,    145,    146,    147,    148,    149,    150,    151,
1597         152,    153,    154,    155,    156,    157,    158,    159,
1598         160,    161,    162,    163,    164,    165,    166,    167,
1599         168,    169,    170,    171,    172,    173,    174,    175,
1600         176,    177,    178,    179,    180,    181,    182,    183,
1601         184,    185,    186,    187,    188,    189,    190,    191,
1602         192,    193,    194,    195,    196,    197,    198,    199,
1603         200,    201,    202,    203,    204,    205,    206,    207,
1604         208,    209,    210,    211,    212,    213,    214,    215,
1605         216,    217,    218,    219,    220,    221,    222,    223,    
1606         224,    225,    226,    227,    228,    229,    230,    231,
1607         232,    233,    234,    235,    236,    237,    238,    239,
1608         240,    241,    242,    243,    244,    245,    246,    247,
1609         248,    249,    250,    251,    252,    253,    254,    255
1610 };
1611 #else
1612 EXT unsigned char fold_locale[];
1613 #endif
1614
1615 #ifdef DOINIT
1616 EXTCONST unsigned char freq[] = {       /* letter frequencies for mixed English/C */
1617         1,      2,      84,     151,    154,    155,    156,    157,
1618         165,    246,    250,    3,      158,    7,      18,     29,
1619         40,     51,     62,     73,     85,     96,     107,    118,
1620         129,    140,    147,    148,    149,    150,    152,    153,
1621         255,    182,    224,    205,    174,    176,    180,    217,
1622         233,    232,    236,    187,    235,    228,    234,    226,
1623         222,    219,    211,    195,    188,    193,    185,    184,
1624         191,    183,    201,    229,    181,    220,    194,    162,
1625         163,    208,    186,    202,    200,    218,    198,    179,
1626         178,    214,    166,    170,    207,    199,    209,    206,
1627         204,    160,    212,    216,    215,    192,    175,    173,
1628         243,    172,    161,    190,    203,    189,    164,    230,
1629         167,    248,    227,    244,    242,    255,    241,    231,
1630         240,    253,    169,    210,    245,    237,    249,    247,
1631         239,    168,    252,    251,    254,    238,    223,    221,
1632         213,    225,    177,    197,    171,    196,    159,    4,
1633         5,      6,      8,      9,      10,     11,     12,     13,
1634         14,     15,     16,     17,     19,     20,     21,     22,
1635         23,     24,     25,     26,     27,     28,     30,     31,
1636         32,     33,     34,     35,     36,     37,     38,     39,
1637         41,     42,     43,     44,     45,     46,     47,     48,
1638         49,     50,     52,     53,     54,     55,     56,     57,
1639         58,     59,     60,     61,     63,     64,     65,     66,
1640         67,     68,     69,     70,     71,     72,     74,     75,
1641         76,     77,     78,     79,     80,     81,     82,     83,
1642         86,     87,     88,     89,     90,     91,     92,     93,
1643         94,     95,     97,     98,     99,     100,    101,    102,
1644         103,    104,    105,    106,    108,    109,    110,    111,
1645         112,    113,    114,    115,    116,    117,    119,    120,
1646         121,    122,    123,    124,    125,    126,    127,    128,
1647         130,    131,    132,    133,    134,    135,    136,    137,
1648         138,    139,    141,    142,    143,    144,    145,    146
1649 };
1650 #else
1651 EXTCONST unsigned char freq[];
1652 #endif
1653
1654 #ifdef DEBUGGING
1655 #ifdef DOINIT
1656 EXTCONST char* block_type[] = {
1657         "NULL",
1658         "SUB",
1659         "EVAL",
1660         "LOOP",
1661         "SUBST",
1662         "BLOCK",
1663 };
1664 #else
1665 EXTCONST char* block_type[];
1666 #endif
1667 #endif
1668
1669 /*****************************************************************************/
1670 /* This lexer/parser stuff is currently global since yacc is hard to reenter */
1671 /*****************************************************************************/
1672 /* XXX This needs to be revisited, since BEGIN makes yacc re-enter... */
1673
1674 #include "perly.h"
1675
1676 #define LEX_NOTPARSING          11      /* borrowed from toke.c */
1677
1678 typedef enum {
1679     XOPERATOR,
1680     XTERM,
1681     XREF,
1682     XSTATE,
1683     XBLOCK,
1684     XTERMBLOCK
1685 } expectation;
1686
1687 EXT U32         lex_state;      /* next token is determined */
1688 EXT U32         lex_defer;      /* state after determined token */
1689 EXT expectation lex_expect;     /* expect after determined token */
1690 EXT I32         lex_brackets;   /* bracket count */
1691 EXT I32         lex_formbrack;  /* bracket count at outer format level */
1692 EXT I32         lex_fakebrack;  /* outer bracket is mere delimiter */
1693 EXT I32         lex_casemods;   /* casemod count */
1694 EXT I32         lex_dojoin;     /* doing an array interpolation */
1695 EXT I32         lex_starts;     /* how many interps done on level */
1696 EXT SV *        lex_stuff;      /* runtime pattern from m// or s/// */
1697 EXT SV *        lex_repl;       /* runtime replacement from s/// */
1698 EXT OP *        lex_op;         /* extra info to pass back on op */
1699 EXT OP *        lex_inpat;      /* in pattern $) and $| are special */
1700 EXT I32         lex_inwhat;     /* what kind of quoting are we in */
1701 EXT char *      lex_brackstack; /* what kind of brackets to pop */
1702 EXT char *      lex_casestack;  /* what kind of case mods in effect */
1703
1704 /* What we know when we're in LEX_KNOWNEXT state. */
1705 EXT YYSTYPE     nextval[5];     /* value of next token, if any */
1706 EXT I32         nexttype[5];    /* type of next token */
1707 EXT I32         nexttoke;
1708
1709 EXT PerlIO * VOL        rsfp INIT(Nullfp);
1710 EXT SV *        linestr;
1711 EXT char *      bufptr;
1712 EXT char *      oldbufptr;
1713 EXT char *      oldoldbufptr;
1714 EXT char *      bufend;
1715 EXT expectation expect INIT(XSTATE);    /* how to interpret ambiguous tokens */
1716 EXT AV *        rsfp_filters;
1717
1718 EXT I32         multi_start;    /* 1st line of multi-line string */
1719 EXT I32         multi_end;      /* last line of multi-line string */
1720 EXT I32         multi_open;     /* delimiter of said string */
1721 EXT I32         multi_close;    /* delimiter of said string */
1722
1723 EXT GV *        scrgv;
1724 EXT I32         error_count;    /* how many errors so far, max 10 */
1725 EXT I32         subline;        /* line this subroutine began on */
1726 EXT SV *        subname;        /* name of current subroutine */
1727
1728 EXT CV *        compcv;         /* currently compiling subroutine */
1729 EXT AV *        comppad;        /* storage for lexically scoped temporaries */
1730 EXT AV *        comppad_name;   /* variable names for "my" variables */
1731 EXT I32         comppad_name_fill;/* last "introduced" variable offset */
1732 EXT I32         comppad_name_floor;/* start of vars in innermost block */
1733 EXT I32         min_intro_pending;/* start of vars to introduce */
1734 EXT I32         max_intro_pending;/* end of vars to introduce */
1735 EXT I32         padix;          /* max used index in current "register" pad */
1736 EXT I32         padix_floor;    /* how low may inner block reset padix */
1737 EXT I32         pad_reset_pending; /* reset pad on next attempted alloc */
1738 EXT COP         compiling;
1739
1740 EXT I32         thisexpr;       /* name id for nothing_in_common() */
1741 EXT char *      last_uni;       /* position of last named-unary operator */
1742 EXT char *      last_lop;       /* position of last list operator */
1743 EXT OPCODE      last_lop_op;    /* last list operator */
1744 EXT bool        in_my;          /* we're compiling a "my" declaration */
1745 EXT HV *        in_my_stash;    /* declared class of this "my" declaration */
1746 #ifdef FCRYPT
1747 EXT I32         cryptseen;      /* has fast crypt() been initialized? */
1748 #endif
1749
1750 EXT U32         hints;          /* various compilation flags */
1751
1752                                 /* Note: the lowest 8 bits are reserved for
1753                                    stuffing into op->op_private */
1754 #define HINT_INTEGER            0x00000001
1755 #define HINT_STRICT_REFS        0x00000002
1756
1757 #define HINT_BLOCK_SCOPE        0x00000100
1758 #define HINT_STRICT_SUBS        0x00000200
1759 #define HINT_STRICT_VARS        0x00000400
1760 #define HINT_LOCALE             0x00000800
1761
1762 /**************************************************************************/
1763 /* This regexp stuff is global since it always happens within 1 expr eval */
1764 /**************************************************************************/
1765
1766 EXT char *      regprecomp;     /* uncompiled string. */
1767 EXT char *      regparse;       /* Input-scan pointer. */
1768 EXT char *      regxend;        /* End of input for compile */
1769 EXT I32         regnpar;        /* () count. */
1770 EXT char *      regcode;        /* Code-emit pointer; &regdummy = don't. */
1771 EXT I32         regsize;        /* Code size. */
1772 EXT I32         regnaughty;     /* How bad is this pattern? */
1773 EXT I32         regsawback;     /* Did we see \1, ...? */
1774
1775 EXT char *      reginput;       /* String-input pointer. */
1776 EXT char *      regbol;         /* Beginning of input, for ^ check. */
1777 EXT char *      regeol;         /* End of input, for $ check. */
1778 EXT char **     regstartp;      /* Pointer to startp array. */
1779 EXT char **     regendp;        /* Ditto for endp. */
1780 EXT U32 *       reglastparen;   /* Similarly for lastparen. */
1781 EXT char *      regtill;        /* How far we are required to go. */
1782 EXT U16         regflags;       /* are we folding, multilining? */
1783 EXT char        regprev;        /* char before regbol, \n if none */
1784
1785 EXT bool        do_undump;      /* -u or dump seen? */
1786 EXT VOL U32     debug;
1787
1788 /***********************************************/
1789 /* Global only to current interpreter instance */
1790 /***********************************************/
1791
1792 #ifdef MULTIPLICITY
1793 #define IEXT
1794 #define IINIT(x)
1795 struct interpreter {
1796 #else
1797 #define IEXT EXT
1798 #define IINIT(x) INIT(x)
1799 #endif
1800
1801 /* pseudo environmental stuff */
1802 IEXT int        Iorigargc;
1803 IEXT char **    Iorigargv;
1804 IEXT GV *       Ienvgv;
1805 IEXT GV *       Isiggv;
1806 IEXT GV *       Iincgv;
1807 IEXT char *     Iorigfilename;
1808 IEXT SV *       Idiehook;
1809 IEXT SV *       Iwarnhook;
1810 IEXT SV *       Iparsehook;
1811
1812 /* Various states of an input record separator SV (rs, nrs) */
1813 #define RsSNARF(sv)   (! SvOK(sv))
1814 #define RsSIMPLE(sv)  (SvOK(sv) && SvCUR(sv))
1815 #define RsPARA(sv)    (SvOK(sv) && ! SvCUR(sv))
1816
1817 /* switches */
1818 IEXT char *     Icddir;
1819 IEXT bool       Iminus_c;
1820 IEXT char       Ipatchlevel[10];
1821 IEXT char **    Ilocalpatches;
1822 IEXT SV *       Inrs;
1823 IEXT char *     Isplitstr IINIT(" ");
1824 IEXT bool       Ipreprocess;
1825 IEXT bool       Iminus_n;
1826 IEXT bool       Iminus_p;
1827 IEXT bool       Iminus_l;
1828 IEXT bool       Iminus_a;
1829 IEXT bool       Iminus_F;
1830 IEXT bool       Idoswitches;
1831 IEXT bool       Idowarn;
1832 IEXT bool       Idoextract;
1833 IEXT bool       Isawampersand;  /* must save all match strings */
1834 IEXT bool       Isawstudy;      /* do fbm_instr on all strings */
1835 IEXT bool       Isawvec;
1836 IEXT bool       Iunsafe;
1837 IEXT char *     Iinplace;
1838 IEXT char *     Ie_tmpname;
1839 IEXT PerlIO *   Ie_fp;
1840 IEXT U32        Iperldb;
1841         /* This value may be raised by extensions for testing purposes */
1842 IEXT int        Iperl_destruct_level IINIT(0);  /* 0=none, 1=full, 2=full with checks */
1843
1844 /* magical thingies */
1845 IEXT Time_t     Ibasetime;              /* $^T */
1846 IEXT SV *       Iformfeed;              /* $^L */
1847 IEXT char *     Ichopset IINIT(" \n-"); /* $: */
1848 IEXT SV *       Irs;                    /* $/ */
1849 IEXT char *     Iofs;                   /* $, */
1850 IEXT STRLEN     Iofslen;
1851 IEXT char *     Iors;                   /* $\ */
1852 IEXT STRLEN     Iorslen;
1853 IEXT char *     Iofmt;                  /* $# */
1854 IEXT I32        Imaxsysfd IINIT(MAXSYSFD); /* top fd to pass to subprocesses */
1855 IEXT int        Imultiline;             /* $*--do strings hold >1 line? */
1856 IEXT I32        Istatusvalue;           /* $? */
1857 #ifdef VMS
1858 IEXT U32        Istatusvalue_vms;
1859 #endif
1860
1861 IEXT struct stat Istatcache;            /* _ */
1862 IEXT GV *       Istatgv;
1863 IEXT SV *       Istatname IINIT(Nullsv);
1864
1865 /* shortcuts to various I/O objects */
1866 IEXT GV *       Istdingv;
1867 IEXT GV *       Ilast_in_gv;
1868 IEXT GV *       Idefgv;
1869 IEXT GV *       Iargvgv;
1870 IEXT GV *       Idefoutgv;
1871 IEXT GV *       Iargvoutgv;
1872
1873 /* shortcuts to regexp stuff */
1874 IEXT GV *       Ileftgv;
1875 IEXT GV *       Iampergv;
1876 IEXT GV *       Irightgv;
1877 IEXT PMOP *     Icurpm;         /* what to do \ interps from */
1878 IEXT I32 *      Iscreamfirst;
1879 IEXT I32 *      Iscreamnext;
1880 IEXT I32        Imaxscream IINIT(-1);
1881 IEXT SV *       Ilastscream;
1882
1883 /* shortcuts to misc objects */
1884 IEXT GV *       Ierrgv;
1885
1886 /* shortcuts to debugging objects */
1887 IEXT GV *       IDBgv;
1888 IEXT GV *       IDBline;
1889 IEXT GV *       IDBsub;
1890 IEXT SV *       IDBsingle;
1891 IEXT SV *       IDBtrace;
1892 IEXT SV *       IDBsignal;
1893 IEXT AV *       Ilineary;       /* lines of script for debugger */
1894 IEXT AV *       Idbargs;        /* args to call listed by caller function */
1895
1896 /* symbol tables */
1897 IEXT HV *       Idefstash;      /* main symbol table */
1898 IEXT HV *       Icurstash;      /* symbol table for current package */
1899 IEXT HV *       Idebstash;      /* symbol table for perldb package */
1900 IEXT HV *       Iglobalstash;   /* global keyword overrides imported here */
1901 IEXT SV *       Icurstname;     /* name of current package */
1902 IEXT AV *       Ibeginav;       /* names of BEGIN subroutines */
1903 IEXT AV *       Iendav;         /* names of END subroutines */
1904 IEXT AV *       Iinitav;        /* names of INIT subroutines */
1905 IEXT HV *       Istrtab;        /* shared string table */
1906
1907 /* memory management */
1908 IEXT SV **      Itmps_stack;
1909 IEXT I32        Itmps_ix IINIT(-1);
1910 IEXT I32        Itmps_floor IINIT(-1);
1911 IEXT I32        Itmps_max;
1912 IEXT I32        Isv_count;      /* how many SV* are currently allocated */
1913 IEXT I32        Isv_objcount;   /* how many objects are currently allocated */
1914 IEXT SV*        Isv_root;       /* storage for SVs belonging to interp */
1915 IEXT SV*        Isv_arenaroot;  /* list of areas for garbage collection */
1916
1917 /* funky return mechanisms */
1918 IEXT I32        Ilastspbase;
1919 IEXT I32        Ilastsize;
1920 IEXT int        Iforkprocess;   /* so do_open |- can return proc# */
1921
1922 /* subprocess state */
1923 IEXT AV *       Ifdpid;         /* keep fd-to-pid mappings for my_popen */
1924
1925 /* internal state */
1926 IEXT VOL int    Iin_eval;       /* trap "fatal" errors? */
1927 IEXT OP *       Irestartop;     /* Are we propagating an error from croak? */
1928 IEXT int        Idelaymagic;    /* ($<,$>) = ... */
1929 IEXT bool       Idirty;         /* In the middle of tearing things down? */
1930 IEXT U8         Ilocalizing;    /* are we processing a local() list? */
1931 IEXT bool       Itainted;       /* using variables controlled by $< */
1932 IEXT bool       Itainting;      /* doing taint checks */
1933 IEXT char *     Iop_mask IINIT(NULL);   /* masked operations for safe evals */
1934
1935 /* trace state */
1936 IEXT I32        Idlevel;
1937 IEXT I32        Idlmax IINIT(128);
1938 IEXT char *     Idebname;
1939 IEXT char *     Idebdelim;
1940
1941 /* current interpreter roots */
1942 IEXT CV *       Imain_cv;
1943 IEXT OP *       Imain_root;
1944 IEXT OP *       Imain_start;
1945 IEXT OP *       Ieval_root;
1946 IEXT OP *       Ieval_start;
1947
1948 /* runtime control stuff */
1949 IEXT COP * VOL  Icurcop IINIT(&compiling);
1950 IEXT COP *      Icurcopdb IINIT(NULL);
1951 IEXT line_t     Icopline IINIT(NOLINE);
1952 IEXT CONTEXT *  Icxstack;
1953 IEXT I32        Icxstack_ix IINIT(-1);
1954 IEXT I32        Icxstack_max IINIT(128);
1955 IEXT JMPENV     Istart_env;     /* empty startup sigjmp() environment */
1956 IEXT JMPENV *   Itop_env;       /* ptr. to current sigjmp() environment */
1957
1958 /* stack stuff */
1959 IEXT AV *       Icurstack;              /* THE STACK */
1960 IEXT AV *       Imainstack;     /* the stack when nothing funny is happening */
1961
1962 /* format accumulators */
1963 IEXT SV *       Iformtarget;
1964 IEXT SV *       Ibodytarget;
1965 IEXT SV *       Itoptarget;
1966
1967 /* statics moved here for shared library purposes */
1968 IEXT SV         Istrchop;       /* return value from chop */
1969 IEXT int        Ifilemode;      /* so nextargv() can preserve mode */
1970 IEXT int        Ilastfd;        /* what to preserve mode on */
1971 IEXT char *     Ioldname;       /* what to preserve mode on */
1972 IEXT char **    IArgv;          /* stuff to free from do_aexec, vfork safe */
1973 IEXT char *     ICmd;           /* stuff to free from do_aexec, vfork safe */
1974 IEXT OP *       Isortcop;       /* user defined sort routine */
1975 IEXT HV *       Isortstash;     /* which is in some package or other */
1976 IEXT GV *       Ifirstgv;       /* $a */
1977 IEXT GV *       Isecondgv;      /* $b */
1978 IEXT AV *       Isortstack;     /* temp stack during pp_sort() */
1979 IEXT AV *       Isignalstack;   /* temp stack during sighandler() */
1980 IEXT SV *       Imystrk;        /* temp key string for do_each() */
1981 IEXT I32        Idumplvl;       /* indentation level on syntax tree dump */
1982 IEXT PMOP *     Ioldlastpm;     /* for saving regexp context during debugger */
1983 IEXT I32        Igensym;        /* next symbol for getsym() to define */
1984 IEXT bool       Ipreambled;
1985 IEXT AV *       Ipreambleav;
1986 IEXT int        Ilaststatval IINIT(-1);
1987 IEXT I32        Ilaststype IINIT(OP_STAT);
1988 IEXT SV *       Imess_sv;
1989
1990 #ifdef USE_THREADS
1991 /* threads stuff */
1992 IEXT SV *       Ithrsv;         /* holds struct thread for main thread */
1993 #endif /* USE_THREADS */
1994
1995 #undef IEXT
1996 #undef IINIT
1997
1998 #ifdef MULTIPLICITY
1999 };
2000 #else
2001 struct interpreter {
2002     char broiled;
2003 };
2004 #endif
2005
2006 #include "thread.h"
2007 #include "pp.h"
2008
2009 START_EXTERN_C
2010 #include "proto.h"
2011
2012 #ifdef EMBED
2013 #define Perl_sv_setptrobj(rv,ptr,name) Perl_sv_setref_iv(rv,name,(IV)ptr)
2014 #define Perl_sv_setptrref(rv,ptr) Perl_sv_setref_iv(rv,Nullch,(IV)ptr)
2015 #else
2016 #define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,(IV)ptr)
2017 #define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,(IV)ptr)
2018 #endif
2019
2020 END_EXTERN_C
2021
2022 /* The following must follow proto.h */
2023
2024 #ifdef DOINIT
2025
2026 EXT MGVTBL vtbl_sv =    {magic_get,
2027                                 magic_set,
2028                                         magic_len,
2029                                                 0,      0};
2030 EXT MGVTBL vtbl_env =   {0,     magic_set_all_env,
2031                                 0,      magic_clear_all_env,
2032                                                         0};
2033 EXT MGVTBL vtbl_envelem =       {0,     magic_setenv,
2034                                         0,      magic_clearenv,
2035                                                         0};
2036 EXT MGVTBL vtbl_sig =   {0,     0,               0, 0, 0};
2037 EXT MGVTBL vtbl_sigelem =       {magic_getsig,
2038                                         magic_setsig,
2039                                         0,      magic_clearsig,
2040                                                         0};
2041 EXT MGVTBL vtbl_pack =  {0,     0,      0,      magic_wipepack,
2042                                                         0};
2043 EXT MGVTBL vtbl_packelem =      {magic_getpack,
2044                                 magic_setpack,
2045                                         0,      magic_clearpack,
2046                                                         0};
2047 EXT MGVTBL vtbl_dbline =        {0,     magic_setdbline,
2048                                         0,      0,      0};
2049 EXT MGVTBL vtbl_isa =   {0,     magic_setisa,
2050                                         0,      magic_setisa,
2051                                                         0};
2052 EXT MGVTBL vtbl_isaelem =       {0,     magic_setisa,
2053                                         0,      0,      0};
2054 EXT MGVTBL vtbl_arylen =        {magic_getarylen,
2055                                 magic_setarylen,
2056                                         0,      0,      0};
2057 EXT MGVTBL vtbl_glob =  {magic_getglob,
2058                                 magic_setglob,
2059                                         0,      0,      0};
2060 EXT MGVTBL vtbl_mglob = {0,     magic_setmglob,
2061                                         0,      0,      0};
2062 EXT MGVTBL vtbl_nkeys = {0,     magic_setnkeys,
2063                                         0,      0,      0};
2064 EXT MGVTBL vtbl_taint = {magic_gettaint,magic_settaint,
2065                                         0,      0,      0};
2066 EXT MGVTBL vtbl_substr =        {0,     magic_setsubstr,
2067                                         0,      0,      0};
2068 EXT MGVTBL vtbl_vec =   {0,     magic_setvec,
2069                                         0,      0,      0};
2070 EXT MGVTBL vtbl_pos =   {magic_getpos,
2071                                 magic_setpos,
2072                                         0,      0,      0};
2073 EXT MGVTBL vtbl_bm =    {0,     magic_setbm,
2074                                         0,      0,      0};
2075 EXT MGVTBL vtbl_fm =    {0,     magic_setfm,
2076                                         0,      0,      0};
2077 EXT MGVTBL vtbl_uvar =  {magic_getuvar,
2078                                 magic_setuvar,
2079                                         0,      0,      0};
2080 #ifdef USE_THREADS
2081 EXT MGVTBL vtbl_mutex = {0,     0,      0,      0,      magic_mutexfree};
2082 #endif /* USE_THREADS */
2083 EXT MGVTBL vtbl_defelem = {magic_getdefelem,magic_setdefelem,
2084                                         0,      0,      magic_freedefelem};
2085
2086 #ifdef USE_LOCALE_COLLATE
2087 EXT MGVTBL vtbl_collxfrm = {0,
2088                                 magic_setcollxfrm,
2089                                         0,      0,      0};
2090 #endif
2091
2092 #ifdef OVERLOAD
2093 EXT MGVTBL vtbl_amagic =       {0,     magic_setamagic,
2094                                         0,      0,      magic_setamagic};
2095 EXT MGVTBL vtbl_amagicelem =   {0,     magic_setamagic,
2096                                         0,      0,      magic_setamagic};
2097 #endif /* OVERLOAD */
2098
2099 #else /* !DOINIT */
2100
2101 EXT MGVTBL vtbl_sv;
2102 EXT MGVTBL vtbl_env;
2103 EXT MGVTBL vtbl_envelem;
2104 EXT MGVTBL vtbl_sig;
2105 EXT MGVTBL vtbl_sigelem;
2106 EXT MGVTBL vtbl_pack;
2107 EXT MGVTBL vtbl_packelem;
2108 EXT MGVTBL vtbl_dbline;
2109 EXT MGVTBL vtbl_isa;
2110 EXT MGVTBL vtbl_isaelem;
2111 EXT MGVTBL vtbl_arylen;
2112 EXT MGVTBL vtbl_glob;
2113 EXT MGVTBL vtbl_mglob;
2114 EXT MGVTBL vtbl_nkeys;
2115 EXT MGVTBL vtbl_taint;
2116 EXT MGVTBL vtbl_substr;
2117 EXT MGVTBL vtbl_vec;
2118 EXT MGVTBL vtbl_pos;
2119 EXT MGVTBL vtbl_bm;
2120 EXT MGVTBL vtbl_fm;
2121 EXT MGVTBL vtbl_uvar;
2122
2123 #ifdef USE_THREADS
2124 EXT MGVTBL vtbl_mutex;
2125 #endif /* USE_THREADS */
2126
2127 EXT MGVTBL vtbl_defelem;
2128
2129 #ifdef USE_LOCALE_COLLATE
2130 EXT MGVTBL vtbl_collxfrm;
2131 #endif
2132
2133 #ifdef OVERLOAD
2134 EXT MGVTBL vtbl_amagic;
2135 EXT MGVTBL vtbl_amagicelem;
2136 #endif /* OVERLOAD */
2137
2138 #endif /* !DOINIT */
2139
2140 #ifdef OVERLOAD
2141
2142 EXT long amagic_generation;
2143
2144 #define NofAMmeth 58
2145 #ifdef DOINIT
2146 EXTCONST char * AMG_names[NofAMmeth] = {
2147   "fallback",   "abs",                  /* "fallback" should be the first. */
2148   "bool",       "nomethod",
2149   "\"\"",       "0+",
2150   "+",          "+=",
2151   "-",          "-=",
2152   "*",          "*=",
2153   "/",          "/=",
2154   "%",          "%=",
2155   "**",         "**=",
2156   "<<",         "<<=",
2157   ">>",         ">>=",
2158   "&",          "&=",
2159   "|",          "|=",
2160   "^",          "^=",
2161   "<",          "<=",
2162   ">",          ">=",
2163   "==",         "!=",
2164   "<=>",        "cmp",
2165   "lt",         "le",
2166   "gt",         "ge",
2167   "eq",         "ne",
2168   "!",          "~",
2169   "++",         "--",
2170   "atan2",      "cos",
2171   "sin",        "exp",
2172   "log",        "sqrt",
2173   "x",          "x=",
2174   ".",          ".=",
2175   "=",          "neg"
2176 };
2177 #else
2178 EXTCONST char * AMG_names[NofAMmeth];
2179 #endif /* def INITAMAGIC */
2180
2181 struct am_table {
2182   long was_ok_sub;
2183   long was_ok_am;
2184   U32 flags;
2185   CV* table[NofAMmeth];
2186   long fallback;
2187 };
2188 struct am_table_short {
2189   long was_ok_sub;
2190   long was_ok_am;
2191   U32 flags;
2192 };
2193 typedef struct am_table AMT;
2194 typedef struct am_table_short AMTS;
2195
2196 #define AMGfallNEVER    1
2197 #define AMGfallNO       2
2198 #define AMGfallYES      3
2199
2200 #define AMTf_AMAGIC             1
2201 #define AMT_AMAGIC(amt)         ((amt)->flags & AMTf_AMAGIC)
2202 #define AMT_AMAGIC_on(amt)      ((amt)->flags |= AMTf_AMAGIC)
2203 #define AMT_AMAGIC_off(amt)     ((amt)->flags &= ~AMTf_AMAGIC)
2204
2205 enum {
2206   fallback_amg, abs_amg,
2207   bool__amg,    nomethod_amg,
2208   string_amg,   numer_amg,
2209   add_amg,      add_ass_amg,
2210   subtr_amg,    subtr_ass_amg,
2211   mult_amg,     mult_ass_amg,
2212   div_amg,      div_ass_amg,
2213   mod_amg,      mod_ass_amg,
2214   pow_amg,      pow_ass_amg,
2215   lshift_amg,   lshift_ass_amg,
2216   rshift_amg,   rshift_ass_amg,
2217   band_amg,     band_ass_amg,
2218   bor_amg,      bor_ass_amg,
2219   bxor_amg,     bxor_ass_amg,
2220   lt_amg,       le_amg,
2221   gt_amg,       ge_amg,
2222   eq_amg,       ne_amg,
2223   ncmp_amg,     scmp_amg,
2224   slt_amg,      sle_amg,
2225   sgt_amg,      sge_amg,
2226   seq_amg,      sne_amg,
2227   not_amg,      compl_amg,
2228   inc_amg,      dec_amg,
2229   atan2_amg,    cos_amg,
2230   sin_amg,      exp_amg,
2231   log_amg,      sqrt_amg,
2232   repeat_amg,   repeat_ass_amg,
2233   concat_amg,   concat_ass_amg,
2234   copy_amg,     neg_amg
2235 };
2236
2237 /*
2238  * some compilers like to redefine cos et alia as faster
2239  * (and less accurate?) versions called F_cos et cetera (Quidquid
2240  * latine dictum sit, altum viditur.)  This trick collides with
2241  * the Perl overloading (amg).  The following #defines fool both.
2242  */
2243
2244 #ifdef _FASTMATH
2245 #   ifdef atan2
2246 #       define F_atan2_amg  atan2_amg
2247 #   endif
2248 #   ifdef cos
2249 #       define F_cos_amg    cos_amg
2250 #   endif
2251 #   ifdef exp
2252 #       define F_exp_amg    exp_amg
2253 #   endif
2254 #   ifdef log
2255 #       define F_log_amg    log_amg
2256 #   endif
2257 #   ifdef pow
2258 #       define F_pow_amg    pow_amg
2259 #   endif
2260 #   ifdef sin
2261 #       define F_sin_amg    sin_amg
2262 #   endif
2263 #   ifdef sqrt
2264 #       define F_sqrt_amg   sqrt_amg
2265 #   endif
2266 #endif /* _FASTMATH */
2267
2268 #endif /* OVERLOAD */
2269
2270 #define PERLDB_ALL      0xff
2271 #define PERLDBf_SUB     0x01            /* Debug sub enter/exit. */
2272 #define PERLDBf_LINE    0x02            /* Keep line #. */
2273 #define PERLDBf_NOOPT   0x04            /* Switch off optimizations. */
2274 #define PERLDBf_INTER   0x08            /* Preserve more data for
2275                                            later inspections.  */
2276 #define PERLDBf_SUBLINE 0x10            /* Keep subr source lines. */
2277 #define PERLDBf_SINGLE  0x20            /* Start with single-step on. */
2278
2279 #define PERLDB_SUB      (perldb && (perldb & PERLDBf_SUB))
2280 #define PERLDB_LINE     (perldb && (perldb & PERLDBf_LINE))
2281 #define PERLDB_NOOPT    (perldb && (perldb & PERLDBf_NOOPT))
2282 #define PERLDB_INTER    (perldb && (perldb & PERLDBf_INTER))
2283 #define PERLDB_SUBLINE  (perldb && (perldb & PERLDBf_SUBLINE))
2284 #define PERLDB_SINGLE   (perldb && (perldb & PERLDBf_SINGLE))
2285
2286 #ifdef USE_LOCALE_COLLATE
2287 EXT U32         collation_ix;           /* Collation generation index */
2288 EXT char *      collation_name;         /* Name of current collation */
2289 EXT bool        collation_standard INIT(TRUE); /* Assume simple collation */
2290 EXT Size_t      collxfrm_base;          /* Basic overhead in *xfrm() */
2291 EXT Size_t      collxfrm_mult INIT(2);  /* Expansion factor in *xfrm() */
2292 #endif /* USE_LOCALE_COLLATE */
2293
2294 #ifdef USE_LOCALE_NUMERIC
2295
2296 EXT char *      numeric_name;           /* Name of current numeric locale */
2297 EXT bool        numeric_standard INIT(TRUE); /* Assume simple numerics */
2298 EXT bool        numeric_local INIT(TRUE);    /* Assume local numerics */
2299
2300 #define SET_NUMERIC_STANDARD() \
2301     STMT_START {                                \
2302         if (! numeric_standard)                 \
2303             perl_set_numeric_standard();        \
2304     } STMT_END
2305
2306 #define SET_NUMERIC_LOCAL() \
2307     STMT_START {                                \
2308         if (! numeric_local)                    \
2309             perl_set_numeric_local();           \
2310     } STMT_END
2311
2312 #else /* !USE_LOCALE_NUMERIC */
2313
2314 #define SET_NUMERIC_STANDARD()  /**/
2315 #define SET_NUMERIC_LOCAL()     /**/
2316
2317 #endif /* !USE_LOCALE_NUMERIC */
2318
2319 #if !defined(PERLIO_IS_STDIO) && defined(HAS_ATTRIBUTE)
2320 /* 
2321  * Now we have __attribute__ out of the way 
2322  * Remap printf 
2323  */
2324 #define printf PerlIO_stdoutf
2325 #endif
2326
2327 /*
2328  * nice_chunk and nice_chunk size need to be set
2329  * and queried under the protection of sv_mutex
2330  */
2331 #define offer_nice_chunk(chunk, chunk_size) do {        \
2332         MUTEX_LOCK(&sv_mutex);                          \
2333         if (!nice_chunk) {                              \
2334             nice_chunk = (char*)(chunk);                \
2335             nice_chunk_size = (chunk_size);             \
2336         }                                               \
2337         MUTEX_UNLOCK(&sv_mutex);                        \
2338     } while (0)
2339
2340 #endif /* Include guard */
2341