This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Merge branch 'false_warning' into blead
[perl5.git] / util.h
diff --git a/util.h b/util.h
index 1727233..6294e59 100644 (file)
--- a/util.h
+++ b/util.h
@@ -8,46 +8,44 @@
  *
  */
 
+#ifndef PERL_UTIL_H_
+#define PERL_UTIL_H_
+
+
 #ifdef VMS
 #  define PERL_FILE_IS_ABSOLUTE(f) \
        (*(f) == '/'                                                    \
         || (strchr(f,':')                                              \
             || ((*(f) == '[' || *(f) == '<')                           \
-                && (isWORDCHAR((f)[1]) || strchr("$-_]>",(f)[1])))))
+                && (isWORDCHAR((f)[1]) || memCHRs("$-_]>",(f)[1])))))
 
-#else          /* !VMS */
-#  if defined(WIN32) || defined(__CYGWIN__)
-#    define PERL_FILE_IS_ABSOLUTE(f) \
+#elif defined(WIN32) || defined(__CYGWIN__)
+#  define PERL_FILE_IS_ABSOLUTE(f) \
        (*(f) == '/' || *(f) == '\\'            /* UNC/rooted path */   \
         || ((f)[0] && (f)[1] == ':'))          /* drive name */
-#  else                /* !WIN32 */
-#  ifdef NETWARE
-#    define PERL_FILE_IS_ABSOLUTE(f) \
+#elif defined(NETWARE)
+#  define PERL_FILE_IS_ABSOLUTE(f) \
        (((f)[0] && (f)[1] == ':')              /* drive name */        \
         || ((f)[0] == '\\' && (f)[1] == '\\')  /* UNC path */  \
         ||     ((f)[3] == ':'))                                /* volume name, currently only sys */
-#  else                /* !NETWARE */
-#    if defined(DOSISH) || defined(__SYMBIAN32__)
-#      define PERL_FILE_IS_ABSOLUTE(f) \
+#elif defined(DOSISH) || defined(__SYMBIAN32__)
+#  define PERL_FILE_IS_ABSOLUTE(f) \
        (*(f) == '/'                                                    \
         || ((f)[0] && (f)[1] == ':'))          /* drive name */
-#    else      /* NEITHER DOSISH NOR SYMBIANISH */
-#      define PERL_FILE_IS_ABSOLUTE(f) (*(f) == '/')
-#    endif     /* DOSISH */
-#   endif      /* NETWARE */
-#  endif       /* WIN32 */
-#endif         /* VMS */
+#else  /* NEITHER DOSISH NOR SYMBIANISH */
+#  define PERL_FILE_IS_ABSOLUTE(f)     (*(f) == '/')
+#endif
 
 /*
 =head1 Miscellaneous Functions
 
 =for apidoc ibcmp
 
-This is a synonym for (! foldEQ())
+This is a synonym for S<C<(! foldEQ())>>
 
 =for apidoc ibcmp_locale
 
-This is a synonym for (! foldEQ_locale())
+This is a synonym for S<C<(! foldEQ_locale())>>
 
 =cut
 */
@@ -57,9 +55,8 @@ This is a synonym for (! foldEQ_locale())
 /* outside the core, perl.h undefs HAS_QUAD if IV isn't 64-bit
    We can't swap this to HAS_QUAD, because the logic here affects the type of
    perl_drand48_t below, and that is visible outside of the core.  */
-#if defined(U64TYPE) && !defined(USING_MSVC6)
-/* use a faster implementation when quads are available,
- * but not with VC6 on Windows */
+#if defined(U64TYPE)
+/* use a faster implementation when quads are available */
 #    define PERL_DRAND48_QUAD
 #endif
 
@@ -85,6 +82,12 @@ typedef struct PERL_DRAND48_T perl_drand48_t;
 #define Perl_drand48_init(seed) (Perl_drand48_init_r(&PL_random_state, (seed)))
 #define Perl_drand48() (Perl_drand48_r(&PL_random_state))
 
