5c963cabb48bac8a30c140c2e0b20020cb20d888
[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 #ifdef OP_IN_REGISTER
46 #  ifdef __GNUC__
47 #    define stringify_immed(s) #s
48 #    define stringify(s) stringify_immed(s)
49 register struct op *op asm(stringify(OP_IN_REGISTER));
50 #  endif
51 #endif
52
53 /*
54  * STMT_START { statements; } STMT_END;
55  * can be used as a single statement, as in
56  * if (x) STMT_START { ... } STMT_END; else ...
57  *
58  * Trying to select a version that gives no warnings...
59  */
60 #if !(defined(STMT_START) && defined(STMT_END))
61 # if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(__cplusplus)
62 #   define STMT_START   (void)( /* gcc supports ``({ STATEMENTS; })'' */
63 #   define STMT_END     )
64 # else
65    /* Now which other defined()s do we need here ??? */
66 #  if (VOIDFLAGS) && (defined(sun) || defined(__sun__))
67 #   define STMT_START   if (1)
68 #   define STMT_END     else (void)0
69 #  else
70 #   define STMT_START   do
71 #   define STMT_END     while (0)
72 #  endif
73 # endif
74 #endif
75
76 #define NOOP (void)0
77
78 #define WITH_THR(s) STMT_START { dTHR; s; } STMT_END
79
80 /*
81  * SOFT_CAST can be used for args to prototyped functions to retain some
82  * type checking; it only casts if the compiler does not know prototypes.
83  */
84 #if defined(CAN_PROTOTYPE) && defined(DEBUGGING_COMPILE)
85 #define SOFT_CAST(type) 
86 #else
87 #define SOFT_CAST(type) (type)
88 #endif
89
90 #ifndef BYTEORDER
91 #   define BYTEORDER 0x1234
92 #endif
93
94 /* Overall memory policy? */
95 #ifndef CONSERVATIVE
96 #   define LIBERAL 1
97 #endif
98
99 /*
100  * The following contortions are brought to you on behalf of all the
101  * standards, semi-standards, de facto standards, not-so-de-facto standards
102  * of the world, as well as all the other botches anyone ever thought of.
103  * The basic theory is that if we work hard enough here, the rest of the
104  * code can be a lot prettier.  Well, so much for theory.  Sorry, Henry...
105  */
106
107 /* define this once if either system, instead of cluttering up the src */
108 #if defined(MSDOS) || defined(atarist) || defined(WIN32)
109 #define DOSISH 1
110 #endif
111
112 #if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus)
113 # define STANDARD_C 1
114 #endif
115
116 #if defined(__cplusplus) || defined(WIN32) || defined(__sgi) || defined(OS2) \
117         || defined(__DGUX)
118 # define DONT_DECLARE_STD 1
119 #endif
120
121 #if defined(HASVOLATILE) || defined(STANDARD_C)
122 #   ifdef __cplusplus
123 #       define VOL              // to temporarily suppress warnings
124 #   else
125 #       define VOL volatile
126 #   endif
127 #else
128 #   define VOL
129 #endif
130
131 #define TAINT           (tainted = TRUE)
132 #define TAINT_NOT       (tainted = FALSE)
133 #define TAINT_IF(c)     if (c) { tainted = TRUE; }
134 #define TAINT_ENV()     if (tainting) { taint_env(); }
135 #define TAINT_PROPER(s) if (tainting) { taint_proper(no_security, s); }
136
137 /* XXX All process group stuff is handled in pp_sys.c.  Should these 
138    defines move there?  If so, I could simplify this a lot. --AD  9/96.
139 */
140 /* Process group stuff changed from traditional BSD to POSIX.
141    perlfunc.pod documents the traditional BSD-style syntax, so we'll
142    try to preserve that, if possible.
143 */
144 #ifdef HAS_SETPGID
145 #  define BSD_SETPGRP(pid, pgrp)        setpgid((pid), (pgrp))
146 #else
147 #  if defined(HAS_SETPGRP) && defined(USE_BSD_SETPGRP)
148 #    define BSD_SETPGRP(pid, pgrp)      setpgrp((pid), (pgrp))
149 #  else
150 #    ifdef HAS_SETPGRP2  /* DG/UX */
151 #      define BSD_SETPGRP(pid, pgrp)    setpgrp2((pid), (pgrp))
152 #    endif
153 #  endif
154 #endif
155 #if defined(BSD_SETPGRP) && !defined(HAS_SETPGRP)
156 #  define HAS_SETPGRP  /* Well, effectively it does . . . */
157 #endif
158
159 /* getpgid isn't POSIX, but at least Solaris and Linux have it, and it makes
160     our life easier :-) so we'll try it.
161 */
162 #ifdef HAS_GETPGID
163 #  define BSD_GETPGRP(pid)              getpgid((pid))
164 #else
165 #  if defined(HAS_GETPGRP) && defined(USE_BSD_GETPGRP)
166 #    define BSD_GETPGRP(pid)            getpgrp((pid))
167 #  else
168 #    ifdef HAS_GETPGRP2  /* DG/UX */
169 #      define BSD_GETPGRP(pid)          getpgrp2((pid))
170 #    endif
171 #  endif
172 #endif
173 #if defined(BSD_GETPGRP) && !defined(HAS_GETPGRP)
174 #  define HAS_GETPGRP  /* Well, effectively it does . . . */
175 #endif
176
177 /* These are not exact synonyms, since setpgrp() and getpgrp() may 
178    have different behaviors, but perl.h used to define USE_BSDPGRP
179    (prior to 5.003_05) so some extension might depend on it.
180 */
181 #if defined(USE_BSD_SETPGRP) || defined(USE_BSD_GETPGRP)
182 #  ifndef USE_BSDPGRP
183 #    define USE_BSDPGRP
184 #  endif
185 #endif
186
187 #ifndef _TYPES_         /* If types.h defines this it's easy. */
188 #   ifndef major                /* Does everyone's types.h define this? */
189 #       include <sys/types.h>
190 #   endif
191 #endif
192
193 #ifdef __cplusplus
194 #  ifndef I_STDARG
195 #    define I_STDARG 1
196 #  endif
197 #endif
198
199 #ifdef I_STDARG
200 #  include <stdarg.h>
201 #else
202 #  ifdef I_VARARGS
203 #    include <varargs.h>
204 #  endif
205 #endif
206
207 #include "perlio.h"
208
209 #ifdef USE_NEXT_CTYPE
210
211 #if NX_CURRENT_COMPILER_RELEASE >= 400
212 #include <objc/NXCType.h>
213 #else /*  NX_CURRENT_COMPILER_RELEASE < 400 */
214 #include <appkit/NXCType.h>
215 #endif /*  NX_CURRENT_COMPILER_RELEASE >= 400 */
216
217 #else /* !USE_NEXT_CTYPE */
218 #include <ctype.h>
219 #endif /* USE_NEXT_CTYPE */
220
221 #ifdef METHOD   /* Defined by OSF/1 v3.0 by ctype.h */
222 #undef METHOD
223 #endif
224
225 #ifdef I_LOCALE
226 #   include <locale.h>
227 #endif
228
229 #if !defined(NO_LOCALE) && defined(HAS_SETLOCALE)
230 #   define USE_LOCALE
231 #   if !defined(NO_LOCALE_COLLATE) && defined(LC_COLLATE) \
232        && defined(HAS_STRXFRM)
233 #       define USE_LOCALE_COLLATE
234 #   endif
235 #   if !defined(NO_LOCALE_CTYPE) && defined(LC_CTYPE)
236 #       define USE_LOCALE_CTYPE
237 #   endif
238 #   if !defined(NO_LOCALE_NUMERIC) && defined(LC_NUMERIC)
239 #       define USE_LOCALE_NUMERIC
240 #   endif
241 #endif /* !NO_LOCALE && HAS_SETLOCALE */
242
243 #include <setjmp.h>
244
245 #ifdef I_SYS_PARAM
246 #   ifdef PARAM_NEEDS_TYPES
247 #       include <sys/types.h>
248 #   endif
249 #   include <sys/param.h>
250 #endif
251
252
253 /* Use all the "standard" definitions? */
254 #if defined(STANDARD_C) && defined(I_STDLIB)
255 #   include <stdlib.h>
256 #endif
257
258 #define MEM_SIZE Size_t
259
260 /* This comes after <stdlib.h> so we don't try to change the standard
261  * library prototypes; we'll use our own in proto.h instead. */
262
263 #ifdef MYMALLOC
264
265 #   ifdef HIDEMYMALLOC
266 #       define malloc  Mymalloc
267 #       define calloc  Mycalloc
268 #       define realloc Myremalloc
269 #       define free    Myfree
270 Malloc_t Mymalloc _((MEM_SIZE nbytes));
271 Malloc_t Mycalloc _((MEM_SIZE elements, MEM_SIZE size));
272 Malloc_t Myrealloc _((Malloc_t where, MEM_SIZE nbytes));
273 Free_t   Myfree _((Malloc_t where));
274 #   endif
275 #   ifdef EMBEDMYMALLOC
276 #       define malloc  Perl_malloc
277 #       define calloc  Perl_calloc
278 #       define realloc Perl_realloc
279 #       define free    Perl_free
280 Malloc_t Perl_malloc _((MEM_SIZE nbytes));
281 Malloc_t Perl_calloc _((MEM_SIZE elements, MEM_SIZE size));
282 Malloc_t Perl_realloc _((Malloc_t where, MEM_SIZE nbytes));
283 Free_t   Perl_free _((Malloc_t where));
284 #   endif
285
286 #   undef safemalloc
287 #   undef safecalloc
288 #   undef saferealloc
289 #   undef safefree
290 #   define safemalloc  malloc
291 #   define safecalloc  calloc
292 #   define saferealloc realloc
293 #   define safefree    free
294
295 #endif /* MYMALLOC */
296
297 #if defined(STANDARD_C) && defined(I_STDDEF)
298 #   include <stddef.h>
299 #   define STRUCT_OFFSET(s,m)  offsetof(s,m)
300 #else
301 #   define STRUCT_OFFSET(s,m)  (Size_t)(&(((s *)0)->m))
302 #endif
303
304 #if defined(I_STRING) || defined(__cplusplus)
305 #   include <string.h>
306 #else
307 #   include <strings.h>
308 #endif
309
310 #if !defined(HAS_STRCHR) && defined(HAS_INDEX) && !defined(strchr)
311 #define strchr index
312 #define strrchr rindex
313 #endif
314
315 #ifdef I_MEMORY
316 #  include <memory.h>
317 #endif
318
319 #ifdef HAS_MEMCPY
320 #  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
321 #    ifndef memcpy
322         extern char * memcpy _((char*, char*, int));
323 #    endif
324 #  endif
325 #else
326 #   ifndef memcpy
327 #       ifdef HAS_BCOPY
328 #           define memcpy(d,s,l) bcopy(s,d,l)
329 #       else
330 #           define memcpy(d,s,l) my_bcopy(s,d,l)
331 #       endif
332 #   endif
333 #endif /* HAS_MEMCPY */
334
335 #ifdef HAS_MEMSET
336 #  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
337 #    ifndef memset
338         extern char *memset _((char*, int, int));
339 #    endif
340 #  endif
341 #else
342 #  define memset(d,c,l) my_memset(d,c,l)
343 #endif /* HAS_MEMSET */
344
345 #if !defined(HAS_MEMMOVE) && !defined(memmove)
346 #   if defined(HAS_BCOPY) && defined(HAS_SAFE_BCOPY)
347 #       define memmove(d,s,l) bcopy(s,d,l)
348 #   else
349 #       if defined(HAS_MEMCPY) && defined(HAS_SAFE_MEMCPY)
350 #           define memmove(d,s,l) memcpy(d,s,l)
351 #       else
352 #           define memmove(d,s,l) my_bcopy(s,d,l)
353 #       endif
354 #   endif
355 #endif
356
357 #if defined(mips) && defined(ultrix) && !defined(__STDC__)
358 #   undef HAS_MEMCMP
359 #endif
360
361 #if defined(HAS_MEMCMP) && defined(HAS_SANE_MEMCMP)
362 #  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
363 #    ifndef memcmp
364         extern int memcmp _((char*, char*, int));
365 #    endif
366 #  endif
367 #  ifdef BUGGY_MSC
368   #  pragma function(memcmp)
369 #  endif
370 #else
371 #   ifndef memcmp
372 #       define memcmp   my_memcmp
373 #   endif
374 #endif /* HAS_MEMCMP && HAS_SANE_MEMCMP */
375
376 #ifndef memzero
377 #   ifdef HAS_MEMSET
378 #       define memzero(d,l) memset(d,0,l)
379 #   else
380 #       ifdef HAS_BZERO
381 #           define memzero(d,l) bzero(d,l)
382 #       else
383 #           define memzero(d,l) my_bzero(d,l)
384 #       endif
385 #   endif
386 #endif
387
388 #ifndef HAS_BCMP
389 #   ifndef bcmp
390 #       define bcmp(s1,s2,l) memcmp(s1,s2,l)
391 #   endif
392 #endif /* !HAS_BCMP */
393
394 #ifdef I_NETINET_IN
395 #   include <netinet/in.h>
396 #endif
397
398 #if defined(SF_APPEND) && defined(USE_SFIO) && defined(I_SFIO)
399 /* <sfio.h> defines SF_APPEND and <sys/stat.h> might define SF_APPEND
400  * (the neo-BSD seem to do this).  */
401 #   undef SF_APPEND
402 #endif
403
404 #ifdef I_SYS_STAT
405 #   include <sys/stat.h>
406 #endif
407
408 /* The stat macros for Amdahl UTS, Unisoft System V/88 (and derivatives
409    like UTekV) are broken, sometimes giving false positives.  Undefine
410    them here and let the code below set them to proper values.
411
412    The ghs macro stands for GreenHills Software C-1.8.5 which
413    is the C compiler for sysV88 and the various derivatives.
414    This header file bug is corrected in gcc-2.5.8 and later versions.
415    --Kaveh Ghazi (ghazi@noc.rutgers.edu) 10/3/94.  */
416
417 #if defined(uts) || (defined(m88k) && defined(ghs))
418 #   undef S_ISDIR
419 #   undef S_ISCHR
420 #   undef S_ISBLK
421 #   undef S_ISREG
422 #   undef S_ISFIFO
423 #   undef S_ISLNK
424 #endif
425
426 #ifdef I_TIME
427 #   include <time.h>
428 #endif
429
430 #ifdef I_SYS_TIME
431 #   ifdef I_SYS_TIME_KERNEL
432 #       define KERNEL
433 #   endif
434 #   include <sys/time.h>
435 #   ifdef I_SYS_TIME_KERNEL
436 #       undef KERNEL
437 #   endif
438 #endif
439
440 #if defined(HAS_TIMES) && defined(I_SYS_TIMES)
441 #    include <sys/times.h>
442 #endif
443
444 #if defined(HAS_STRERROR) && (!defined(HAS_MKDIR) || !defined(HAS_RMDIR))
445 #   undef HAS_STRERROR
446 #endif
447
448 #ifndef HAS_MKFIFO
449 #  ifndef mkfifo
450 #    define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
451 #  endif
452 #endif /* !HAS_MKFIFO */
453
454 #include <errno.h>
455 #ifdef HAS_SOCKET
456 #   ifdef I_NET_ERRNO
457 #     include <net/errno.h>
458 #   endif
459 #endif
460
461 #ifdef VMS
462 #   define SETERRNO(errcode,vmserrcode) \
463         STMT_START {                    \
464             set_errno(errcode);         \
465             set_vaxc_errno(vmserrcode); \
466         } STMT_END
467 #else
468 #   define SETERRNO(errcode,vmserrcode) errno = (errcode)
469 #endif
470
471 #ifdef USE_THREADS
472 #  define ERRSV (thr->errsv)
473 #  define ERRHV (thr->errhv)
474 #  define DEFSV *av_fetch(thr->threadsv, find_threadsv("_"), FALSE)
475 #  define SAVE_DEFSV save_threadsv(find_threadsv("_"))
476 #else
477 #  define ERRSV GvSV(errgv)
478 #  define ERRHV GvHV(errgv)
479 #  define DEFSV GvSV(defgv)
480 #  define SAVE_DEFSV SAVESPTR(GvSV(defgv))
481 #endif /* USE_THREADS */
482
483 #ifndef errno
484         extern int errno;     /* ANSI allows errno to be an lvalue expr */
485 #endif
486
487 #ifdef HAS_STRERROR
488 #       ifdef VMS
489         char *strerror _((int,...));
490 #       else
491 #ifndef DONT_DECLARE_STD
492         char *strerror _((int));
493 #endif
494 #       endif
495 #       ifndef Strerror
496 #           define Strerror strerror
497 #       endif
498 #else
499 #    ifdef HAS_SYS_ERRLIST
500         extern int sys_nerr;
501         extern char *sys_errlist[];
502 #       ifndef Strerror
503 #           define Strerror(e) \
504                 ((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e])
505 #       endif
506 #   endif
507 #endif
508
509 #ifdef I_SYS_IOCTL
510 #   ifndef _IOCTL_
511 #       include <sys/ioctl.h>
512 #   endif
513 #endif
514
515 #if defined(mc300) || defined(mc500) || defined(mc700) || defined(mc6000)
516 #   ifdef HAS_SOCKETPAIR
517 #       undef HAS_SOCKETPAIR
518 #   endif
519 #   ifdef I_NDBM
520 #       undef I_NDBM
521 #   endif
522 #endif
523
524 #if INTSIZE == 2
525 #   define htoni htons
526 #   define ntohi ntohs
527 #else
528 #   define htoni htonl
529 #   define ntohi ntohl
530 #endif
531
532 /* Configure already sets Direntry_t */
533 #if defined(I_DIRENT)
534 #   include <dirent.h>
535 #   if defined(NeXT) && defined(I_SYS_DIR) /* NeXT needs dirent + sys/dir.h */
536 #       include <sys/dir.h>
537 #   endif
538 #else
539 #   ifdef I_SYS_NDIR
540 #       include <sys/ndir.h>
541 #   else
542 #       ifdef I_SYS_DIR
543 #           ifdef hp9000s500
544 #               include <ndir.h>        /* may be wrong in the future */
545 #           else
546 #               include <sys/dir.h>
547 #           endif
548 #       endif
549 #   endif
550 #endif
551
552 #ifdef FPUTS_BOTCH
553 /* work around botch in SunOS 4.0.1 and 4.0.2 */
554 #   ifndef fputs
555 #       define fputs(sv,fp) fprintf(fp,"%s",sv)
556 #   endif
557 #endif
558
559 /*
560  * The following gobbledygook brought to you on behalf of __STDC__.
561  * (I could just use #ifndef __STDC__, but this is more bulletproof
562  * in the face of half-implementations.)
563  */
564
565 #ifndef S_IFMT
566 #   ifdef _S_IFMT
567 #       define S_IFMT _S_IFMT
568 #   else
569 #       define S_IFMT 0170000
570 #   endif
571 #endif
572
573 #ifndef S_ISDIR
574 #   define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR)
575 #endif
576
577 #ifndef S_ISCHR
578 #   define S_ISCHR(m) ((m & S_IFMT) == S_IFCHR)
579 #endif
580
581 #ifndef S_ISBLK
582 #   ifdef S_IFBLK
583 #       define S_ISBLK(m) ((m & S_IFMT) == S_IFBLK)
584 #   else
585 #       define S_ISBLK(m) (0)
586 #   endif
587 #endif
588
589 #ifndef S_ISREG
590 #   define S_ISREG(m) ((m & S_IFMT) == S_IFREG)
591 #endif
592
593 #ifndef S_ISFIFO
594 #   ifdef S_IFIFO
595 #       define S_ISFIFO(m) ((m & S_IFMT) == S_IFIFO)
596 #   else
597 #       define S_ISFIFO(m) (0)
598 #   endif
599 #endif
600
601 #ifndef S_ISLNK
602 #   ifdef _S_ISLNK
603 #       define S_ISLNK(m) _S_ISLNK(m)
604 #   else
605 #       ifdef _S_IFLNK
606 #           define S_ISLNK(m) ((m & S_IFMT) == _S_IFLNK)
607 #       else
608 #           ifdef S_IFLNK
609 #               define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK)
610 #           else
611 #               define S_ISLNK(m) (0)
612 #           endif
613 #       endif
614 #   endif
615 #endif
616
617 #ifndef S_ISSOCK
618 #   ifdef _S_ISSOCK
619 #       define S_ISSOCK(m) _S_ISSOCK(m)
620 #   else
621 #       ifdef _S_IFSOCK
622 #           define S_ISSOCK(m) ((m & S_IFMT) == _S_IFSOCK)
623 #       else
624 #           ifdef S_IFSOCK
625 #               define S_ISSOCK(m) ((m & S_IFMT) == S_IFSOCK)
626 #           else
627 #               define S_ISSOCK(m) (0)
628 #           endif
629 #       endif
630 #   endif
631 #endif
632
633 #ifndef S_IRUSR
634 #   ifdef S_IREAD
635 #       define S_IRUSR S_IREAD
636 #       define S_IWUSR S_IWRITE
637 #       define S_IXUSR S_IEXEC
638 #   else
639 #       define S_IRUSR 0400
640 #       define S_IWUSR 0200
641 #       define S_IXUSR 0100
642 #   endif
643 #   define S_IRGRP (S_IRUSR>>3)
644 #   define S_IWGRP (S_IWUSR>>3)
645 #   define S_IXGRP (S_IXUSR>>3)
646 #   define S_IROTH (S_IRUSR>>6)
647 #   define S_IWOTH (S_IWUSR>>6)
648 #   define S_IXOTH (S_IXUSR>>6)
649 #endif
650
651 #ifndef S_ISUID
652 #   define S_ISUID 04000
653 #endif
654
655 #ifndef S_ISGID
656 #   define S_ISGID 02000
657 #endif
658
659 #ifdef ff_next
660 #   undef ff_next
661 #endif
662
663 #if defined(cray) || defined(gould) || defined(i860) || defined(pyr)
664 #   define SLOPPYDIVIDE
665 #endif
666
667 #ifdef UV
668 #undef UV
669 #endif
670
671 /*  XXX QUAD stuff is not currently supported on most systems.
672     Specifically, perl internals don't support long long.  Among
673     the many problems is that some compilers support long long,
674     but the underlying library functions (such as sprintf) don't.
675     Some things do work (such as quad pack/unpack on convex);
676     also some systems use long long for the fpos_t typedef.  That
677     seems to work too.
678
679     The IV type is supposed to be long enough to hold any integral
680     value or a pointer.
681     --Andy Dougherty    August 1996
682 */
683
684 #ifdef cray
685 #   define Quad_t int
686 #else
687 #   ifdef convex
688 #       define Quad_t long long
689 #   else
690 #       if BYTEORDER > 0xFFFF
691 #           define Quad_t long
692 #       endif
693 #   endif
694 #endif
695
696 #ifdef Quad_t
697 #   define HAS_QUAD
698     typedef Quad_t IV;
699     typedef unsigned Quad_t UV;
700 #   define IV_MAX PERL_QUAD_MAX
701 #   define IV_MIN PERL_QUAD_MIN
702 #   define UV_MAX PERL_UQUAD_MAX
703 #   define UV_MIN PERL_UQUAD_MIN
704 #else
705     typedef long IV;
706     typedef unsigned long UV;
707 #   define IV_MAX PERL_LONG_MAX
708 #   define IV_MIN PERL_LONG_MIN
709 #   define UV_MAX PERL_ULONG_MAX
710 #   define UV_MIN PERL_ULONG_MIN
711 #endif
712
713 /* Previously these definitions used hardcoded figures. 
714  * It is hoped these formula are more portable, although
715  * no data one way or another is presently known to me.
716  * The "PERL_" names are used because these calculated constants
717  * do not meet the ANSI requirements for LONG_MAX, etc., which
718  * need to be constants acceptable to #if - kja
719  *    define PERL_LONG_MAX        2147483647L
720  *    define PERL_LONG_MIN        (-LONG_MAX - 1)
721  *    define PERL ULONG_MAX       4294967295L
722  */
723
724 #ifdef I_LIMITS  /* Needed for cast_xxx() functions below. */
725 #  include <limits.h>
726 #else
727 #ifdef I_VALUES
728 #  include <values.h>
729 #endif
730 #endif
731
732 /*
733  * Try to figure out max and min values for the integral types.  THE CORRECT
734  * SOLUTION TO THIS MESS: ADAPT enquire.c FROM GCC INTO CONFIGURE.  The
735  * following hacks are used if neither limits.h or values.h provide them:
736  * U<TYPE>_MAX: for types >= int: ~(unsigned TYPE)0
737  *              for types <  int:  (unsigned TYPE)~(unsigned)0
738  *      The argument to ~ must be unsigned so that later signed->unsigned
739  *      conversion can't modify the value's bit pattern (e.g. -0 -> +0),
740  *      and it must not be smaller than int because ~ does integral promotion.
741  * <type>_MAX: (<type>) (U<type>_MAX >> 1)
742  * <type>_MIN: -<type>_MAX - <is_twos_complement_architecture: (3 & -1) == 3>.
743  *      The latter is a hack which happens to work on some machines but
744  *      does *not* catch any random system, or things like integer types
745  *      with NaN if that is possible.
746  *
747  * All of the types are explicitly cast to prevent accidental loss of
748  * numeric range, and in the hope that they will be less likely to confuse
749  * over-eager optimizers.
750  *
751  */
752
753 #define PERL_UCHAR_MIN ((unsigned char)0)
754
755 #ifdef UCHAR_MAX
756 #  define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
757 #else
758 #  ifdef MAXUCHAR
759 #    define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
760 #  else
761 #    define PERL_UCHAR_MAX       ((unsigned char)~(unsigned)0)
762 #  endif
763 #endif
764  
765 /*
766  * CHAR_MIN and CHAR_MAX are not included here, as the (char) type may be
767  * ambiguous. It may be equivalent to (signed char) or (unsigned char)
768  * depending on local options. Until Configure detects this (or at least
769  * detects whether the "signed" keyword is available) the CHAR ranges
770  * will not be included. UCHAR functions normally.
771  *                                                           - kja
772  */
773
774 #define PERL_USHORT_MIN ((unsigned short)0)
775
776 #ifdef USHORT_MAX
777 #  define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
778 #else
779 #  ifdef MAXUSHORT
780 #    define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
781 #  else
782 #    define PERL_USHORT_MAX       ((unsigned short)~(unsigned)0)
783 #  endif
784 #endif
785
786 #ifdef SHORT_MAX
787 #  define PERL_SHORT_MAX ((short)SHORT_MAX)
788 #else
789 #  ifdef MAXSHORT    /* Often used in <values.h> */
790 #    define PERL_SHORT_MAX ((short)MAXSHORT)
791 #  else
792 #    define PERL_SHORT_MAX      ((short) (PERL_USHORT_MAX >> 1))
793 #  endif
794 #endif
795
796 #ifdef SHORT_MIN
797 #  define PERL_SHORT_MIN ((short)SHORT_MIN)
798 #else
799 #  ifdef MINSHORT
800 #    define PERL_SHORT_MIN ((short)MINSHORT)
801 #  else
802 #    define PERL_SHORT_MIN        (-PERL_SHORT_MAX - ((3 & -1) == 3))
803 #  endif
804 #endif
805
806 #ifdef UINT_MAX
807 #  define PERL_UINT_MAX ((unsigned int)UINT_MAX)
808 #else
809 #  ifdef MAXUINT
810 #    define PERL_UINT_MAX ((unsigned int)MAXUINT)
811 #  else
812 #    define PERL_UINT_MAX       (~(unsigned int)0)
813 #  endif
814 #endif
815
816 #define PERL_UINT_MIN ((unsigned int)0)
817
818 #ifdef INT_MAX
819 #  define PERL_INT_MAX ((int)INT_MAX)
820 #else
821 #  ifdef MAXINT    /* Often used in <values.h> */
822 #    define PERL_INT_MAX ((int)MAXINT)
823 #  else
824 #    define PERL_INT_MAX        ((int)(PERL_UINT_MAX >> 1))
825 #  endif
826 #endif
827
828 #ifdef INT_MIN
829 #  define PERL_INT_MIN ((int)INT_MIN)
830 #else
831 #  ifdef MININT
832 #    define PERL_INT_MIN ((int)MININT)
833 #  else
834 #    define PERL_INT_MIN        (-PERL_INT_MAX - ((3 & -1) == 3))
835 #  endif
836 #endif
837
838 #ifdef ULONG_MAX
839 #  define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
840 #else
841 #  ifdef MAXULONG
842 #    define PERL_ULONG_MAX ((unsigned long)MAXULONG)
843 #  else
844 #    define PERL_ULONG_MAX       (~(unsigned long)0)
845 #  endif
846 #endif
847
848 #define PERL_ULONG_MIN ((unsigned long)0L)
849
850 #ifdef LONG_MAX
851 #  define PERL_LONG_MAX ((long)LONG_MAX)
852 #else
853 #  ifdef MAXLONG    /* Often used in <values.h> */
854 #    define PERL_LONG_MAX ((long)MAXLONG)
855 #  else
856 #    define PERL_LONG_MAX        ((long) (PERL_ULONG_MAX >> 1))
857 #  endif
858 #endif
859
860 #ifdef LONG_MIN
861 #  define PERL_LONG_MIN ((long)LONG_MIN)
862 #else
863 #  ifdef MINLONG
864 #    define PERL_LONG_MIN ((long)MINLONG)
865 #  else
866 #    define PERL_LONG_MIN        (-PERL_LONG_MAX - ((3 & -1) == 3))
867 #  endif
868 #endif
869
870 #ifdef HAS_QUAD
871
872 #  ifdef UQUAD_MAX
873 #    define PERL_UQUAD_MAX ((UV)UQUAD_MAX)
874 #  else
875 #    define PERL_UQUAD_MAX      (~(UV)0)
876 #  endif
877
878 #  define PERL_UQUAD_MIN ((UV)0)
879
880 #  ifdef QUAD_MAX
881 #    define PERL_QUAD_MAX ((IV)QUAD_MAX)
882 #  else
883 #    define PERL_QUAD_MAX       ((IV) (PERL_UQUAD_MAX >> 1))
884 #  endif
885
886 #  ifdef QUAD_MIN
887 #    define PERL_QUAD_MIN ((IV)QUAD_MIN)
888 #  else
889 #    define PERL_QUAD_MIN       (-PERL_QUAD_MAX - ((3 & -1) == 3))
890 #  endif
891
892 #endif
893
894 typedef MEM_SIZE STRLEN;
895
896 typedef struct op OP;
897 typedef struct cop COP;
898 typedef struct unop UNOP;
899 typedef struct binop BINOP;
900 typedef struct listop LISTOP;
901 typedef struct logop LOGOP;
902 typedef struct condop CONDOP;
903 typedef struct pmop PMOP;
904 typedef struct svop SVOP;
905 typedef struct gvop GVOP;
906 typedef struct pvop PVOP;
907 typedef struct loop LOOP;
908
909 typedef struct Outrec Outrec;
910 typedef struct interpreter PerlInterpreter;
911 #ifndef __BORLANDC__
912 typedef struct ff FF;           /* XXX not defined anywhere, should go? */
913 #endif
914 typedef struct sv SV;
915 typedef struct av AV;
916 typedef struct hv HV;
917 typedef struct cv CV;
918 typedef struct regexp REGEXP;
919 typedef struct gp GP;
920 typedef struct gv GV;
921 typedef struct io IO;
922 typedef struct context PERL_CONTEXT;
923 typedef struct block BLOCK;
924
925 typedef struct magic MAGIC;
926 typedef struct xrv XRV;
927 typedef struct xpv XPV;
928 typedef struct xpviv XPVIV;
929 typedef struct xpvuv XPVUV;
930 typedef struct xpvnv XPVNV;
931 typedef struct xpvmg XPVMG;
932 typedef struct xpvlv XPVLV;
933 typedef struct xpvav XPVAV;
934 typedef struct xpvhv XPVHV;
935 typedef struct xpvgv XPVGV;
936 typedef struct xpvcv XPVCV;
937 typedef struct xpvbm XPVBM;
938 typedef struct xpvfm XPVFM;
939 typedef struct xpvio XPVIO;
940 typedef struct mgvtbl MGVTBL;
941 typedef union any ANY;
942
943 #include "handy.h"
944
945 typedef I32 (*filter_t) _((int, SV *, int));
946 #define FILTER_READ(idx, sv, len)  filter_read(idx, sv, len)
947 #define FILTER_DATA(idx)           (AvARRAY(rsfp_filters)[idx])
948 #define FILTER_ISREADER(idx)       (idx >= AvFILLp(rsfp_filters))
949
950 #ifdef DOSISH
951 # if defined(OS2)
952 #   include "os2ish.h"
953 # else
954 #   include "dosish.h"
955 # endif
956 #else
957 # if defined(VMS)
958 #   include "vmsish.h"
959 # else
960 #   if defined(PLAN9)
961 #     include "./plan9/plan9ish.h"
962 #   else
963 #     include "unixish.h"
964 #   endif
965 # endif
966 #endif         
967
968 /* 
969  * USE_THREADS needs to be after unixish.h as <pthread.h> includes
970  * <sys/signal.h> which defines NSIG - which will stop inclusion of <signal.h>
971  * this results in many functions being undeclared which bothers C++
972  * May make sense to have threads after "*ish.h" anyway
973  */
974
975 #ifdef USE_THREADS
976 #  ifdef FAKE_THREADS
977 #    include "fakethr.h"
978 #  else
979 #    ifdef WIN32
980 #      include <win32thread.h>
981 #    else
982 #      ifdef OS2
983 #        include "os2thread.h"
984 #      else
985 #        include <pthread.h>
986 typedef pthread_t perl_os_thread;
987 typedef pthread_mutex_t perl_mutex;
988 typedef pthread_cond_t perl_cond;
989 typedef pthread_key_t perl_key;
990 #      endif /* OS2 */
991 #    endif /* WIN32 */
992 #  endif /* FAKE_THREADS */
993 #endif /* USE_THREADS */
994
995
996   
997 #ifdef VMS
998 #   define STATUS_NATIVE        statusvalue_vms
999 #   define STATUS_NATIVE_EXPORT \
1000         ((I32)statusvalue_vms == -1 ? 44 : statusvalue_vms)
1001 #   define STATUS_NATIVE_SET(n)                                         \
1002         STMT_START {                                                    \
1003             statusvalue_vms = (n);                                      \
1004             if ((I32)statusvalue_vms == -1)                             \
1005                 statusvalue = -1;                                       \
1006             else if (statusvalue_vms & STS$M_SUCCESS)                   \
1007                 statusvalue = 0;                                        \
1008             else if ((statusvalue_vms & STS$M_SEVERITY) == 0)           \
1009                 statusvalue = 1 << 8;                                   \
1010             else                                                        \
1011                 statusvalue = (statusvalue_vms & STS$M_SEVERITY) << 8;  \
1012         } STMT_END
1013 #   define STATUS_POSIX statusvalue
1014 #   ifdef VMSISH_STATUS
1015 #       define STATUS_CURRENT   (VMSISH_STATUS ? STATUS_NATIVE : STATUS_POSIX)
1016 #   else
1017 #       define STATUS_CURRENT   STATUS_POSIX
1018 #   endif
1019 #   define STATUS_POSIX_SET(n)                          \
1020         STMT_START {                                    \
1021             statusvalue = (n);                          \
1022             if (statusvalue != -1) {                    \
1023                 statusvalue &= 0xFFFF;                  \
1024                 statusvalue_vms = statusvalue ? 44 : 1; \
1025             }                                           \
1026             else statusvalue_vms = -1;                  \
1027         } STMT_END
1028 #   define STATUS_ALL_SUCCESS   (statusvalue = 0, statusvalue_vms = 1)
1029 #   define STATUS_ALL_FAILURE   (statusvalue = 1, statusvalue_vms = 44)
1030 #else
1031 #   define STATUS_NATIVE        STATUS_POSIX
1032 #   define STATUS_NATIVE_EXPORT STATUS_POSIX
1033 #   define STATUS_NATIVE_SET    STATUS_POSIX_SET
1034 #   define STATUS_POSIX         statusvalue
1035 #   define STATUS_POSIX_SET(n)          \
1036         STMT_START {                    \
1037             statusvalue = (n);          \
1038             if (statusvalue != -1)      \
1039                 statusvalue &= 0xFFFF;  \
1040         } STMT_END
1041 #   define STATUS_CURRENT STATUS_POSIX
1042 #   define STATUS_ALL_SUCCESS   (statusvalue = 0)
1043 #   define STATUS_ALL_FAILURE   (statusvalue = 1)
1044 #endif
1045
1046 /* Some unistd.h's give a prototype for pause() even though
1047    HAS_PAUSE ends up undefined.  This causes the #define
1048    below to be rejected by the compmiler.  Sigh.
1049 */
1050 #ifdef HAS_PAUSE
1051 #define Pause   pause
1052 #else
1053 #define Pause() sleep((32767<<16)+32767)
1054 #endif
1055
1056 #ifndef IOCPARM_LEN
1057 #   ifdef IOCPARM_MASK
1058         /* on BSDish systes we're safe */
1059 #       define IOCPARM_LEN(x)  (((x) >> 16) & IOCPARM_MASK)
1060 #   else
1061         /* otherwise guess at what's safe */
1062 #       define IOCPARM_LEN(x)   256
1063 #   endif
1064 #endif
1065
1066 union any {
1067     void*       any_ptr;
1068     I32         any_i32;
1069     IV          any_iv;
1070     long        any_long;
1071     void        (*any_dptr) _((void*));
1072 };
1073
1074 #ifdef USE_THREADS
1075 #define ARGSproto struct perl_thread *thr
1076 #else
1077 #define ARGSproto void
1078 #endif /* USE_THREADS */
1079
1080 /* Work around some cygwin32 problems with importing global symbols */
1081 #if defined(CYGWIN32) && defined(DLLIMPORT) 
1082 #   include "cw32imp.h"
1083 #endif
1084
1085 #include "regexp.h"
1086 #include "sv.h"
1087 #include "util.h"
1088 #include "form.h"
1089 #include "gv.h"
1090 #include "cv.h"
1091 #include "opcode.h"
1092 #include "op.h"
1093 #include "cop.h"
1094 #include "av.h"
1095 #include "hv.h"
1096 #include "mg.h"
1097 #include "scope.h"
1098
1099 /* work around some libPW problems */
1100 #ifdef DOINIT
1101 EXT char Error[1];
1102 #endif
1103
1104 #if defined(iAPX286) || defined(M_I286) || defined(I80286)
1105 #   define I286
1106 #endif
1107
1108 #if defined(htonl) && !defined(HAS_HTONL)
1109 #define HAS_HTONL
1110 #endif
1111 #if defined(htons) && !defined(HAS_HTONS)
1112 #define HAS_HTONS
1113 #endif
1114 #if defined(ntohl) && !defined(HAS_NTOHL)
1115 #define HAS_NTOHL
1116 #endif
1117 #if defined(ntohs) && !defined(HAS_NTOHS)
1118 #define HAS_NTOHS
1119 #endif
1120 #ifndef HAS_HTONL
1121 #if (BYTEORDER & 0xffff) != 0x4321
1122 #define HAS_HTONS
1123 #define HAS_HTONL
1124 #define HAS_NTOHS
1125 #define HAS_NTOHL
1126 #define MYSWAP
1127 #define htons my_swap
1128 #define htonl my_htonl
1129 #define ntohs my_swap
1130 #define ntohl my_ntohl
1131 #endif
1132 #else
1133 #if (BYTEORDER & 0xffff) == 0x4321
1134 #undef HAS_HTONS
1135 #undef HAS_HTONL
1136 #undef HAS_NTOHS
1137 #undef HAS_NTOHL
1138 #endif
1139 #endif
1140
1141 /*
1142  * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
1143  * -DWS
1144  */
1145 #if BYTEORDER != 0x1234
1146 # define HAS_VTOHL
1147 # define HAS_VTOHS
1148 # define HAS_HTOVL
1149 # define HAS_HTOVS
1150 # if BYTEORDER == 0x4321
1151 #  define vtohl(x)      ((((x)&0xFF)<<24)       \
1152                         +(((x)>>24)&0xFF)       \
1153                         +(((x)&0x0000FF00)<<8)  \
1154                         +(((x)&0x00FF0000)>>8)  )
1155 #  define vtohs(x)      ((((x)&0xFF)<<8) + (((x)>>8)&0xFF))
1156 #  define htovl(x)      vtohl(x)
1157 #  define htovs(x)      vtohs(x)
1158 # endif
1159         /* otherwise default to functions in util.c */
1160 #endif
1161
1162 #ifdef CASTNEGFLOAT
1163 #define U_S(what) ((U16)(what))
1164 #define U_I(what) ((unsigned int)(what))
1165 #define U_L(what) ((U32)(what))
1166 #else
1167 EXTERN_C U32 cast_ulong _((double));
1168 #define U_S(what) ((U16)cast_ulong((double)(what)))
1169 #define U_I(what) ((unsigned int)cast_ulong((double)(what)))
1170 #define U_L(what) (cast_ulong((double)(what)))
1171 #endif
1172
1173 #ifdef CASTI32
1174 #define I_32(what) ((I32)(what))
1175 #define I_V(what) ((IV)(what))
1176 #define U_V(what) ((UV)(what))
1177 #else
1178 START_EXTERN_C
1179 I32 cast_i32 _((double));
1180 IV cast_iv _((double));
1181 UV cast_uv _((double));
1182 END_EXTERN_C
1183 #define I_32(what) (cast_i32((double)(what)))
1184 #define I_V(what) (cast_iv((double)(what)))
1185 #define U_V(what) (cast_uv((double)(what)))
1186 #endif
1187
1188 struct Outrec {
1189     I32         o_lines;
1190     char        *o_str;
1191     U32         o_len;
1192 };
1193
1194 #ifndef MAXSYSFD
1195 #   define MAXSYSFD 2
1196 #endif
1197
1198 #ifndef TMPPATH
1199 #  define TMPPATH "/tmp/perl-eXXXXXX"
1200 #endif
1201
1202 #ifndef __cplusplus
1203 Uid_t getuid _((void));
1204 Uid_t geteuid _((void));
1205 Gid_t getgid _((void));
1206 Gid_t getegid _((void));
1207 #endif
1208
1209 #ifdef DEBUGGING
1210 #ifndef Perl_debug_log
1211 #define Perl_debug_log  PerlIO_stderr()
1212 #endif
1213 #define YYDEBUG 1
1214 #define DEB(a)                          a
1215 #define DEBUG(a)   if (debug)           a
1216 #define DEBUG_p(a) if (debug & 1)       a
1217 #define DEBUG_s(a) if (debug & 2)       a
1218 #define DEBUG_l(a) if (debug & 4)       a
1219 #define DEBUG_t(a) if (debug & 8)       a
1220 #define DEBUG_o(a) if (debug & 16)      a
1221 #define DEBUG_c(a) if (debug & 32)      a
1222 #define DEBUG_P(a) if (debug & 64)      a
1223 #define DEBUG_m(a) if (curinterp && debug & 128)        a
1224 #define DEBUG_f(a) if (debug & 256)     a
1225 #define DEBUG_r(a) if (debug & 512)     a
1226 #define DEBUG_x(a) if (debug & 1024)    a
1227 #define DEBUG_u(a) if (debug & 2048)    a
1228 #define DEBUG_L(a) if (debug & 4096)    a
1229 #define DEBUG_H(a) if (debug & 8192)    a
1230 #define DEBUG_X(a) if (debug & 16384)   a
1231 #define DEBUG_D(a) if (debug & 32768)   a
1232 #else
1233 #define DEB(a)
1234 #define DEBUG(a)
1235 #define DEBUG_p(a)
1236 #define DEBUG_s(a)
1237 #define DEBUG_l(a)
1238 #define DEBUG_t(a)
1239 #define DEBUG_o(a)
1240 #define DEBUG_c(a)
1241 #define DEBUG_P(a)
1242 #define DEBUG_m(a)
1243 #define DEBUG_f(a)
1244 #define DEBUG_r(a)
1245 #define DEBUG_x(a)
1246 #define DEBUG_u(a)
1247 #define DEBUG_L(a)
1248 #define DEBUG_H(a)
1249 #define DEBUG_X(a)
1250 #define DEBUG_D(a)
1251 #endif
1252 #define YYMAXDEPTH 300
1253
1254 #ifndef assert  /* <assert.h> might have been included somehow */
1255 #define assert(what)    DEB( {                                          \
1256         if (!(what)) {                                                  \
1257             croak("Assertion failed: file \"%s\", line %d",             \
1258                 __FILE__, __LINE__);                                    \
1259             exit(1);                                                    \
1260         }})
1261 #endif
1262
1263 struct ufuncs {
1264     I32 (*uf_val)_((IV, SV*));
1265     I32 (*uf_set)_((IV, SV*));
1266     IV uf_index;
1267 };
1268
1269 /* Fix these up for __STDC__ */
1270 #ifndef DONT_DECLARE_STD
1271 char *mktemp _((char*));
1272 double atof _((const char*));
1273 #endif
1274
1275 #ifndef STANDARD_C
1276 /* All of these are in stdlib.h or time.h for ANSI C */
1277 Time_t time();
1278 struct tm *gmtime(), *localtime();
1279 char *strchr(), *strrchr();
1280 char *strcpy(), *strcat();
1281 #endif /* ! STANDARD_C */
1282
1283
1284 #ifdef I_MATH
1285 #    include <math.h>
1286 #else
1287 START_EXTERN_C
1288             double exp _((double));
1289             double log _((double));
1290             double log10 _((double));
1291             double sqrt _((double));
1292             double frexp _((double,int*));
1293             double ldexp _((double,int));
1294             double modf _((double,double*));
1295             double sin _((double));
1296             double cos _((double));
1297             double atan2 _((double,double));
1298             double pow _((double,double));
1299 END_EXTERN_C
1300 #endif
1301
1302 #ifndef __cplusplus
1303 #  ifdef __NeXT__ /* or whatever catches all NeXTs */
1304 char *crypt ();       /* Maybe more hosts will need the unprototyped version */
1305 #  else
1306 #    if !defined(WIN32) || !defined(HAVE_DES_FCRYPT)
1307 char *crypt _((const char*, const char*));
1308 #    endif /* !WIN32 && !HAVE_CRYPT_SOURCE */
1309 #  endif /* !__NeXT__ */
1310 #  ifndef DONT_DECLARE_STD
1311 #    ifndef getenv
1312 char *getenv _((const char*));
1313 #    endif /* !getenv */
1314 Off_t lseek _((int,Off_t,int));
1315 #  endif /* !DONT_DECLARE_STD */
1316 char *getlogin _((void));
1317 #endif /* !__cplusplus */
1318
1319 #ifdef UNLINK_ALL_VERSIONS /* Currently only makes sense for VMS */
1320 #define UNLINK unlnk
1321 I32 unlnk _((char*));
1322 #else
1323 #define UNLINK unlink
1324 #endif
1325
1326 #ifndef HAS_SETREUID
1327 #  ifdef HAS_SETRESUID
1328 #    define setreuid(r,e) setresuid(r,e,(Uid_t)-1)
1329 #    define HAS_SETREUID
1330 #  endif
1331 #endif
1332 #ifndef HAS_SETREGID
1333 #  ifdef HAS_SETRESGID
1334 #    define setregid(r,e) setresgid(r,e,(Gid_t)-1)
1335 #    define HAS_SETREGID
1336 #  endif
1337 #endif
1338
1339 typedef Signal_t (*Sighandler_t) _((int));
1340
1341 #ifdef HAS_SIGACTION
1342 typedef struct sigaction Sigsave_t;
1343 #else
1344 typedef Sighandler_t Sigsave_t;
1345 #endif
1346
1347 #define SCAN_DEF 0
1348 #define SCAN_TR 1
1349 #define SCAN_REPL 2
1350
1351 #ifdef DEBUGGING
1352 # ifndef register
1353 #  define register
1354 # endif
1355 # define PAD_SV(po) pad_sv(po)
1356 # define RUNOPS_DEFAULT runops_debug
1357 #else
1358 # define PAD_SV(po) curpad[po]
1359 # define RUNOPS_DEFAULT runops_standard
1360 #endif
1361
1362 #ifdef MYMALLOC
1363 #  define MALLOC_INIT MUTEX_INIT(&malloc_mutex)
1364 #  define MALLOC_TERM MUTEX_DESTROY(&malloc_mutex)
1365 #else
1366 #  define MALLOC_INIT
1367 #  define MALLOC_TERM
1368 #endif
1369
1370
1371 /*
1372  * These need prototyping here because <proto.h> isn't
1373  * included until after runops is initialised.
1374  */
1375
1376 typedef int runops_proc_t _((void));
1377 int runops_standard _((void));
1378 #ifdef DEBUGGING
1379 int runops_debug _((void));
1380 #endif
1381
1382 #define THREADSV_NAMES "_123456789&`'+/.,\\\";^-%=|~:\001\005!@"
1383
1384 /* VMS doesn't use environ array and NeXT has problems with crt0.o globals */
1385 #if !defined(VMS) && !(defined(NeXT) && defined(__DYNAMIC__))
1386 #if !defined(DONT_DECLARE_STD) \
1387         || (defined(__svr4__) && defined(__GNUC__) && defined(sun)) \
1388         || defined(__sgi) || defined(__DGUX)
1389 extern char **  environ;        /* environment variables supplied via exec */
1390 #endif
1391 #else
1392 #  if defined(NeXT) && defined(__DYNAMIC__)
1393
1394 #  include <mach-o/dyld.h>
1395 EXT char *** environ_pointer;
1396 #  define environ (*environ_pointer)
1397 #  endif
1398 #endif /* environ processing */
1399
1400
1401 /* for tmp use in stupid debuggers */
1402 EXT int *       di;
1403 EXT short *     ds;
1404 EXT char *      dc;
1405
1406 /* handy constants */
1407 EXTCONST char warn_uninit[]
1408   INIT("Use of uninitialized value");
1409 EXTCONST char warn_nosemi[]
1410   INIT("Semicolon seems to be missing");
1411 EXTCONST char warn_reserved[]
1412   INIT("Unquoted string \"%s\" may clash with future reserved word");
1413 EXTCONST char warn_nl[]
1414   INIT("Unsuccessful %s on filename containing newline");
1415 EXTCONST char no_wrongref[]
1416   INIT("Can't use %s ref as %s ref");
1417 EXTCONST char no_symref[]
1418   INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
1419 EXTCONST char no_usym[]
1420   INIT("Can't use an undefined value as %s reference");
1421 EXTCONST char no_aelem[]
1422   INIT("Modification of non-creatable array value attempted, subscript %d");
1423 EXTCONST char no_helem[]
1424   INIT("Modification of non-creatable hash value attempted, subscript \"%s\"");
1425 EXTCONST char no_modify[]
1426   INIT("Modification of a read-only value attempted");
1427 EXTCONST char no_mem[]
1428   INIT("Out of memory!\n");
1429 EXTCONST char no_security[]
1430   INIT("Insecure dependency in %s%s");
1431 EXTCONST char no_sock_func[]
1432   INIT("Unsupported socket function \"%s\" called");
1433 EXTCONST char no_dir_func[]
1434   INIT("Unsupported directory function \"%s\" called");
1435 EXTCONST char no_func[]
1436   INIT("The %s function is unimplemented");
1437 EXTCONST char no_myglob[]
1438   INIT("\"my\" variable %s can't be in a package");
1439
1440 #ifdef DOINIT
1441 EXT char *sig_name[] = { SIG_NAME };
1442 EXT int   sig_num[]  = { SIG_NUM };
1443 EXT SV  * psig_ptr[sizeof(sig_num)/sizeof(*sig_num)];
1444 EXT SV  * psig_name[sizeof(sig_num)/sizeof(*sig_num)];
1445 #else
1446 EXT char *sig_name[];
1447 EXT int   sig_num[];
1448 EXT SV  * psig_ptr[];
1449 EXT SV  * psig_name[];
1450 #endif
1451
1452 /* fast case folding tables */
1453
1454 #ifdef DOINIT
1455 EXTCONST  unsigned char fold[] = {
1456         0,      1,      2,      3,      4,      5,      6,      7,
1457         8,      9,      10,     11,     12,     13,     14,     15,
1458         16,     17,     18,     19,     20,     21,     22,     23,
1459         24,     25,     26,     27,     28,     29,     30,     31,
1460         32,     33,     34,     35,     36,     37,     38,     39,
1461         40,     41,     42,     43,     44,     45,     46,     47,
1462         48,     49,     50,     51,     52,     53,     54,     55,
1463         56,     57,     58,     59,     60,     61,     62,     63,
1464         64,     'a',    'b',    'c',    'd',    'e',    'f',    'g',
1465         'h',    'i',    'j',    'k',    'l',    'm',    'n',    'o',
1466         'p',    'q',    'r',    's',    't',    'u',    'v',    'w',
1467         'x',    'y',    'z',    91,     92,     93,     94,     95,
1468         96,     'A',    'B',    'C',    'D',    'E',    'F',    'G',
1469         'H',    'I',    'J',    'K',    'L',    'M',    'N',    'O',
1470         'P',    'Q',    'R',    'S',    'T',    'U',    'V',    'W',
1471         'X',    'Y',    'Z',    123,    124,    125,    126,    127,
1472         128,    129,    130,    131,    132,    133,    134,    135,
1473         136,    137,    138,    139,    140,    141,    142,    143,
1474         144,    145,    146,    147,    148,    149,    150,    151,
1475         152,    153,    154,    155,    156,    157,    158,    159,
1476         160,    161,    162,    163,    164,    165,    166,    167,
1477         168,    169,    170,    171,    172,    173,    174,    175,
1478         176,    177,    178,    179,    180,    181,    182,    183,
1479         184,    185,    186,    187,    188,    189,    190,    191,
1480         192,    193,    194,    195,    196,    197,    198,    199,
1481         200,    201,    202,    203,    204,    205,    206,    207,
1482         208,    209,    210,    211,    212,    213,    214,    215,
1483         216,    217,    218,    219,    220,    221,    222,    223,    
1484         224,    225,    226,    227,    228,    229,    230,    231,
1485         232,    233,    234,    235,    236,    237,    238,    239,
1486         240,    241,    242,    243,    244,    245,    246,    247,
1487         248,    249,    250,    251,    252,    253,    254,    255
1488 };
1489 #else
1490 EXTCONST unsigned char fold[];
1491 #endif
1492
1493 #ifdef DOINIT
1494 EXT unsigned char fold_locale[] = {
1495         0,      1,      2,      3,      4,      5,      6,      7,
1496         8,      9,      10,     11,     12,     13,     14,     15,
1497         16,     17,     18,     19,     20,     21,     22,     23,
1498         24,     25,     26,     27,     28,     29,     30,     31,
1499         32,     33,     34,     35,     36,     37,     38,     39,
1500         40,     41,     42,     43,     44,     45,     46,     47,
1501         48,     49,     50,     51,     52,     53,     54,     55,
1502         56,     57,     58,     59,     60,     61,     62,     63,
1503         64,     'a',    'b',    'c',    'd',    'e',    'f',    'g',
1504         'h',    'i',    'j',    'k',    'l',    'm',    'n',    'o',
1505         'p',    'q',    'r',    's',    't',    'u',    'v',    'w',
1506         'x',    'y',    'z',    91,     92,     93,     94,     95,
1507         96,     'A',    'B',    'C',    'D',    'E',    'F',    'G',
1508         'H',    'I',    'J',    'K',    'L',    'M',    'N',    'O',
1509         'P',    'Q',    'R',    'S',    'T',    'U',    'V',    'W',
1510         'X',    'Y',    'Z',    123,    124,    125,    126,    127,
1511         128,    129,    130,    131,    132,    133,    134,    135,
1512         136,    137,    138,    139,    140,    141,    142,    143,
1513         144,    145,    146,    147,    148,    149,    150,    151,
1514         152,    153,    154,    155,    156,    157,    158,    159,
1515         160,    161,    162,    163,    164,    165,    166,    167,
1516         168,    169,    170,    171,    172,    173,    174,    175,
1517         176,    177,    178,    179,    180,    181,    182,    183,
1518         184,    185,    186,    187,    188,    189,    190,    191,
1519         192,    193,    194,    195,    196,    197,    198,    199,
1520         200,    201,    202,    203,    204,    205,    206,    207,
1521         208,    209,    210,    211,    212,    213,    214,    215,
1522         216,    217,    218,    219,    220,    221,    222,    223,    
1523         224,    225,    226,    227,    228,    229,    230,    231,
1524         232,    233,    234,    235,    236,    237,    238,    239,
1525         240,    241,    242,    243,    244,    245,    246,    247,
1526         248,    249,    250,    251,    252,    253,    254,    255
1527 };
1528 #else
1529 EXT unsigned char fold_locale[];
1530 #endif
1531
1532 #ifdef DOINIT
1533 EXTCONST unsigned char freq[] = {       /* letter frequencies for mixed English/C */
1534         1,      2,      84,     151,    154,    155,    156,    157,
1535         165,    246,    250,    3,      158,    7,      18,     29,
1536         40,     51,     62,     73,     85,     96,     107,    118,
1537         129,    140,    147,    148,    149,    150,    152,    153,
1538         255,    182,    224,    205,    174,    176,    180,    217,
1539         233,    232,    236,    187,    235,    228,    234,    226,
1540         222,    219,    211,    195,    188,    193,    185,    184,
1541         191,    183,    201,    229,    181,    220,    194,    162,
1542         163,    208,    186,    202,    200,    218,    198,    179,
1543         178,    214,    166,    170,    207,    199,    209,    206,
1544         204,    160,    212,    216,    215,    192,    175,    173,
1545         243,    172,    161,    190,    203,    189,    164,    230,
1546         167,    248,    227,    244,    242,    255,    241,    231,
1547         240,    253,    169,    210,    245,    237,    249,    247,
1548         239,    168,    252,    251,    254,    238,    223,    221,
1549         213,    225,    177,    197,    171,    196,    159,    4,
1550         5,      6,      8,      9,      10,     11,     12,     13,
1551         14,     15,     16,     17,     19,     20,     21,     22,
1552         23,     24,     25,     26,     27,     28,     30,     31,
1553         32,     33,     34,     35,     36,     37,     38,     39,
1554         41,     42,     43,     44,     45,     46,     47,     48,
1555         49,     50,     52,     53,     54,     55,     56,     57,
1556         58,     59,     60,     61,     63,     64,     65,     66,
1557         67,     68,     69,     70,     71,     72,     74,     75,
1558         76,     77,     78,     79,     80,     81,     82,     83,
1559         86,     87,     88,     89,     90,     91,     92,     93,
1560         94,     95,     97,     98,     99,     100,    101,    102,
1561         103,    104,    105,    106,    108,    109,    110,    111,
1562         112,    113,    114,    115,    116,    117,    119,    120,
1563         121,    122,    123,    124,    125,    126,    127,    128,
1564         130,    131,    132,    133,    134,    135,    136,    137,
1565         138,    139,    141,    142,    143,    144,    145,    146
1566 };
1567 #else
1568 EXTCONST unsigned char freq[];
1569 #endif
1570
1571 #ifdef DEBUGGING
1572 #ifdef DOINIT
1573 EXTCONST char* block_type[] = {
1574         "NULL",
1575         "SUB",
1576         "EVAL",
1577         "LOOP",
1578         "SUBST",
1579         "BLOCK",
1580 };
1581 #else
1582 EXTCONST char* block_type[];
1583 #endif
1584 #endif
1585
1586 /*****************************************************************************/
1587 /* This lexer/parser stuff is currently global since yacc is hard to reenter */
1588 /*****************************************************************************/
1589 /* XXX This needs to be revisited, since BEGIN makes yacc re-enter... */
1590
1591 #include "perly.h"
1592
1593 #define LEX_NOTPARSING          11      /* borrowed from toke.c */
1594
1595 typedef enum {
1596     XOPERATOR,
1597     XTERM,
1598     XREF,
1599     XSTATE,
1600     XBLOCK,
1601     XTERMBLOCK
1602 } expectation;
1603
1604
1605                                 /* Note: the lowest 8 bits are reserved for
1606                                    stuffing into op->op_private */
1607 #define HINT_INTEGER            0x00000001
1608 #define HINT_STRICT_REFS        0x00000002
1609
1610 #define HINT_BLOCK_SCOPE        0x00000100
1611 #define HINT_STRICT_SUBS        0x00000200
1612 #define HINT_STRICT_VARS        0x00000400
1613 #define HINT_LOCALE             0x00000800
1614
1615 /* Various states of an input record separator SV (rs, nrs) */
1616 #define RsSNARF(sv)   (! SvOK(sv))
1617 #define RsSIMPLE(sv)  (SvOK(sv) && SvCUR(sv))
1618 #define RsPARA(sv)    (SvOK(sv) && ! SvCUR(sv))
1619
1620 /* Set up PERLVAR macros for populating structs */
1621 #define PERLVAR(var,type) type var;
1622 #define PERLVARI(var,type,init) type var;
1623 #define PERLVARIC(var,type,init) type var;
1624
1625 #ifdef PERL_GLOBAL_STRUCT
1626 struct perl_vars {
1627 #include "perlvars.h"
1628 };
1629
1630 #ifdef PERL_CORE
1631 EXT struct perl_vars Perl_Vars;
1632 EXT struct perl_vars *Perl_VarsPtr INIT(&Perl_Vars);
1633 #else
1634 #if !defined(__GNUC__) || !defined(WIN32)
1635 EXT
1636 #endif
1637 struct perl_vars *Perl_VarsPtr;
1638 #define Perl_Vars (*((Perl_VarsPtr) ? Perl_VarsPtr : (Perl_VarsPtr =  Perl_GetVars())))
1639 #endif
1640 #endif /* PERL_GLOBAL_STRUCT */
1641
1642 #ifdef MULTIPLICITY
1643 /* If we have multiple interpreters define a struct 
1644    holding variables which must be per-interpreter
1645    If we don't have threads anything that would have 
1646    be per-thread is per-interpreter.
1647 */
1648
1649 struct interpreter {
1650 #ifndef USE_THREADS
1651 #include "thrdvar.h"
1652 #endif
1653 #include "intrpvar.h"
1654 };
1655
1656 #else
1657 struct interpreter {
1658     char broiled;
1659 };
1660 #endif
1661
1662 #ifdef USE_THREADS
1663 /* If we have threads define a struct with all the variables
1664  * that have to be per-thread
1665  */
1666
1667
1668 struct perl_thread {
1669 #include "thrdvar.h"
1670 };
1671
1672 typedef struct perl_thread *Thread;
1673
1674 #else
1675 typedef void *Thread;
1676 #endif
1677
1678 /* Done with PERLVAR macros for now ... */
1679 #undef PERLVAR
1680 #undef PERLVARI
1681 #undef PERLVARIC
1682
1683 #include "thread.h"
1684 #include "pp.h"
1685 #include "proto.h"
1686
1687 #ifdef EMBED
1688 #define Perl_sv_setptrobj(rv,ptr,name) Perl_sv_setref_iv(rv,name,(IV)ptr)
1689 #define Perl_sv_setptrref(rv,ptr) Perl_sv_setref_iv(rv,Nullch,(IV)ptr)
1690 #else
1691 #define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,(IV)ptr)
1692 #define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,(IV)ptr)
1693 #endif
1694
1695 /* The following must follow proto.h as #defines mess up syntax */
1696
1697 #include "embedvar.h"
1698
1699 /* Now include all the 'global' variables 
1700  * If we don't have threads or multiple interpreters
1701  * these include variables that would have been their struct-s 
1702  */
1703
1704 #define PERLVAR(var,type) EXT type var;
1705 #define PERLVARI(var,type,init) EXT type var INIT(init);
1706 #define PERLVARIC(var,type,init) EXTCONST type var INIT(init);
1707
1708 #ifndef PERL_GLOBAL_STRUCT
1709 #include "perlvars.h"
1710 #endif
1711
1712 #ifndef MULTIPLICITY
1713
1714 #ifndef USE_THREADS
1715 #include "thrdvar.h"
1716 #endif
1717
1718 #include "intrpvar.h"
1719 #endif
1720
1721
1722 #undef PERLVAR
1723 #undef PERLVARI
1724 #undef PERLVARIC
1725
1726 #if defined(HASATTRIBUTE) && defined(WIN32)
1727 /*
1728  * This provides a layer of functions and macros to ensure extensions will
1729  * get to use the same RTL functions as the core.
1730  * It has to go here or #define of printf messes up __attribute__
1731  * stuff in proto.h  
1732  */
1733 #  include <win32iop.h>
1734 #endif  /* WIN32 */
1735
1736 #ifdef DOINIT
1737
1738 EXT MGVTBL vtbl_sv =    {magic_get,
1739                                 magic_set,
1740                                         magic_len,
1741                                                 0,      0};
1742 EXT MGVTBL vtbl_env =   {0,     magic_set_all_env,
1743                                 0,      magic_clear_all_env,
1744                                                         0};
1745 EXT MGVTBL vtbl_envelem =       {0,     magic_setenv,
1746                                         0,      magic_clearenv,
1747                                                         0};
1748 EXT MGVTBL vtbl_sig =   {0,     0,               0, 0, 0};
1749 EXT MGVTBL vtbl_sigelem =       {magic_getsig,
1750                                         magic_setsig,
1751                                         0,      magic_clearsig,
1752                                                         0};
1753 EXT MGVTBL vtbl_pack =  {0,     0,      magic_sizepack, magic_wipepack,
1754                                                         0};
1755 EXT MGVTBL vtbl_packelem =      {magic_getpack,
1756                                 magic_setpack,
1757                                         0,      magic_clearpack,
1758                                                         0};
1759 EXT MGVTBL vtbl_dbline =        {0,     magic_setdbline,
1760                                         0,      0,      0};
1761 EXT MGVTBL vtbl_isa =   {0,     magic_setisa,
1762                                         0,      magic_setisa,
1763                                                         0};
1764 EXT MGVTBL vtbl_isaelem =       {0,     magic_setisa,
1765                                         0,      0,      0};
1766 EXT MGVTBL vtbl_arylen =        {magic_getarylen,
1767                                 magic_setarylen,
1768                                         0,      0,      0};
1769 EXT MGVTBL vtbl_glob =  {magic_getglob,
1770                                 magic_setglob,
1771                                         0,      0,      0};
1772 EXT MGVTBL vtbl_mglob = {0,     magic_setmglob,
1773                                         0,      0,      0};
1774 EXT MGVTBL vtbl_nkeys = {0,     magic_setnkeys,
1775                                         0,      0,      0};
1776 EXT MGVTBL vtbl_taint = {magic_gettaint,magic_settaint,
1777                                         0,      0,      0};
1778 EXT MGVTBL vtbl_substr =        {0,     magic_setsubstr,
1779                                         0,      0,      0};
1780 EXT MGVTBL vtbl_vec =   {0,     magic_setvec,
1781                                         0,      0,      0};
1782 EXT MGVTBL vtbl_pos =   {magic_getpos,
1783                                 magic_setpos,
1784                                         0,      0,      0};
1785 EXT MGVTBL vtbl_bm =    {0,     magic_setbm,
1786                                         0,      0,      0};
1787 EXT MGVTBL vtbl_fm =    {0,     magic_setfm,
1788                                         0,      0,      0};
1789 EXT MGVTBL vtbl_uvar =  {magic_getuvar,
1790                                 magic_setuvar,
1791                                         0,      0,      0};
1792 #ifdef USE_THREADS
1793 EXT MGVTBL vtbl_mutex = {0,     0,      0,      0,      magic_mutexfree};
1794 #endif /* USE_THREADS */
1795 EXT MGVTBL vtbl_defelem = {magic_getdefelem,magic_setdefelem,
1796                                         0,      0,      magic_freedefelem};
1797
1798 EXT MGVTBL vtbl_regexp = {0,0,0,0, magic_freeregexp};
1799
1800 #ifdef USE_LOCALE_COLLATE
1801 EXT MGVTBL vtbl_collxfrm = {0,
1802                                 magic_setcollxfrm,
1803                                         0,      0,      0};
1804 #endif
1805
1806 #ifdef OVERLOAD
1807 EXT MGVTBL vtbl_amagic =       {0,     magic_setamagic,
1808                                         0,      0,      magic_setamagic};
1809 EXT MGVTBL vtbl_amagicelem =   {0,     magic_setamagic,
1810                                         0,      0,      magic_setamagic};
1811 #endif /* OVERLOAD */
1812
1813 #else /* !DOINIT */
1814
1815 EXT MGVTBL vtbl_sv;
1816 EXT MGVTBL vtbl_env;
1817 EXT MGVTBL vtbl_envelem;
1818 EXT MGVTBL vtbl_sig;
1819 EXT MGVTBL vtbl_sigelem;
1820 EXT MGVTBL vtbl_pack;
1821 EXT MGVTBL vtbl_packelem;
1822 EXT MGVTBL vtbl_dbline;
1823 EXT MGVTBL vtbl_isa;
1824 EXT MGVTBL vtbl_isaelem;
1825 EXT MGVTBL vtbl_arylen;
1826 EXT MGVTBL vtbl_glob;
1827 EXT MGVTBL vtbl_mglob;
1828 EXT MGVTBL vtbl_nkeys;
1829 EXT MGVTBL vtbl_taint;
1830 EXT MGVTBL vtbl_substr;
1831 EXT MGVTBL vtbl_vec;
1832 EXT MGVTBL vtbl_pos;
1833 EXT MGVTBL vtbl_bm;
1834 EXT MGVTBL vtbl_fm;
1835 EXT MGVTBL vtbl_uvar;
1836
1837 #ifdef USE_THREADS
1838 EXT MGVTBL vtbl_mutex;
1839 #endif /* USE_THREADS */
1840
1841 EXT MGVTBL vtbl_defelem;
1842 EXT MGVTBL vtbl_regexp;
1843
1844 #ifdef USE_LOCALE_COLLATE
1845 EXT MGVTBL vtbl_collxfrm;
1846 #endif
1847
1848 #ifdef OVERLOAD
1849 EXT MGVTBL vtbl_amagic;
1850 EXT MGVTBL vtbl_amagicelem;
1851 #endif /* OVERLOAD */
1852
1853 #endif /* !DOINIT */
1854
1855 #ifdef OVERLOAD
1856
1857 #define NofAMmeth 58
1858 #ifdef DOINIT
1859 EXTCONST char * AMG_names[NofAMmeth] = {
1860   "fallback",   "abs",                  /* "fallback" should be the first. */
1861   "bool",       "nomethod",
1862   "\"\"",       "0+",
1863   "+",          "+=",
1864   "-",          "-=",
1865   "*",          "*=",
1866   "/",          "/=",
1867   "%",          "%=",
1868   "**",         "**=",
1869   "<<",         "<<=",
1870   ">>",         ">>=",
1871   "&",          "&=",
1872   "|",          "|=",
1873   "^",          "^=",
1874   "<",          "<=",
1875   ">",          ">=",
1876   "==",         "!=",
1877   "<=>",        "cmp",
1878   "lt",         "le",
1879   "gt",         "ge",
1880   "eq",         "ne",
1881   "!",          "~",
1882   "++",         "--",
1883   "atan2",      "cos",
1884   "sin",        "exp",
1885   "log",        "sqrt",
1886   "x",          "x=",
1887   ".",          ".=",
1888   "=",          "neg"
1889 };
1890 #else
1891 EXTCONST char * AMG_names[NofAMmeth];
1892 #endif /* def INITAMAGIC */
1893
1894 struct am_table {
1895   long was_ok_sub;
1896   long was_ok_am;
1897   U32 flags;
1898   CV* table[NofAMmeth];
1899   long fallback;
1900 };
1901 struct am_table_short {
1902   long was_ok_sub;
1903   long was_ok_am;
1904   U32 flags;
1905 };
1906 typedef struct am_table AMT;
1907 typedef struct am_table_short AMTS;
1908
1909 #define AMGfallNEVER    1
1910 #define AMGfallNO       2
1911 #define AMGfallYES      3
1912
1913 #define AMTf_AMAGIC             1
1914 #define AMT_AMAGIC(amt)         ((amt)->flags & AMTf_AMAGIC)
1915 #define AMT_AMAGIC_on(amt)      ((amt)->flags |= AMTf_AMAGIC)
1916 #define AMT_AMAGIC_off(amt)     ((amt)->flags &= ~AMTf_AMAGIC)
1917
1918 enum {
1919   fallback_amg, abs_amg,
1920   bool__amg,    nomethod_amg,
1921   string_amg,   numer_amg,
1922   add_amg,      add_ass_amg,
1923   subtr_amg,    subtr_ass_amg,
1924   mult_amg,     mult_ass_amg,
1925   div_amg,      div_ass_amg,
1926   mod_amg,      mod_ass_amg,
1927   pow_amg,      pow_ass_amg,
1928   lshift_amg,   lshift_ass_amg,
1929   rshift_amg,   rshift_ass_amg,
1930   band_amg,     band_ass_amg,
1931   bor_amg,      bor_ass_amg,
1932   bxor_amg,     bxor_ass_amg,
1933   lt_amg,       le_amg,
1934   gt_amg,       ge_amg,
1935   eq_amg,       ne_amg,
1936   ncmp_amg,     scmp_amg,
1937   slt_amg,      sle_amg,
1938   sgt_amg,      sge_amg,
1939   seq_amg,      sne_amg,
1940   not_amg,      compl_amg,
1941   inc_amg,      dec_amg,
1942   atan2_amg,    cos_amg,
1943   sin_amg,      exp_amg,
1944   log_amg,      sqrt_amg,
1945   repeat_amg,   repeat_ass_amg,
1946   concat_amg,   concat_ass_amg,
1947   copy_amg,     neg_amg
1948 };
1949
1950 /*
1951  * some compilers like to redefine cos et alia as faster
1952  * (and less accurate?) versions called F_cos et cetera (Quidquid
1953  * latine dictum sit, altum viditur.)  This trick collides with
1954  * the Perl overloading (amg).  The following #defines fool both.
1955  */
1956
1957 #ifdef _FASTMATH
1958 #   ifdef atan2
1959 #       define F_atan2_amg  atan2_amg
1960 #   endif
1961 #   ifdef cos
1962 #       define F_cos_amg    cos_amg
1963 #   endif
1964 #   ifdef exp
1965 #       define F_exp_amg    exp_amg
1966 #   endif
1967 #   ifdef log
1968 #       define F_log_amg    log_amg
1969 #   endif
1970 #   ifdef pow
1971 #       define F_pow_amg    pow_amg
1972 #   endif
1973 #   ifdef sin
1974 #       define F_sin_amg    sin_amg
1975 #   endif
1976 #   ifdef sqrt
1977 #       define F_sqrt_amg   sqrt_amg
1978 #   endif
1979 #endif /* _FASTMATH */
1980
1981 #endif /* OVERLOAD */
1982
1983 #define PERLDB_ALL      0xff
1984 #define PERLDBf_SUB     0x01            /* Debug sub enter/exit. */
1985 #define PERLDBf_LINE    0x02            /* Keep line #. */
1986 #define PERLDBf_NOOPT   0x04            /* Switch off optimizations. */
1987 #define PERLDBf_INTER   0x08            /* Preserve more data for
1988                                            later inspections.  */
1989 #define PERLDBf_SUBLINE 0x10            /* Keep subr source lines. */
1990 #define PERLDBf_SINGLE  0x20            /* Start with single-step on. */
1991
1992 #define PERLDB_SUB      (perldb && (perldb & PERLDBf_SUB))
1993 #define PERLDB_LINE     (perldb && (perldb & PERLDBf_LINE))
1994 #define PERLDB_NOOPT    (perldb && (perldb & PERLDBf_NOOPT))
1995 #define PERLDB_INTER    (perldb && (perldb & PERLDBf_INTER))
1996 #define PERLDB_SUBLINE  (perldb && (perldb & PERLDBf_SUBLINE))
1997 #define PERLDB_SINGLE   (perldb && (perldb & PERLDBf_SINGLE))
1998
1999
2000 #ifdef USE_LOCALE_NUMERIC
2001
2002 #define SET_NUMERIC_STANDARD() \
2003     STMT_START {                                \
2004         if (! numeric_standard)                 \
2005             perl_set_numeric_standard();        \
2006     } STMT_END
2007
2008 #define SET_NUMERIC_LOCAL() \
2009     STMT_START {                                \
2010         if (! numeric_local)                    \
2011             perl_set_numeric_local();           \
2012     } STMT_END
2013
2014 #else /* !USE_LOCALE_NUMERIC */
2015
2016 #define SET_NUMERIC_STANDARD()  /**/
2017 #define SET_NUMERIC_LOCAL()     /**/
2018
2019 #endif /* !USE_LOCALE_NUMERIC */
2020
2021 #if !defined(PERLIO_IS_STDIO) && defined(HAS_ATTRIBUTE)
2022 /* 
2023  * Now we have __attribute__ out of the way 
2024  * Remap printf 
2025  */
2026 #define printf PerlIO_stdoutf
2027 #endif
2028
2029 #ifndef PERL_SCRIPT_MODE
2030 #define PERL_SCRIPT_MODE "r"
2031 #endif
2032
2033 /*
2034  * nice_chunk and nice_chunk size need to be set
2035  * and queried under the protection of sv_mutex
2036  */
2037 #define offer_nice_chunk(chunk, chunk_size) do {        \
2038         MUTEX_LOCK(&sv_mutex);                          \
2039         if (!nice_chunk) {                              \
2040             nice_chunk = (char*)(chunk);                \
2041             nice_chunk_size = (chunk_size);             \
2042         }                                               \
2043         MUTEX_UNLOCK(&sv_mutex);                        \
2044     } while (0)
2045
2046
2047 #endif /* Include guard */
2048