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