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