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