+#ifdef PERL_CORE
+/* uses a different source of randomness to avoid interfering with the results
+ * of rand() */
+#define Perl_internal_drand48() (Perl_drand48_r(&PL_internal_random_state))
+#endif
+
 #ifdef USE_C_BACKTRACE
 
 typedef struct {
@@ -173,16 +176,21 @@ typedef struct {
    selectable. These spare bits allow for additional features for the varargs
    stuff or ABI compat test flags in the future.
 */
-#define HSm_APIVERLEN 0x0000003F /* perl version string won't be more than 63 chars */
+#define HSm_APIVERLEN 0x0000001F /* perl version string won't be more than 31 chars */
 #define HS_APIVERLEN_MAX HSm_APIVERLEN
 #define HSm_XSVERLEN 0x0000FF00 /* if 0, not present, dont check, die if over 255*/
 #define HS_XSVERLEN_MAX 0xFF
+/* uses var file to set default filename for newXS_deffile to use for CvFILE */
+#define HSf_SETXSUBFN 0x00000020
 #define HSf_POPMARK 0x00000040 /* popmark mode or you must supply ax and items */
 #define HSf_IMP_CXT 0x00000080 /* ABI, threaded/PERL_IMPLICIT_CONTEXT, pTHX_ present */
 #define HSm_INTRPSIZE 0xFFFF0000 /* ABI, interp struct size */
-/* a mask where these bits must always match between a XS mod and interp */
-/* and maybe HSm_APIVERLEN one day if Perl_xs_apiversion_bootcheck is changed to a memcmp */
+/* A mask of bits in the key which must always match between a XS mod and interp.
+   Also if all ABI bits in a key are true, skip all ABI checks, it is very
+   the unlikely interp size will all 1 bits */
+/* Maybe HSm_APIVERLEN one day if Perl_xs_apiversion_bootcheck is changed to a memcmp */
 #define HSm_KEY_MATCH (HSm_INTRPSIZE|HSf_IMP_CXT)
+#define HSf_NOCHK HSm_KEY_MATCH  /* if all ABI bits are 1 in the key, dont chk */
 
 
 #define HS_GETINTERPSIZE(key) ((key) >> 16)
@@ -193,12 +201,14 @@ means arg not present, 1 is empty string/null byte */
 #define HS_GETAPIVERLEN(key) ((key) & HSm_APIVERLEN)
 
 /* internal to util.h macro to create a packed handshake key, all args must be constants */
-/* U32 return = (U16 interpsize, bool cxt, bool popmark, U6 (SIX!) apiverlen, U8 xsverlen) */
-#define HS_KEYp(interpsize, cxt, popmark, apiverlen, xsverlen) \
+/* U32 return = (U16 interpsize, bool cxt, bool setxsubfn, bool popmark,
+   U5 (FIVE!) apiverlen, U8 xsverlen) */
+#define HS_KEYp(interpsize, cxt, setxsubfn, popmark, apiverlen, xsverlen) \
     (((interpsize)  << 16) \
     | ((xsverlen) > HS_XSVERLEN_MAX \
         ? (Perl_croak_nocontext("panic: handshake overflow"), HS_XSVERLEN_MAX) \
         : (xsverlen) << 8) \
+    | (cBOOL(setxsubfn) ? HSf_SETXSUBFN : 0) \
     | (cBOOL(cxt) ? HSf_IMP_CXT : 0) \
     | (cBOOL(popmark) ? HSf_POPMARK : 0) \
     | ((apiverlen) > HS_APIVERLEN_MAX \
@@ -208,25 +218,65 @@ means arg not present, 1 is empty string/null byte */
 
 /* public macro for core usage to create a packed handshake key but this is
    not public API. This more friendly version already collected all ABI info */
-/* U32 return = (bool popmark, "litteral_string_api_ver", "litteral_string_xs_ver") */
+/* U32 return = (bool setxsubfn, bool popmark, "litteral_string_api_ver",
+   "litteral_string_xs_ver") */
 #ifdef PERL_IMPLICIT_CONTEXT
-#  define HS_KEY(popmark, apiver, xsver) \
-    HS_KEYp(sizeof(PerlInterpreter), TRUE, popmark, \
+#  define HS_KEY(setxsubfn, popmark, apiver, xsver) \
+    HS_KEYp(sizeof(PerlInterpreter), TRUE, setxsubfn, popmark, \
     sizeof("" apiver "")-1, sizeof("" xsver "")-1)
 #  define HS_CXT aTHX
 #else
-#  define HS_KEY(popmark, apiver, xsver) \
-    HS_KEYp(sizeof(struct PerlHandShakeInterpreter), FALSE, popmark, \
+#  define HS_KEY(setxsubfn, popmark, apiver, xsver) \
+    HS_KEYp(sizeof(struct PerlHandShakeInterpreter), FALSE, setxsubfn, popmark, \
     sizeof("" apiver "")-1, sizeof("" xsver "")-1)
 #  define HS_CXT cv
 #endif
 
 /*
- * Local variables:
- * c-indentation-style: bsd
- * c-basic-offset: 4
- * indent-tabs-mode: nil
- * End:
- *
+=for apidoc instr
+Same as L<strstr(3)>, which finds and returns a pointer to the first occurrence
+of the NUL-terminated substring C<little> in the NUL-terminated string C<big>,
+returning NULL if not found.  The terminating NUL bytes are not compared.
+
+=cut
+*/
+
+
+#define instr(haystack, needle) strstr(haystack, needle)
+
+#ifdef HAS_MEMMEM
+#   define ninstr(big, bigend, little, lend)                                \
+            ((char *) memmem((big), (bigend) - (big),                       \
+                             (little), (lend) - (little)))
+#else
+#   define ninstr(a,b,c,d) Perl_ninstr(a,b,c,d)
+#endif
+
+#ifdef __Lynx__
+/* Missing proto on LynxOS */
+int mkstemp(char*);
+#endif
+
+#ifdef PERL_CORE
+#   if defined(VMS)
+/* only useful for calls to our mkostemp() emulation */
+#       define O_VMS_DELETEONCLOSE 0x40000000
+#       ifdef HAS_MKOSTEMP
+#           error 134221 will need a new solution for VMS
+#       endif
+#   else
+#       define O_VMS_DELETEONCLOSE 0
+#   endif
+#endif
+#if defined(HAS_MKOSTEMP) && defined(PERL_CORE)
+#   define Perl_my_mkostemp(templte, flags) mkostemp(templte, flags)
+#endif
+#if defined(HAS_MKSTEMP) && defined(PERL_CORE)
+#   define Perl_my_mkstemp(templte) mkstemp(templte)
+#endif
+
+#endif /* PERL_UTIL_H_ */
+
+/*
  * ex: set ts=8 sts=4 sw=4 et:
  */