Commit | Line | Data |
---|---|---|
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 | ||
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 | ||
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 | */ | |
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)) | |
e6226b18 | 87 | |
470dd224 JH |
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 | ||
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 | ||
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 | ||
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 | */ |