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