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