This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
op_reg_common.h: Update comment
[perl5.git] / util.h
diff --git a/util.h b/util.h
index e01f0ec..736f978 100644 (file)
--- a/util.h
+++ b/util.h
@@ -1,6 +1,7 @@
 /*    util.h
  *
- *    Copyright (c) 1991-2001, Larry Wall
+ *    Copyright (C) 1991, 1992, 1993, 1999, 2001, 2002, 2003, 2004, 2005,
+ *    2007, by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
        (*(f) == '/'                                                    \
         || (strchr(f,':')                                              \
             || ((*(f) == '[' || *(f) == '<')                           \
-                && (isALNUM((f)[1]) || strchr("$-_]>",(f)[1])))))
+                && (isWORDCHAR((f)[1]) || strchr("$-_]>",(f)[1])))))
 
 #else          /* !VMS */
-#  ifdef WIN32
+#  if defined(WIN32) || defined(__CYGWIN__)
 #    define PERL_FILE_IS_ABSOLUTE(f) \
-       (*(f) == '/'                                                    \
-        || ((f)[0] && (f)[1] == ':')           /* drive name */        \
-        || ((f)[0] == '\\' && (f)[1] == '\\')) /* UNC path */
+       (*(f) == '/' || *(f) == '\\'            /* UNC/rooted path */   \
+        || ((f)[0] && (f)[1] == ':'))          /* drive name */
 #  else                /* !WIN32 */
-#    if defined( DOSISH) || defined(EPOC)
+#  ifdef 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) \
        (*(f) == '/'                                                    \
         || ((f)[0] && (f)[1] == ':'))          /* drive name */
-#    else      /* NEITHER DOSISH NOR EPOCISH */
-#      ifdef MACOS_TRADITIONAL
-#        define PERL_FILE_IS_ABSOLUTE(f)       (strchr(f, ':'))
-#      else /* !MACOS_TRADITIONAL */
-#        define PERL_FILE_IS_ABSOLUTE(f)       (*(f) == '/')
-#      endif /* MACOS_TRADITIONAL */
+#    else      /* NEITHER DOSISH NOR SYMBIANISH */
+#      define PERL_FILE_IS_ABSOLUTE(f) (*(f) == '/')
 #    endif     /* DOSISH */
+#   endif      /* NETWARE */
 #  endif       /* WIN32 */
 #endif         /* VMS */
+
+/*
+=head1 Miscellaneous Functions
+
+=for apidoc ibcmp
+
+This is a synonym for (! foldEQ())
+
+=for apidoc ibcmp_locale
+
+This is a synonym for (! foldEQ_locale())
+
+=cut
+*/
+#define ibcmp(s1, s2, len)         cBOOL(! foldEQ(s1, s2, len))
+#define ibcmp_locale(s1, s2, len)  cBOOL(! foldEQ_locale(s1, s2, len))
+
+/* 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 */
+#    define PERL_DRAND48_QUAD
+#endif
+
+#ifdef PERL_DRAND48_QUAD
+
+/* U64 is only defined under PERL_CORE, but this needs to be visible
+ * elsewhere so the definition of PerlInterpreter is complete.
+ */
+typedef U64TYPE perl_drand48_t;
+
+#else
+
+struct PERL_DRAND48_T {
+    U16 seed[3];
+};
+
+typedef struct PERL_DRAND48_T perl_drand48_t;
+
+#endif
+
+#define PL_RANDOM_STATE_TYPE 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 USE_C_BACKTRACE
+
+typedef struct {
+    /* The number of frames returned. */
+    UV frame_count;
+    /* The total size of the Perl_c_backtrace, including this header,
+     * the frames, and the name strings. */
+    UV total_bytes;
+} Perl_c_backtrace_header;
+
+typedef struct {
+    void*  addr;  /* the program counter at this frame */
+
+    /* We could use Dl_info (as used by dladdr()) for many of these but
+     * that would be naughty towards non-dlfcn systems (hi there, Win32). */
+
+    void*  symbol_addr; /* symbol address (hint: try symbol_addr - addr) */
+    void*  object_base_addr;   /* base address of the shared object */
+
+    /* The offsets are from the beginning of the whole backtrace,
+     * which makes the backtrace relocatable. */
+    STRLEN object_name_offset; /* pathname of the shared object */
+    STRLEN object_name_size;   /* length of the pathname */
+    STRLEN symbol_name_offset; /* symbol name */
+    STRLEN symbol_name_size;   /* length of the symbol name */
+    STRLEN source_name_offset; /* source code file name */
+    STRLEN source_name_size;   /* length of the source code file name */
+    STRLEN source_line_number; /* source code line number */
+
+    /* OS X notes: atos(1) (more recently, "xcrun atos"), but the C
+     * API atos() uses is unknown (private "Symbolicator" framework,
+     * might require Objective-C even if the API would be known).
+     * Currently we open read pipe to "xcrun atos" and parse the
+     * output - quite disgusting.  And that won't work if the
+     * Developer Tools isn't installed. */
+
+    /* FreeBSD notes: execinfo.h exists, but probably would need also
+     * the library -lexecinfo.  BFD exists if the pkg devel/binutils
+     * has been installed, but there seems to be a known problem that
+     * the "bfd.h" getting installed refers to "ansidecl.h", which
+     * doesn't get installed. */
+
+    /* Win32 notes: as moral equivalents of backtrace() + dladdr(),
+     * one could possibly first use GetCurrentProcess() +
+     * SymInitialize(), and then CaptureStackBackTrace() +
+     * SymFromAddr(). */
+
+    /* Note that using the compiler optimizer easily leads into much
+     * of this information, like the symbol names (think inlining),
+     * and source code locations getting lost or confused.  In many
+     * cases keeping the debug information (-g) is necessary.
+     *
+     * Note that for example with gcc you can do both -O and -g.
+     *
+     * Note, however, that on some platforms (e.g. OSX + clang (cc))
+     * backtrace() + dladdr() works fine without -g. */
+
+    /* For example: the mere presence of <bfd.h> is no guarantee: e.g.
+     * OS X has that, but BFD does not seem to work on the OSX executables.
+     *
+     * Another niceness would be to able to see something about
+     * the function arguments, however gdb/lldb manage to do that. */
+} Perl_c_backtrace_frame;
+
+typedef struct {
+    Perl_c_backtrace_header header;
+    Perl_c_backtrace_frame  frame_info[1];
+    /* After the header come:
+     * (1) header.frame_count frames
+     * (2) frame_count times the \0-terminated strings (object_name
+     * and so forth).  The frames contain the pointers to the starts
+     * of these strings, and the lengths of these strings. */
+} Perl_c_backtrace;
+
+#define Perl_free_c_backtrace(bt) Safefree(bt)
+
+#endif /* USE_C_BACKTRACE */
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 et:
+ */