2 /*--------------------------------------------------------------------*/
3 /*--- Standalone libc stuff. pub_tool_libcbase.h ---*/
4 /*--------------------------------------------------------------------*/
7 This file is part of Valgrind, a dynamic binary instrumentation
10 Copyright (C) 2000-2017 Julian Seward
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
18 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, see <http://www.gnu.org/licenses/>.
26 The GNU General Public License is contained in the file COPYING.
29 #ifndef __PUB_TOOL_LIBCBASE_H
30 #define __PUB_TOOL_LIBCBASE_H
32 #include "pub_tool_basics.h" // VG_ macro
34 /* ---------------------------------------------------------------------
36 ------------------------------------------------------------------ */
38 extern Bool
VG_(isspace
) ( HChar c
);
39 extern Bool
VG_(isdigit
) ( HChar c
);
40 extern HChar
VG_(tolower
) ( HChar c
);
42 /* ---------------------------------------------------------------------
43 Converting strings to numbers
44 ------------------------------------------------------------------ */
46 // Convert strings to numbers according to various bases. Leading
47 // whitespace is ignored. A subsequent '-' or '+' is accepted. For strtoll16,
48 // accepts an initial "0x" or "0X" prefix, but only if it's followed by a
49 // hex digit (if not, the '0' will be read and then it will stop on the
50 // "x"/"X".) If 'endptr' isn't NULL, it gets filled in with the first
51 // non-digit char. Returns 0 if no number could be converted, and 'endptr'
52 // is set to the start of the string. None of them test that the number
55 // Nb: we also don't provide VG_(atoll*); these functions are worse than
56 // useless because they don't do any error checking and so accept malformed
57 // numbers and non-numbers -- eg. "123xyz" gives 123, and "foo" gives 0!
58 // If you really want that behaviour, you can use "VG_(strtoll10)(str, NULL)".
59 extern Long
VG_(strtoll10
) ( const HChar
* str
, HChar
** endptr
);
60 extern Long
VG_(strtoll16
) ( const HChar
* str
, HChar
** endptr
);
61 extern ULong
VG_(strtoull10
) ( const HChar
* str
, HChar
** endptr
);
62 extern ULong
VG_(strtoull16
) ( const HChar
* str
, HChar
** endptr
);
64 // Convert a string to a double. After leading whitespace is ignored, a
65 // '+' or '-' is allowed, and then it accepts a non-empty sequence of
66 // decimal digits possibly containing a '.'. Hexadecimal floats are not
67 // accepted, nor are "fancy" floats (eg. "3.4e-5", "NAN").
68 extern double VG_(strtod
) ( const HChar
* str
, HChar
** endptr
);
70 /* ---------------------------------------------------------------------
71 String functions and macros
72 ------------------------------------------------------------------ */
74 /* Use this for normal null-termination-style string comparison. */
75 #define VG_STREQ(s1,s2) ( (s1 != NULL && s2 != NULL \
76 && VG_(strcmp)((s1),(s2))==0) ? True : False )
77 #define VG_STREQN(n,s1,s2) ( (s1 != NULL && s2 != NULL \
78 && VG_(strncmp)((s1),(s2),(n))==0) ? True : False )
80 extern SizeT
VG_(strlen
) ( const HChar
* str
);
81 extern SizeT
VG_(strnlen
) ( const HChar
* str
, SizeT n
);
82 extern HChar
* VG_(strcat
) ( HChar
* dest
, const HChar
* src
);
83 extern HChar
* VG_(strncat
) ( HChar
* dest
, const HChar
* src
, SizeT n
);
84 extern HChar
* VG_(strpbrk
) ( const HChar
* s
, const HChar
* accpt
);
85 extern HChar
* VG_(strcpy
) ( HChar
* dest
, const HChar
* src
);
86 extern HChar
* VG_(strncpy
) ( HChar
* dest
, const HChar
* src
, SizeT ndest
);
87 extern SizeT
VG_(strlcpy
) ( HChar
* dest
, const HChar
* src
, SizeT n
);
88 extern Int
VG_(strcmp
) ( const HChar
* s1
, const HChar
* s2
);
89 extern Int
VG_(strcasecmp
) ( const HChar
* s1
, const HChar
* s2
);
90 extern Int
VG_(strncmp
) ( const HChar
* s1
, const HChar
* s2
, SizeT nmax
);
91 extern Int
VG_(strncasecmp
) ( const HChar
* s1
, const HChar
* s2
, SizeT nmax
);
92 extern HChar
* VG_(strstr
) ( const HChar
* haystack
, const HChar
* needle
);
93 extern HChar
* VG_(strcasestr
) ( const HChar
* haystack
, const HChar
* needle
);
94 extern HChar
* VG_(strchr
) ( const HChar
* s
, HChar c
);
95 extern HChar
* VG_(strrchr
) ( const HChar
* s
, HChar c
);
96 extern SizeT
VG_(strspn
) ( const HChar
* s
, const HChar
* accpt
);
97 extern SizeT
VG_(strcspn
) ( const HChar
* s
, const HChar
* reject
);
99 /* strtok* functions and some parsing utilities. */
100 extern HChar
* VG_(strtok_r
) (HChar
* s
, const HChar
* delim
, HChar
** saveptr
);
101 extern HChar
* VG_(strtok
) (HChar
* s
, const HChar
* delim
);
103 /* Parse a 32- or 64-bit hex number, including leading 0x, from string
104 starting at *ppc, putting result in *result, advance *ppc past the
105 characters used, and return True. Or fail, in which case *ppc and
106 *result are undefined, and return False. */
107 extern Bool
VG_(parse_Addr
) ( const HChar
** ppc
, Addr
* result
);
109 /* Parse an unsigned 32 bit number, written using decimals only.
110 Calling conventions are the same as for VG_(parse_Addr). */
111 extern Bool
VG_(parse_UInt
) ( const HChar
** ppc
, UInt
* result
);
113 /* Parse an "enum set" made of one or more words comma separated.
114 The allowed word values are given in 'tokens', separated by comma.
115 If a word in 'tokens' is found in 'input', the corresponding bit
116 will be set in *enum_set (words in 'tokens' are numbered starting from 0).
117 Using in 'tokens' the special token "-" (a minus character) indicates that
118 the corresponding bit position cannot be set.
119 In addition to the words specified in 'tokens', VG_(parse_enum_set)
120 automatically accept the word "none" to indicate an empty enum_set (0).
121 If allow_all, VG_(parse_enum_set) automatically accept the word "all"
122 to indicate an enum_set with all bits corresponding to the words in tokens
124 If "none" or "all" is present in 'input', no other word can be given
126 If parsing is successful, returns True and sets *enum_set.
127 If parsing fails, returns False. */
128 extern Bool
VG_(parse_enum_set
) ( const HChar
*tokens
,
133 /* ---------------------------------------------------------------------
135 ------------------------------------------------------------------ */
137 extern void* VG_(memcpy
) ( void *d
, const void *s
, SizeT sz
);
138 extern void* VG_(memmove
)( void *d
, const void *s
, SizeT sz
);
139 extern void* VG_(memset
) ( void *s
, Int c
, SizeT sz
);
140 extern Int
VG_(memcmp
) ( const void* s1
, const void* s2
, SizeT n
);
142 /* Zero out up to 12 words quickly in-line. Do not use this for blocks
143 of size which are unknown at compile time, since the whole point is
144 for it to be inlined, and then for gcc to remove all code except
145 for the relevant 'sz' case. */
146 inline __attribute__((always_inline
))
147 static void VG_(bzero_inline
) ( void* s
, SizeT sz
)
149 if (LIKELY(0 == (((Addr
)sz
) & (Addr
)(sizeof(UWord
)-1)))
150 && LIKELY(0 == (((Addr
)s
) & (Addr
)(sizeof(UWord
)-1)))) {
151 UWord
* p
= (UWord
*)s
;
152 switch (sz
/ (SizeT
)sizeof(UWord
)) {
153 case 12: p
[0] = p
[1] = p
[2] = p
[3]
154 = p
[4] = p
[5] = p
[6] = p
[7]
155 = p
[8] = p
[9] = p
[10] = p
[11] = 0UL; return;
156 case 11: p
[0] = p
[1] = p
[2] = p
[3]
157 = p
[4] = p
[5] = p
[6] = p
[7]
158 = p
[8] = p
[9] = p
[10] = 0UL; return;
159 case 10: p
[0] = p
[1] = p
[2] = p
[3]
160 = p
[4] = p
[5] = p
[6] = p
[7]
161 = p
[8] = p
[9] = 0UL; return;
162 case 9: p
[0] = p
[1] = p
[2] = p
[3]
163 = p
[4] = p
[5] = p
[6] = p
[7]
164 = p
[8] = 0UL; return;
165 case 8: p
[0] = p
[1] = p
[2] = p
[3]
166 = p
[4] = p
[5] = p
[6] = p
[7] = 0UL; return;
167 case 7: p
[0] = p
[1] = p
[2] = p
[3]
168 = p
[4] = p
[5] = p
[6] = 0UL; return;
169 case 6: p
[0] = p
[1] = p
[2] = p
[3]
170 = p
[4] = p
[5] = 0UL; return;
171 case 5: p
[0] = p
[1] = p
[2] = p
[3] = p
[4] = 0UL; return;
172 case 4: p
[0] = p
[1] = p
[2] = p
[3] = 0UL; return;
173 case 3: p
[0] = p
[1] = p
[2] = 0UL; return;
174 case 2: p
[0] = p
[1] = 0UL; return;
175 case 1: p
[0] = 0UL; return;
180 VG_(memset
)(s
, 0, sz
);
184 /* ---------------------------------------------------------------------
185 Address computation helpers
186 ------------------------------------------------------------------ */
188 // Check if an address/whatever is aligned
189 #define VG_IS_2_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)0x1)))
190 #define VG_IS_4_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)0x3)))
191 #define VG_IS_8_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)0x7)))
192 #define VG_IS_16_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)0xf)))
193 #define VG_IS_32_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)0x1f)))
194 #define VG_IS_64_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)0x3f)))
195 #define VG_IS_WORD_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)(sizeof(Addr)-1))))
196 #define VG_IS_PAGE_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)(VKI_PAGE_SIZE-1))))
198 // 'a' -- the alignment -- must be a power of 2.
199 // The latter two require the vki-*.h header to be imported also.
200 #define VG_ROUNDDN(p, a) ((Addr)(p) & ~((Addr)(a)-1))
201 #define VG_ROUNDUP(p, a) VG_ROUNDDN((p)+(a)-1, (a))
202 #define VG_PGROUNDDN(p) VG_ROUNDDN(p, VKI_PAGE_SIZE)
203 #define VG_PGROUNDUP(p) VG_ROUNDUP(p, VKI_PAGE_SIZE)
205 /* Converts `Device ID` given as pair of 32-bit values (dev_major, dev_minor)
206 * to 64-bit dev_t using MMMM Mmmm mmmM MMmm encoding. This is
207 * downward compatible with legacy systems where dev_t is 16 bits wide,
208 * encoded as MMmm. It is also downward compatible with the Linux kernel,
209 * which uses 32-bit dev_t, encoded as mmmM MMmm.
210 * Original macro can be found in bits/sysmacros.h. */
211 #define VG_MAKEDEV(__major, __minor) \
212 ((((ULong) (__major & 0x00000fffu)) << 8) | \
213 (((ULong) (__major & 0xfffff000u)) << 32) | \
214 (((ULong) (__minor & 0x000000ffu)) << 0) | \
215 (((ULong) (__minor & 0xffffff00u)) << 12))
217 /* ---------------------------------------------------------------------
218 Misc useful functions
219 ------------------------------------------------------------------ */
221 /* Like qsort(). The name VG_(ssort) is for historical reasons -- it used
222 * to be a shell sort, but is now a quicksort. */
223 extern void VG_(ssort
)( void* base
, SizeT nmemb
, SizeT size
,
224 Int (*compar
)(const void*, const void*) );
226 /* Returns the base-2 logarithm of a 32 bit unsigned number. Returns
227 -1 if it is not a power of two. Nb: VG_(log2)(1) == 0. */
228 extern Int
VG_(log2
) ( UInt x
);
230 /* Ditto for 64 bit unsigned numbers. */
231 extern Int
VG_(log2_64
)( ULong x
);
233 // A pseudo-random number generator returning a random UInt. If pSeed
234 // is NULL, it uses its own seed, which starts at zero. If pSeed is
235 // non-NULL, it uses and updates whatever pSeed points at.
236 extern UInt
VG_(random
) ( /*MOD*/UInt
* pSeed
);
238 /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and
239 return the updated checksum. If buf is NULL, this function returns
240 the required initial value for the checksum. An Adler-32 checksum is
241 almost as reliable as a CRC32 but can be computed much faster. */
242 extern UInt
VG_(adler32
)( UInt adler
, const UChar
* buf
, UInt len
);
244 #endif // __PUB_TOOL_LIBCBASE_H
246 /*--------------------------------------------------------------------*/
248 /*--------------------------------------------------------------------*/