blob: 2c35ef2d770fdadefd5e571bd36f81c1b5c15ed6 [file] [log] [blame]
njn97405b22005-06-02 03:39:33 +00001
2/*--------------------------------------------------------------------*/
3/*--- Standalone libc stuff. pub_tool_libcbase.h ---*/
4/*--------------------------------------------------------------------*/
5
6/*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
9
sewardj0f157dd2013-10-18 14:27:36 +000010 Copyright (C) 2000-2013 Julian Seward
njn97405b22005-06-02 03:39:33 +000011 jseward@acm.org
12
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.
17
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.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26 02111-1307, USA.
27
28 The GNU General Public License is contained in the file COPYING.
29*/
30
31#ifndef __PUB_TOOL_LIBCBASE_H
32#define __PUB_TOOL_LIBCBASE_H
33
florian535fb1b2013-09-15 13:54:34 +000034#include "pub_tool_basics.h" // VG_ macro
35
njn97405b22005-06-02 03:39:33 +000036/* ---------------------------------------------------------------------
37 Char functions.
38 ------------------------------------------------------------------ */
39
florian19f91bb2012-11-10 22:29:54 +000040extern Bool VG_(isspace) ( HChar c );
41extern Bool VG_(isdigit) ( HChar c );
42extern HChar VG_(tolower) ( HChar c );
njn97405b22005-06-02 03:39:33 +000043
44/* ---------------------------------------------------------------------
45 Converting strings to numbers
46 ------------------------------------------------------------------ */
47
njnea5d2352007-11-11 21:58:21 +000048// Convert strings to numbers according to various bases. Leading
49// whitespace is ignored. A subsequent '-' or '+' is accepted. For strtoll16,
50// accepts an initial "0x" or "0X" prefix, but only if it's followed by a
51// hex digit (if not, the '0' will be read and then it will stop on the
52// "x"/"X".) If 'endptr' isn't NULL, it gets filled in with the first
njn8a0b7042009-02-20 06:10:44 +000053// non-digit char. Returns 0 if no number could be converted, and 'endptr'
54// is set to the start of the string. None of them test that the number
55// fits into 64 bits.
njnea5d2352007-11-11 21:58:21 +000056//
njn83df0b62009-02-25 01:01:05 +000057// Nb: if you're wondering why we don't just have a single VG_(strtoll) which
njnea5d2352007-11-11 21:58:21 +000058// takes a base, it's because I wanted it to assert if it was given a bogus
59// base (the standard glibc one sets 'errno' in this case). But
60// m_libcbase.c doesn't import any code, not even vg_assert. --njn
njn83df0b62009-02-25 01:01:05 +000061//
62// Nb: we also don't provide VG_(atoll*); these functions are worse than
63// useless because they don't do any error checking and so accept malformed
64// numbers and non-numbers -- eg. "123xyz" gives 123, and "foo" gives 0!
65// If you really want that behaviour, you can use "VG_(strtoll10)(str, NULL)".
florian19f91bb2012-11-10 22:29:54 +000066extern Long VG_(strtoll10) ( const HChar* str, HChar** endptr );
67extern Long VG_(strtoll16) ( const HChar* str, HChar** endptr );
68extern ULong VG_(strtoull10) ( const HChar* str, HChar** endptr );
69extern ULong VG_(strtoull16) ( const HChar* str, HChar** endptr );
njnea5d2352007-11-11 21:58:21 +000070
njn83df0b62009-02-25 01:01:05 +000071// Convert a string to a double. After leading whitespace is ignored, a
72// '+' or '-' is allowed, and then it accepts a non-empty sequence of
73// decimal digits possibly containing a '.'. Hexadecimal floats are not
74// accepted, nor are "fancy" floats (eg. "3.4e-5", "NAN").
florian19f91bb2012-11-10 22:29:54 +000075extern double VG_(strtod) ( const HChar* str, HChar** endptr );
njnea5d2352007-11-11 21:58:21 +000076
njn97405b22005-06-02 03:39:33 +000077/* ---------------------------------------------------------------------
78 String functions and macros
79 ------------------------------------------------------------------ */
80
njn83df0b62009-02-25 01:01:05 +000081/* Use this for normal null-termination-style string comparison. */
njnfdec4032006-12-14 03:29:18 +000082#define VG_STREQ(s1,s2) ( (s1 != NULL && s2 != NULL \
83 && VG_(strcmp)((s1),(s2))==0) ? True : False )
njn83df0b62009-02-25 01:01:05 +000084#define VG_STREQN(n,s1,s2) ( (s1 != NULL && s2 != NULL \
85 && VG_(strncmp)((s1),(s2),(n))==0) ? True : False )
njn97405b22005-06-02 03:39:33 +000086
florian19f91bb2012-11-10 22:29:54 +000087extern SizeT VG_(strlen) ( const HChar* str );
88extern HChar* VG_(strcat) ( HChar* dest, const HChar* src );
89extern HChar* VG_(strncat) ( HChar* dest, const HChar* src, SizeT n );
90extern HChar* VG_(strpbrk) ( const HChar* s, const HChar* accpt );
91extern HChar* VG_(strcpy) ( HChar* dest, const HChar* src );
92extern HChar* VG_(strncpy) ( HChar* dest, const HChar* src, SizeT ndest );
93extern Int VG_(strcmp) ( const HChar* s1, const HChar* s2 );
94extern Int VG_(strcasecmp) ( const HChar* s1, const HChar* s2 );
95extern Int VG_(strncmp) ( const HChar* s1, const HChar* s2, SizeT nmax );
96extern Int VG_(strncasecmp) ( const HChar* s1, const HChar* s2, SizeT nmax );
97extern HChar* VG_(strstr) ( const HChar* haystack, const HChar* needle );
98extern HChar* VG_(strcasestr) ( const HChar* haystack, const HChar* needle );
99extern HChar* VG_(strchr) ( const HChar* s, HChar c );
100extern HChar* VG_(strrchr) ( const HChar* s, HChar c );
101extern SizeT VG_(strspn) ( const HChar* s, const HChar* accpt );
102extern SizeT VG_(strcspn) ( const HChar* s, const HChar* reject );
njn97405b22005-06-02 03:39:33 +0000103
sewardj3b290482011-05-06 21:02:55 +0000104/* strtok* functions and some parsing utilities. */
florian19f91bb2012-11-10 22:29:54 +0000105extern HChar* VG_(strtok_r) (HChar* s, const HChar* delim, HChar** saveptr);
106extern HChar* VG_(strtok) (HChar* s, const HChar* delim);
sewardj3b290482011-05-06 21:02:55 +0000107
108/* Parse a 32- or 64-bit hex number, including leading 0x, from string
109 starting at *ppc, putting result in *result, and return True. Or
110 fail, in which case *ppc and *result are undefined, and return
111 False. */
florian19f91bb2012-11-10 22:29:54 +0000112extern Bool VG_(parse_Addr) ( const HChar** ppc, Addr* result );
sewardj3b290482011-05-06 21:02:55 +0000113
philippe0c2923f2014-04-19 09:52:32 +0000114/* Parse an "enum set" made of one or more words comma separated.
philippea7d70b12014-04-19 10:27:28 +0000115 The allowed word values are given in 'tokens', separated by comma.
116 If a word in 'tokens' is found in 'input', the corresponding bit
117 will be set in *enum_set (words in 'tokens' are numbered starting from 0).
118 Using in 'tokens' the special token "-" (a minus character) indicates that
119 the corresponding bit position cannot be set.
120 In addition to the words specified in 'tokens', VG_(parse_enum_set)
philippeec905f72014-08-17 20:03:51 +0000121 automatically accept the word "none" to indicate an empty enum_set (0).
122 If allow_all, VG_(parse_enum_set) automatically accept the word "all"
123 to indicate an enum_set with all bits corresponding to the words in tokens
124 set.
philippea7d70b12014-04-19 10:27:28 +0000125 If "none" or "all" is present in 'input', no other word can be given
126 in 'input'.
philippe0c2923f2014-04-19 09:52:32 +0000127 If parsing is successful, returns True and sets *enum_set.
128 If parsing fails, returns False. */
129extern Bool VG_(parse_enum_set) ( const HChar *tokens,
philippeec905f72014-08-17 20:03:51 +0000130 Bool allow_all,
philippe0c2923f2014-04-19 09:52:32 +0000131 const HChar *input,
132 UInt *enum_set);
133
njn97405b22005-06-02 03:39:33 +0000134/* Like strncpy(), but if 'src' is longer than 'ndest' inserts a '\0' as the
135 last character. */
florian19f91bb2012-11-10 22:29:54 +0000136extern void VG_(strncpy_safely) ( HChar* dest, const HChar* src, SizeT ndest );
njn97405b22005-06-02 03:39:33 +0000137
njn97405b22005-06-02 03:39:33 +0000138/* ---------------------------------------------------------------------
139 mem* functions
140 ------------------------------------------------------------------ */
141
142extern void* VG_(memcpy) ( void *d, const void *s, SizeT sz );
sewardjbbec7722007-11-25 14:08:53 +0000143extern void* VG_(memmove)( void *d, const void *s, SizeT sz );
njn97405b22005-06-02 03:39:33 +0000144extern void* VG_(memset) ( void *s, Int c, SizeT sz );
145extern Int VG_(memcmp) ( const void* s1, const void* s2, SizeT n );
146
sewardjcc490742014-01-13 00:17:54 +0000147/* Zero out up to 12 words quickly in-line. Do not use this for blocks
sewardjf7183e32010-03-14 17:19:02 +0000148 of size which are unknown at compile time, since the whole point is
149 for it to be inlined, and then for gcc to remove all code except
150 for the relevant 'sz' case. */
151inline __attribute__((always_inline))
152static void VG_(bzero_inline) ( void* s, SizeT sz )
153{
154 if (LIKELY(0 == (((Addr)sz) & (Addr)(sizeof(UWord)-1)))
155 && LIKELY(0 == (((Addr)s) & (Addr)(sizeof(UWord)-1)))) {
156 UWord* p = (UWord*)s;
157 switch (sz / (SizeT)sizeof(UWord)) {
sewardjcc490742014-01-13 00:17:54 +0000158 case 12: p[0] = p[1] = p[2] = p[3]
159 = p[4] = p[5] = p[6] = p[7]
160 = p[8] = p[9] = p[10] = p[11] = 0UL; return;
161 case 11: p[0] = p[1] = p[2] = p[3]
162 = p[4] = p[5] = p[6] = p[7]
163 = p[8] = p[9] = p[10] = 0UL; return;
164 case 10: p[0] = p[1] = p[2] = p[3]
165 = p[4] = p[5] = p[6] = p[7]
166 = p[8] = p[9] = 0UL; return;
167 case 9: p[0] = p[1] = p[2] = p[3]
168 = p[4] = p[5] = p[6] = p[7]
169 = p[8] = 0UL; return;
sewardjf7183e32010-03-14 17:19:02 +0000170 case 8: p[0] = p[1] = p[2] = p[3]
171 = p[4] = p[5] = p[6] = p[7] = 0UL; return;
172 case 7: p[0] = p[1] = p[2] = p[3]
173 = p[4] = p[5] = p[6] = 0UL; return;
174 case 6: p[0] = p[1] = p[2] = p[3]
175 = p[4] = p[5] = 0UL; return;
176 case 5: p[0] = p[1] = p[2] = p[3] = p[4] = 0UL; return;
177 case 4: p[0] = p[1] = p[2] = p[3] = 0UL; return;
178 case 3: p[0] = p[1] = p[2] = 0UL; return;
179 case 2: p[0] = p[1] = 0UL; return;
sewardj39d234a2010-03-15 09:03:25 +0000180 case 1: p[0] = 0UL; return;
sewardjf7183e32010-03-14 17:19:02 +0000181 case 0: return;
182 default: break;
183 }
184 }
185 VG_(memset)(s, 0, sz);
186}
187
188
njn97405b22005-06-02 03:39:33 +0000189/* ---------------------------------------------------------------------
190 Address computation helpers
191 ------------------------------------------------------------------ */
192
193// Check if an address/whatever is aligned
njn1d0825f2006-03-27 11:37:07 +0000194#define VG_IS_2_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)0x1)))
njn97405b22005-06-02 03:39:33 +0000195#define VG_IS_4_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)0x3)))
196#define VG_IS_8_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)0x7)))
197#define VG_IS_16_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)0xf)))
njnf76d27a2009-05-28 01:53:07 +0000198#define VG_IS_32_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)0x1f)))
njn97405b22005-06-02 03:39:33 +0000199#define VG_IS_WORD_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)(sizeof(Addr)-1))))
200#define VG_IS_PAGE_ALIGNED(aaa_p) (0 == (((Addr)(aaa_p)) & ((Addr)(VKI_PAGE_SIZE-1))))
201
njn5363a562005-06-12 04:34:51 +0000202// 'a' -- the alignment -- must be a power of 2.
203// The latter two require the vki-*.h header to be imported also.
204#define VG_ROUNDDN(p, a) ((Addr)(p) & ~((Addr)(a)-1))
205#define VG_ROUNDUP(p, a) VG_ROUNDDN((p)+(a)-1, (a))
206#define VG_PGROUNDDN(p) VG_ROUNDDN(p, VKI_PAGE_SIZE)
207#define VG_PGROUNDUP(p) VG_ROUNDUP(p, VKI_PAGE_SIZE)
208
njn97405b22005-06-02 03:39:33 +0000209/* ---------------------------------------------------------------------
210 Misc useful functions
211 ------------------------------------------------------------------ */
212
njnfab29902008-03-03 02:15:03 +0000213/* Like qsort(). The name VG_(ssort) is for historical reasons -- it used
214 * to be a shell sort, but is now a quicksort. */
njn97405b22005-06-02 03:39:33 +0000215extern void VG_(ssort)( void* base, SizeT nmemb, SizeT size,
florian6bd9dc12012-11-23 16:17:43 +0000216 Int (*compar)(const void*, const void*) );
njn97405b22005-06-02 03:39:33 +0000217
sewardjaebbf1c2011-06-13 13:14:00 +0000218/* Returns the base-2 logarithm of a 32 bit unsigned number. Returns
219 -1 if it is not a power of two. Nb: VG_(log2)(1) == 0. */
sewardjb8b79ad2008-03-03 01:35:41 +0000220extern Int VG_(log2) ( UInt x );
njn97405b22005-06-02 03:39:33 +0000221
sewardjaebbf1c2011-06-13 13:14:00 +0000222/* Ditto for 64 bit unsigned numbers. */
223extern Int VG_(log2_64)( ULong x );
224
sewardj45f4e7c2005-09-27 19:20:21 +0000225// A pseudo-random number generator returning a random UInt. If pSeed
226// is NULL, it uses its own seed, which starts at zero. If pSeed is
227// non-NULL, it uses and updates whatever pSeed points at.
228extern UInt VG_(random) ( /*MOD*/UInt* pSeed );
njn9828b342005-07-08 04:08:59 +0000229
sewardj5d616df2013-07-02 08:07:15 +0000230/* Update a running Adler-32 checksum with the bytes buf[0..len-1] and
231 return the updated checksum. If buf is NULL, this function returns
232 the required initial value for the checksum. An Adler-32 checksum is
233 almost as reliable as a CRC32 but can be computed much faster. */
234extern UInt VG_(adler32)( UInt adler, const UChar* buf, UInt len);
235
njn97405b22005-06-02 03:39:33 +0000236#endif // __PUB_TOOL_LIBCBASE_H
237
238/*--------------------------------------------------------------------*/
239/*--- end ---*/
240/*--------------------------------------------------------------------*/