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