home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl_blb.zip / os2 / 5.00455 / CORE / perl.h < prev    next >
C/C++ Source or Header  |  1997-11-26  |  63KB  |  2,331 lines

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