The space computation for hexfp was overovershooting.
[perl.git] / util.h
1 /*    util.h
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1999, 2001, 2002, 2003, 2004, 2005,
4  *    2007, by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 #ifdef VMS
12 #  define PERL_FILE_IS_ABSOLUTE(f) \
13         (*(f) == '/'                                                    \
14          || (strchr(f,':')                                              \
15              || ((*(f) == '[' || *(f) == '<')                           \
16                  && (isWORDCHAR((f)[1]) || strchr("$-_]>",(f)[1])))))
17
18 #else           /* !VMS */
19 #  if defined(WIN32) || defined(__CYGWIN__)
20 #    define PERL_FILE_IS_ABSOLUTE(f) \
21         (*(f) == '/' || *(f) == '\\'            /* UNC/rooted path */   \
22          || ((f)[0] && (f)[1] == ':'))          /* drive name */
23 #  else         /* !WIN32 */
24 #  ifdef NETWARE
25 #    define PERL_FILE_IS_ABSOLUTE(f) \
26         (((f)[0] && (f)[1] == ':')              /* drive name */        \
27          || ((f)[0] == '\\' && (f)[1] == '\\')  /* UNC path */  \
28          ||     ((f)[3] == ':'))                                /* volume name, currently only sys */
29 #  else         /* !NETWARE */
30 #    if defined(DOSISH) || defined(__SYMBIAN32__)
31 #      define PERL_FILE_IS_ABSOLUTE(f) \
32         (*(f) == '/'                                                    \
33          || ((f)[0] && (f)[1] == ':'))          /* drive name */
34 #    else       /* NEITHER DOSISH NOR SYMBIANISH */
35 #      define PERL_FILE_IS_ABSOLUTE(f)  (*(f) == '/')
36 #    endif      /* DOSISH */
37 #   endif       /* NETWARE */
38 #  endif        /* WIN32 */
39 #endif          /* VMS */
40
41 /*
42 =head1 Miscellaneous Functions
43
44 =for apidoc ibcmp
45
46 This is a synonym for (! foldEQ())
47
48 =for apidoc ibcmp_locale
49
50 This is a synonym for (! foldEQ_locale())
51
52 =cut
53 */
54 #define ibcmp(s1, s2, len)         cBOOL(! foldEQ(s1, s2, len))
55 #define ibcmp_locale(s1, s2, len)  cBOOL(! foldEQ_locale(s1, s2, len))
56
57 /* outside the core, perl.h undefs HAS_QUAD if IV isn't 64-bit
58    We can't swap this to HAS_QUAD, because the logic here affects the type of
59    perl_drand48_t below, and that is visible outside of the core.  */
60 #if defined(U64TYPE) && !defined(USING_MSVC6)
61 /* use a faster implementation when quads are available,
62  * but not with VC6 on Windows */
63 #    define PERL_DRAND48_QUAD
64 #endif
65
66 #ifdef PERL_DRAND48_QUAD
67
68 /* U64 is only defined under PERL_CORE, but this needs to be visible
69  * elsewhere so the definition of PerlInterpreter is complete.
70  */
71 typedef U64TYPE perl_drand48_t;
72
73 #else
74
75 struct PERL_DRAND48_T {
76     U16 seed[3];
77 };
78
79 typedef struct PERL_DRAND48_T perl_drand48_t;
80
81 #endif
82
83 #define PL_RANDOM_STATE_TYPE perl_drand48_t
84
85 #define Perl_drand48_init(seed) (Perl_drand48_init_r(&PL_random_state, (seed)))
86 #define Perl_drand48() (Perl_drand48_r(&PL_random_state))
87
88 #ifdef USE_C_BACKTRACE
89
90 typedef struct {
91     /* The number of frames returned. */
92     UV frame_count;
93     /* The total size of the Perl_c_backtrace, including this header,
94      * the frames, and the name strings. */
95     UV total_bytes;
96 } Perl_c_backtrace_header;
97
98 typedef struct {
99     void*  addr;  /* the program counter at this frame */
100
101     /* We could use Dl_info (as used by dladdr()) for many of these but
102      * that would be naughty towards non-dlfcn systems (hi there, Win32). */
103
104     void*  symbol_addr; /* symbol address (hint: try symbol_addr - addr) */
105     void*  object_base_addr;   /* base address of the shared object */
106
107     /* The offsets are from the beginning of the whole backtrace,
108      * which makes the backtrace relocatable. */
109     STRLEN object_name_offset; /* pathname of the shared object */
110     STRLEN object_name_size;   /* length of the pathname */
111     STRLEN symbol_name_offset; /* symbol name */
112     STRLEN symbol_name_size;   /* length of the symbol name */
113     STRLEN source_name_offset; /* source code file name */
114     STRLEN source_name_size;   /* length of the source code file name */
115     STRLEN source_line_number; /* source code line number */
116
117     /* OS X notes: atos(1) (more recently, "xcrun atos"), but the C
118      * API atos() uses is unknown (private "Symbolicator" framework,
119      * might require Objective-C even if the API would be known).
120      * Currently we open read pipe to "xcrun atos" and parse the
121      * output - quite disgusting.  And that won't work if the
122      * Developer Tools isn't installed. */
123
124     /* FreeBSD notes: execinfo.h exists, but probably would need also
125      * the library -lexecinfo.  BFD exists if the pkg devel/binutils
126      * has been installed, but there seems to be a known problem that
127      * the "bfd.h" getting installed refers to "ansidecl.h", which
128      * doesn't get installed. */
129
130     /* Win32 notes: as moral equivalents of backtrace() + dladdr(),
131      * one could possibly first use GetCurrentProcess() +
132      * SymInitialize(), and then CaptureStackBackTrace() +
133      * SymFromAddr(). */
134
135     /* Note that using the compiler optimizer easily leads into much
136      * of this information, like the symbol names (think inlining),
137      * and source code locations getting lost or confused.  In many
138      * cases keeping the debug information (-g) is necessary.
139      *
140      * Note that for example with gcc you can do both -O and -g.
141      *
142      * Note, however, that on some platforms (e.g. OSX + clang (cc))
143      * backtrace() + dladdr() works fine without -g. */
144
145     /* For example: the mere presence of <bfd.h> is no guarantee: e.g.
146      * OS X has that, but BFD does not seem to work on the OSX executables.
147      *
148      * Another niceness would be to able to see something about
149      * the function arguments, however gdb/lldb manage to do that. */
150 } Perl_c_backtrace_frame;
151
152 typedef struct {
153     Perl_c_backtrace_header header;
154     Perl_c_backtrace_frame  frame_info[1];
155     /* After the header come:
156      * (1) header.frame_count frames
157      * (2) frame_count times the \0-terminated strings (object_name
158      * and so forth).  The frames contain the pointers to the starts
159      * of these strings, and the lengths of these strings. */
160 } Perl_c_backtrace;
161
162 #define Perl_free_c_backtrace(bt) Safefree(bt)
163
164 #endif /* USE_C_BACKTRACE */
165
166 /*
167  * Local variables:
168  * c-indentation-style: bsd
169  * c-basic-offset: 4
170  * indent-tabs-mode: nil
171  * End:
172  *
173  * ex: set ts=8 sts=4 sw=4 et:
174  */