This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix up Peek.t after priv flag twiddling
[perl5.git] / util.h
CommitLineData
a0d0e21e 1/* util.h
a687059c 2 *
663f364b
NC
3 * Copyright (C) 1991, 1992, 1993, 1999, 2001, 2002, 2003, 2004, 2005,
4 * 2007, by Larry Wall and others
a687059c 5 *
d48672a2
LW
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.
8d063cd8 8 *
8d063cd8 9 */
57843af0
GS
10
11#ifdef VMS
12# define PERL_FILE_IS_ABSOLUTE(f) \
13 (*(f) == '/' \
14 || (strchr(f,':') \
15 || ((*(f) == '[' || *(f) == '<') \
0eb30aeb 16 && (isWORDCHAR((f)[1]) || strchr("$-_]>",(f)[1])))))
57843af0
GS
17
18#else /* !VMS */
546cd220 19# if defined(WIN32) || defined(__CYGWIN__)
57843af0 20# define PERL_FILE_IS_ABSOLUTE(f) \
f2ed23b0
GS
21 (*(f) == '/' || *(f) == '\\' /* UNC/rooted path */ \
22 || ((f)[0] && (f)[1] == ':')) /* drive name */
57843af0 23# else /* !WIN32 */
2986a63f
JH
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 */
739a0b84 30# if defined(DOSISH) || defined(__SYMBIAN32__)
57843af0
GS
31# define PERL_FILE_IS_ABSOLUTE(f) \
32 (*(f) == '/' \
33 || ((f)[0] && (f)[1] == ':')) /* drive name */
739a0b84 34# else /* NEITHER DOSISH NOR SYMBIANISH */
e37778c2 35# define PERL_FILE_IS_ABSOLUTE(f) (*(f) == '/')
57843af0 36# endif /* DOSISH */
2986a63f 37# endif /* NETWARE */
57843af0
GS
38# endif /* WIN32 */
39#endif /* VMS */
e9a8c099
MHM
40
41/*
dcccc8ff
KW
42=head1 Miscellaneous Functions
43
e6226b18
KW
44=for apidoc ibcmp
45
46This is a synonym for (! foldEQ())
47
48=for apidoc ibcmp_locale
49
50This 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
cb4d37a7
NC
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. */
9ea40801 60#if defined(U64TYPE) && !defined(USING_MSVC6)
63835f79
SH
61/* use a faster implementation when quads are available,
62 * but not with VC6 on Windows */
63# define PERL_DRAND48_QUAD
3be8f094
TC
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 */
71typedef U64TYPE perl_drand48_t;
72
73#else
74
75struct PERL_DRAND48_T {
76 U16 seed[3];
77};
78
79typedef 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))
e6226b18 87
470dd224
JH
88#ifdef USE_C_BACKTRACE
89
90typedef 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
98typedef 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
0762e42f
JH
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
470dd224
JH
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
152typedef 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
e6226b18 166/*
e9a8c099
MHM
167 * Local variables:
168 * c-indentation-style: bsd
169 * c-basic-offset: 4
14d04a33 170 * indent-tabs-mode: nil
e9a8c099
MHM
171 * End:
172 *
14d04a33 173 * ex: set ts=8 sts=4 sw=4 et:
e9a8c099 174 */