1221666fbecd5198908befdb3d21d6c5ea9835a57njn// This module does unit testing of m_libcbase.
2221666fbecd5198908befdb3d21d6c5ea9835a57njn
3221666fbecd5198908befdb3d21d6c5ea9835a57njn#include <assert.h>
4221666fbecd5198908befdb3d21d6c5ea9835a57njn#include <stdio.h>
5221666fbecd5198908befdb3d21d6c5ea9835a57njn#include <stdlib.h>
6421c26e30de64ccf441ec398c1f8beda7afbb47cflorian#include <stddef.h>
7221666fbecd5198908befdb3d21d6c5ea9835a57njn
8cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#include "pub_tool_basics.h"  /* UInt et al, needed for pub_tool_vki.h */
9132fdb03f69d704bb4777831936e169bd2380242njn#include "pub_tool_vki.h"
10132fdb03f69d704bb4777831936e169bd2380242njn#include "m_libcbase.c"
11221666fbecd5198908befdb3d21d6c5ea9835a57njn
12421c26e30de64ccf441ec398c1f8beda7afbb47cflorian/* Provide a stub to not have to pull in m_debuglog.c */
13421c26e30de64ccf441ec398c1f8beda7afbb47cflorianvoid VG_(debugLog) ( Int level, const HChar* modulename,
14421c26e30de64ccf441ec398c1f8beda7afbb47cflorian                                const HChar* format, ... )
15421c26e30de64ccf441ec398c1f8beda7afbb47cflorian{
16421c26e30de64ccf441ec398c1f8beda7afbb47cflorian   va_list args;
17421c26e30de64ccf441ec398c1f8beda7afbb47cflorian   va_start(args, format);
18421c26e30de64ccf441ec398c1f8beda7afbb47cflorian   fprintf(stderr, "debuglog: %s: ", modulename);
19421c26e30de64ccf441ec398c1f8beda7afbb47cflorian   vfprintf(stderr, format, args);
20421c26e30de64ccf441ec398c1f8beda7afbb47cflorian   va_end(args);
21421c26e30de64ccf441ec398c1f8beda7afbb47cflorian}
22421c26e30de64ccf441ec398c1f8beda7afbb47cflorian
23421c26e30de64ccf441ec398c1f8beda7afbb47cflorian/* Provide a stub to not have to pull in m_libcassert.c */
24421c26e30de64ccf441ec398c1f8beda7afbb47cflorianvoid VG_(exit_now)( Int status )
25421c26e30de64ccf441ec398c1f8beda7afbb47cflorian{
26421c26e30de64ccf441ec398c1f8beda7afbb47cflorian   exit(status);
27421c26e30de64ccf441ec398c1f8beda7afbb47cflorian}
28421c26e30de64ccf441ec398c1f8beda7afbb47cflorian
29421c26e30de64ccf441ec398c1f8beda7afbb47cflorian
302a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn#define  CHECK(x) \
313119a2b75cdb58b960c6299f2641dce8023fef5bflorian   if (!(x)) { fprintf(stderr, "failure: %s:%d\n", __FILE__, __LINE__); }
32221666fbecd5198908befdb3d21d6c5ea9835a57njn
3324d9863ba4d07d1d131ed621fb6353e08a46485bbart
34132fdb03f69d704bb4777831936e169bd2380242njnvoid test_VG_STREQ(void)
35132fdb03f69d704bb4777831936e169bd2380242njn{
36132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQ(NULL,    NULL) );  // Nb: strcmp() considers these equal
37132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQ(NULL,    "ab") );  // Nb: strcmp() seg faults on this
38132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQ("ab",    NULL) );  // Nb: strcmp() seg faults on this
39132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQ("",      "a")  );
40132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQ("a",     "")   );
41132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQ("abc",   "abcd"));
42132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQ("abcd",  "abc") );
43132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQ("Abcd",  "abcd"));
44132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQ("abcd",  "Abcd"));
45132fdb03f69d704bb4777831936e169bd2380242njn
46132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VG_STREQ("",     "") );
47132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VG_STREQ("a",    "a") );
48132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VG_STREQ("abcd", "abcd") );
49132fdb03f69d704bb4777831936e169bd2380242njn}
50132fdb03f69d704bb4777831936e169bd2380242njn
51132fdb03f69d704bb4777831936e169bd2380242njnvoid test_VG_STREQN(void)
52132fdb03f69d704bb4777831936e169bd2380242njn{
53132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQN(0, NULL,    NULL) );
54132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQN(5, NULL,    NULL) );
55132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQN(0, NULL,    "ab") );
56132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQN(5, NULL,    "ab") );
57132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQN(0, "ab",    NULL) );
58132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQN(1, "",      "a")  );
59132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQN(1, "a",     "")   );
60132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQN(4, "abc",   "abcd"));
61132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQN(4, "abcd",  "abc") );
62132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQN(1, "Abcd",  "abcd"));
63132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQN(4, "Abcd",  "abcd"));
64132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQN(4, "abcd",  "abce"));
65132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_STREQN(9, "abcd",  "abce"));
66132fdb03f69d704bb4777831936e169bd2380242njn
67132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VG_STREQN(0, "",     "") );
68132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VG_STREQN(1, "",     "") );
69132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VG_STREQN(0, "a",    "a") );
70132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VG_STREQN(1, "a",    "a") );
71132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VG_STREQN(2, "a",    "a") );
72132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VG_STREQN(9, "a",    "a") );
73132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VG_STREQN(1, "ab",   "ac"));
74132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VG_STREQN(3, "abcd", "abce"));
75132fdb03f69d704bb4777831936e169bd2380242njn}
76132fdb03f69d704bb4777831936e169bd2380242njn
77f57115c7a0eb64bba945a002a786e8478291eedcnjn// On PPC/Linux VKI_PAGE_SIZE is a variable, not a macro.
78cae0cc22b83ffb260ee8379e92099c5a701944cbcarll#if defined(VGP_ppc32_linux) || defined(VGP_ppc64be_linux) \
79cae0cc22b83ffb260ee8379e92099c5a701944cbcarll    || defined(VGP_ppc64le_linux)
80f57115c7a0eb64bba945a002a786e8478291eedcnjnunsigned long VKI_PAGE_SIZE  = 1UL << 12;
8114857fd46dc3e69a1dff772557ac2757059bfb55sewardj#elif defined(VGP_arm64_linux)
8214857fd46dc3e69a1dff772557ac2757059bfb55sewardjunsigned long VKI_PAGE_SIZE  = 1UL << 16;
83f57115c7a0eb64bba945a002a786e8478291eedcnjn#endif
84f57115c7a0eb64bba945a002a786e8478291eedcnjn
8529a100cbcd50426b422cac5c855b38384c7c37c5njnvoid test_VG_IS_XYZ_ALIGNED(void)
86132fdb03f69d704bb4777831936e169bd2380242njn{
87132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_2_ALIGNED(0x0) );
88132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_2_ALIGNED(0x1) );
89132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_2_ALIGNED(0x2) );
90132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_2_ALIGNED(0x3) );
91132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_2_ALIGNED(0x4) );
92132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_2_ALIGNED(0x5) );
93132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_2_ALIGNED(0x6) );
94132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_2_ALIGNED(0x7) );
95132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_2_ALIGNED(0x8) );
96132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_2_ALIGNED(0x9) );
97132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_2_ALIGNED(0xa) );
98132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_2_ALIGNED(0xb) );
99132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_2_ALIGNED(0xc) );
100132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_2_ALIGNED(0xd) );
101132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_2_ALIGNED(0xe) );
102132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_2_ALIGNED(0xf) );
103132fdb03f69d704bb4777831936e169bd2380242njn
104132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_4_ALIGNED(0x0) );
105132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_4_ALIGNED(0x1) );
106132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_4_ALIGNED(0x2) );
107132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_4_ALIGNED(0x3) );
108132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_4_ALIGNED(0x4) );
109132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_4_ALIGNED(0x5) );
110132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_4_ALIGNED(0x6) );
111132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_4_ALIGNED(0x7) );
112132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_4_ALIGNED(0x8) );
113132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_4_ALIGNED(0x9) );
114132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_4_ALIGNED(0xa) );
115132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_4_ALIGNED(0xb) );
116132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_4_ALIGNED(0xc) );
117132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_4_ALIGNED(0xd) );
118132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_4_ALIGNED(0xe) );
119132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_4_ALIGNED(0xf) );
120132fdb03f69d704bb4777831936e169bd2380242njn
121132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_8_ALIGNED(0x0) );
122132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_8_ALIGNED(0x1) );
123132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_8_ALIGNED(0x2) );
124132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_8_ALIGNED(0x3) );
125132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_8_ALIGNED(0x4) );
126132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_8_ALIGNED(0x5) );
127132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_8_ALIGNED(0x6) );
128132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_8_ALIGNED(0x7) );
129132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_8_ALIGNED(0x8) );
130132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_8_ALIGNED(0x9) );
131132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_8_ALIGNED(0xa) );
132132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_8_ALIGNED(0xb) );
133132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_8_ALIGNED(0xc) );
134132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_8_ALIGNED(0xd) );
135132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_8_ALIGNED(0xe) );
136132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_8_ALIGNED(0xf) );
137132fdb03f69d704bb4777831936e169bd2380242njn
138132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_16_ALIGNED(0x0) );
139132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0x1) );
140132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0x2) );
141132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0x3) );
142132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0x4) );
143132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0x5) );
144132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0x6) );
145132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0x7) );
146132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0x8) );
147132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0x9) );
148132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0xa) );
149132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0xb) );
150132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0xc) );
151132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0xd) );
152132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0xe) );
153132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_16_ALIGNED(0xf) );
154132fdb03f69d704bb4777831936e169bd2380242njn
155132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_WORD_ALIGNED(0x0) );
156132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_WORD_ALIGNED(0x1) );
157132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_WORD_ALIGNED(0x2) );
158132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_WORD_ALIGNED(0x3) );
159132fdb03f69d704bb4777831936e169bd2380242njn   // 0x4 case below
160132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_WORD_ALIGNED(0x5) );
161132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_WORD_ALIGNED(0x6) );
162132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_WORD_ALIGNED(0x7) );
163132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_WORD_ALIGNED(0x8) );
164132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_WORD_ALIGNED(0x9) );
165132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_WORD_ALIGNED(0xa) );
166132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_WORD_ALIGNED(0xb) );
167132fdb03f69d704bb4777831936e169bd2380242njn   // 0xc case below
168132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_WORD_ALIGNED(0xd) );
169132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_WORD_ALIGNED(0xe) );
170132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_WORD_ALIGNED(0xf) );
171132fdb03f69d704bb4777831936e169bd2380242njn   if        (4 == sizeof(void*)) {
172132fdb03f69d704bb4777831936e169bd2380242njn      CHECK(   VG_IS_WORD_ALIGNED(0x4) );
173132fdb03f69d704bb4777831936e169bd2380242njn      CHECK(   VG_IS_WORD_ALIGNED(0xc) );
174132fdb03f69d704bb4777831936e169bd2380242njn   } else if (8 == sizeof(void*)) {
175132fdb03f69d704bb4777831936e169bd2380242njn      CHECK( ! VG_IS_WORD_ALIGNED(0x4) );
176132fdb03f69d704bb4777831936e169bd2380242njn      CHECK( ! VG_IS_WORD_ALIGNED(0xc) );
177132fdb03f69d704bb4777831936e169bd2380242njn   } else {
178132fdb03f69d704bb4777831936e169bd2380242njn      assert(0);
179132fdb03f69d704bb4777831936e169bd2380242njn   }
180132fdb03f69d704bb4777831936e169bd2380242njn
181132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_PAGE_ALIGNED(0x0) );
182132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_PAGE_ALIGNED(0x1) );
183132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_PAGE_ALIGNED(0x2) );
184132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_PAGE_ALIGNED(0x3) );
185132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_PAGE_ALIGNED(0x4) );
186132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE-1) );
187132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(   VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE  ) );
188132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( ! VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE+1) );
189132fdb03f69d704bb4777831936e169bd2380242njn}
190132fdb03f69d704bb4777831936e169bd2380242njn
191132fdb03f69d704bb4777831936e169bd2380242njnvoid test_VG_ROUND_et_al()
192132fdb03f69d704bb4777831936e169bd2380242njn{
193132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(0, 1) );
194132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 1 == VG_ROUNDDN(1, 1) );
195132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 2 == VG_ROUNDDN(2, 1) );
196132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 3 == VG_ROUNDDN(3, 1) );
197132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 4 == VG_ROUNDDN(4, 1) );
198132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 5 == VG_ROUNDDN(5, 1) );
199132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 6 == VG_ROUNDDN(6, 1) );
200132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 7 == VG_ROUNDDN(7, 1) );
201132fdb03f69d704bb4777831936e169bd2380242njn
202132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDUP(0, 1) );
203132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 1 == VG_ROUNDUP(1, 1) );
204132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 2 == VG_ROUNDUP(2, 1) );
205132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 3 == VG_ROUNDUP(3, 1) );
206132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 4 == VG_ROUNDUP(4, 1) );
207132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 5 == VG_ROUNDUP(5, 1) );
208132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 6 == VG_ROUNDUP(6, 1) );
209132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 7 == VG_ROUNDUP(7, 1) );
210132fdb03f69d704bb4777831936e169bd2380242njn
211132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(0, 2) );
212132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(1, 2) );
213132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 2 == VG_ROUNDDN(2, 2) );
214132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 2 == VG_ROUNDDN(3, 2) );
215132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 4 == VG_ROUNDDN(4, 2) );
216132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 4 == VG_ROUNDDN(5, 2) );
217132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 6 == VG_ROUNDDN(6, 2) );
218132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 6 == VG_ROUNDDN(7, 2) );
219132fdb03f69d704bb4777831936e169bd2380242njn
220132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDUP(0, 2) );
221132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 2 == VG_ROUNDUP(1, 2) );
222132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 2 == VG_ROUNDUP(2, 2) );
223132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 4 == VG_ROUNDUP(3, 2) );
224132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 4 == VG_ROUNDUP(4, 2) );
225132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 6 == VG_ROUNDUP(5, 2) );
226132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 6 == VG_ROUNDUP(6, 2) );
227132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 8 == VG_ROUNDUP(7, 2) );
228132fdb03f69d704bb4777831936e169bd2380242njn
229132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(0, 4) );
230132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(1, 4) );
231132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(2, 4) );
232132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(3, 4) );
233132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 4 == VG_ROUNDDN(4, 4) );
234132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 4 == VG_ROUNDDN(5, 4) );
235132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 4 == VG_ROUNDDN(6, 4) );
236132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 4 == VG_ROUNDDN(7, 4) );
237132fdb03f69d704bb4777831936e169bd2380242njn
238132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDUP(0, 4) );
239132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 4 == VG_ROUNDUP(1, 4) );
240132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 4 == VG_ROUNDUP(2, 4) );
241132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 4 == VG_ROUNDUP(3, 4) );
242132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 4 == VG_ROUNDUP(4, 4) );
243132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 8 == VG_ROUNDUP(5, 4) );
244132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 8 == VG_ROUNDUP(6, 4) );
245132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 8 == VG_ROUNDUP(7, 4) );
246132fdb03f69d704bb4777831936e169bd2380242njn
247132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(0, 8) );
248132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(1, 8) );
249132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(2, 8) );
250132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(3, 8) );
251132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(4, 8) );
252132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(5, 8) );
253132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(6, 8) );
254132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDDN(7, 8) );
255132fdb03f69d704bb4777831936e169bd2380242njn
256132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0 == VG_ROUNDUP(0, 8) );
257132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 8 == VG_ROUNDUP(1, 8) );
258132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 8 == VG_ROUNDUP(2, 8) );
259132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 8 == VG_ROUNDUP(3, 8) );
260132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 8 == VG_ROUNDUP(4, 8) );
261132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 8 == VG_ROUNDUP(5, 8) );
262132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 8 == VG_ROUNDUP(6, 8) );
263132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 8 == VG_ROUNDUP(7, 8) );
264132fdb03f69d704bb4777831936e169bd2380242njn
265132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0             == VG_PGROUNDDN(0) );
266132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0             == VG_PGROUNDDN(1) );
267132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0             == VG_PGROUNDDN(2) );
268132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0             == VG_PGROUNDDN(3) );
269132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0             == VG_PGROUNDDN(4) );
270132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0             == VG_PGROUNDDN(VKI_PAGE_SIZE-1) );
271132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VKI_PAGE_SIZE == VG_PGROUNDDN(VKI_PAGE_SIZE  ) );
272132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VKI_PAGE_SIZE == VG_PGROUNDDN(VKI_PAGE_SIZE+1) );
273132fdb03f69d704bb4777831936e169bd2380242njn
274132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 0               == VG_PGROUNDUP(0) );
275132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(1) );
276132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(2) );
277132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(3) );
278132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(4) );
279132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(VKI_PAGE_SIZE-1) );
280132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(VKI_PAGE_SIZE  ) );
281132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( VKI_PAGE_SIZE*2 == VG_PGROUNDUP(VKI_PAGE_SIZE+1) );
282132fdb03f69d704bb4777831936e169bd2380242njn}
283132fdb03f69d704bb4777831936e169bd2380242njn
284132fdb03f69d704bb4777831936e169bd2380242njnvoid test_isspace(void)
285221666fbecd5198908befdb3d21d6c5ea9835a57njn{
2862a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK(   VG_(isspace)(' ') );
2872a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK(   VG_(isspace)('\n') );
2882a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK(   VG_(isspace)('\t') );
2892a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK( ! VG_(isspace)('3') );
2902a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK( ! VG_(isspace)('x') );
291132fdb03f69d704bb4777831936e169bd2380242njn}
2922a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn
293132fdb03f69d704bb4777831936e169bd2380242njnvoid test_isdigit(void)
294132fdb03f69d704bb4777831936e169bd2380242njn{
2952a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK(   VG_(isdigit)('0') );
2962a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK(   VG_(isdigit)('1') );
2972a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK(   VG_(isdigit)('5') );
2982a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK(   VG_(isdigit)('9') );
2992a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK( ! VG_(isdigit)('a') );
3002a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK( ! VG_(isdigit)('!') );
301221666fbecd5198908befdb3d21d6c5ea9835a57njn}
302221666fbecd5198908befdb3d21d6c5ea9835a57njn
303132fdb03f69d704bb4777831936e169bd2380242njnvoid test_is_dec_digit()
304221666fbecd5198908befdb3d21d6c5ea9835a57njn{
305221666fbecd5198908befdb3d21d6c5ea9835a57njn   Long x;
3062a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK( is_dec_digit('0', &x) && 0 == x );
3072a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK( is_dec_digit('1', &x) && 1 == x );
3082a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK( is_dec_digit('9', &x) && 9 == x );
309132fdb03f69d704bb4777831936e169bd2380242njn}
3102a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn
311132fdb03f69d704bb4777831936e169bd2380242njnvoid test_is_hex_digit()
312132fdb03f69d704bb4777831936e169bd2380242njn{
313132fdb03f69d704bb4777831936e169bd2380242njn   Long x;
3142a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK( is_hex_digit('0', &x) &&  0 == x );
3152a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK( is_hex_digit('1', &x) &&  1 == x );
3162a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK( is_hex_digit('9', &x) &&  9 == x );
3172a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK( is_hex_digit('a', &x) && 10 == x );
3182a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK( is_hex_digit('f', &x) && 15 == x );
3192a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK( is_hex_digit('A', &x) && 10 == x );
3202a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   CHECK( is_hex_digit('F', &x) && 15 == x );
321221666fbecd5198908befdb3d21d6c5ea9835a57njn}
322221666fbecd5198908befdb3d21d6c5ea9835a57njn
323132fdb03f69d704bb4777831936e169bd2380242njnvoid test_strtoll_and_strtod(void)
324221666fbecd5198908befdb3d21d6c5ea9835a57njn{
325221666fbecd5198908befdb3d21d6c5ea9835a57njn   // For VG_(strtoll*)()
326221666fbecd5198908befdb3d21d6c5ea9835a57njn   typedef struct {
327654b542166d7f2e8e89f1cd8430e7ed2ba96f230florian      HChar* str;        // The string to convert.
328654b542166d7f2e8e89f1cd8430e7ed2ba96f230florian      Long   res;        // The result.
329654b542166d7f2e8e89f1cd8430e7ed2ba96f230florian      HChar  endptr_val; // The char one past the end of the converted text.
330221666fbecd5198908befdb3d21d6c5ea9835a57njn   } StrtollInputs;
331221666fbecd5198908befdb3d21d6c5ea9835a57njn
332221666fbecd5198908befdb3d21d6c5ea9835a57njn   // VG_(strtoll10)()
333221666fbecd5198908befdb3d21d6c5ea9835a57njn   {
334221666fbecd5198908befdb3d21d6c5ea9835a57njn      StrtollInputs a[] = {
335221666fbecd5198908befdb3d21d6c5ea9835a57njn         // If there's no number at the head of the string, return 0, and
336221666fbecd5198908befdb3d21d6c5ea9835a57njn         // make 'endptr' point to the start of the string.
337cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "",      .res = 0, .endptr_val = '\0' },
338cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = " \n\t", .res = 0, .endptr_val = ' '  },
339cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "one",   .res = 0, .endptr_val = 'o'  },
340cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "\ntwo", .res = 0, .endptr_val = '\n' },
341221666fbecd5198908befdb3d21d6c5ea9835a57njn
342221666fbecd5198908befdb3d21d6c5ea9835a57njn         // Successful conversion.  Leading whitespace is ignored.  A single
343221666fbecd5198908befdb3d21d6c5ea9835a57njn         // '-' or '+' is accepted.
344cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str =  "0",            .res =       0, .endptr_val = '\0' },
345cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "+0",            .res =       0, .endptr_val = '\0' },
346cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "-0",            .res =       0, .endptr_val = '\0' },
347cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str =  "1",            .res =       1, .endptr_val = '\0' },
348cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "+1",            .res =       1, .endptr_val = '\0' },
349cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "-1",            .res =      -1, .endptr_val = '\0' },
350cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "12",            .res =      12, .endptr_val = '\0' },
351cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "-567",          .res =    -567, .endptr_val = '\0' },
352cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "1234567",       .res = 1234567, .endptr_val = '\0' },
353cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "007",           .res =       7, .endptr_val = '\0' },
354cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "   +42",        .res =      42, .endptr_val = '\0' },
355cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "\n\t\r\v  -56", .res =     -56, .endptr_val = '\0' },
356cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "123xyz",        .res =     123, .endptr_val = 'x'  },
357cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = " -123abc",      .res =    -123, .endptr_val = 'a'  },
358221666fbecd5198908befdb3d21d6c5ea9835a57njn
359221666fbecd5198908befdb3d21d6c5ea9835a57njn         // Whitespace after the +/- is not allowed;  conversion fails.
360cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "+ 1",   .res =  0, .endptr_val = '+' },
361cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "-\n1",  .res =  0, .endptr_val = '-' },
362221666fbecd5198908befdb3d21d6c5ea9835a57njn      };
363221666fbecd5198908befdb3d21d6c5ea9835a57njn
364221666fbecd5198908befdb3d21d6c5ea9835a57njn      // Nb: We test the results against strtoll() as well.
365221666fbecd5198908befdb3d21d6c5ea9835a57njn      int i;
366221666fbecd5198908befdb3d21d6c5ea9835a57njn      for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) {
36719f91bbaedb4caef8a60ce94b0f507193cc0bc10florian         HChar* endptr1;
36819f91bbaedb4caef8a60ce94b0f507193cc0bc10florian         HChar* endptr2;
369221666fbecd5198908befdb3d21d6c5ea9835a57njn         Long      res1 = VG_(strtoll10)(a[i].str, &endptr1);
370221666fbecd5198908befdb3d21d6c5ea9835a57njn         long long res2 =     strtoll   (a[i].str, &endptr2, 10);
371221666fbecd5198908befdb3d21d6c5ea9835a57njn         //printf("res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1);
372221666fbecd5198908befdb3d21d6c5ea9835a57njn         //printf("res2 = %lld, *endptr2 = '%c'\n", res2, *endptr2);
3732a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn         CHECK(a[i].res == res1 && a[i].endptr_val == *endptr1);
3742a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn         CHECK(res2     == res1 && *endptr2        == *endptr1);
375221666fbecd5198908befdb3d21d6c5ea9835a57njn      }
376221666fbecd5198908befdb3d21d6c5ea9835a57njn   }
377221666fbecd5198908befdb3d21d6c5ea9835a57njn
378221666fbecd5198908befdb3d21d6c5ea9835a57njn   // VG_(strtoll16)()
379221666fbecd5198908befdb3d21d6c5ea9835a57njn   {
380221666fbecd5198908befdb3d21d6c5ea9835a57njn      StrtollInputs a[] = {
381221666fbecd5198908befdb3d21d6c5ea9835a57njn         // If there's no number at the head of the string, return 0, and
382221666fbecd5198908befdb3d21d6c5ea9835a57njn         // make 'endptr' point to the start of the string.
383cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "",      .res = 0, .endptr_val = '\0' },
384cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = " \n\t", .res = 0, .endptr_val = ' '  },
385cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "one",   .res = 0, .endptr_val = 'o'  },
386cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "\ntwo", .res = 0, .endptr_val = '\n' },
387221666fbecd5198908befdb3d21d6c5ea9835a57njn
388221666fbecd5198908befdb3d21d6c5ea9835a57njn         // Successful conversion.  Leading whitespace is ignored.  A single
389221666fbecd5198908befdb3d21d6c5ea9835a57njn         // '-' or '+' is accepted.  "0X" and "0x" are also allowed at the
390221666fbecd5198908befdb3d21d6c5ea9835a57njn         // front, but if no digits follow, just the "0" is converted.
391cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str =   "0",           .res =        0, .endptr_val = '\0' },
392cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "0x0",           .res =        0, .endptr_val = '\0' },
393cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "0X0",           .res =        0, .endptr_val = '\0' },
394cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "0x",            .res =        0, .endptr_val = 'x'  },
395cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "0Xg",           .res =        0, .endptr_val = 'X'  },
396cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str =   "0",           .res =        0, .endptr_val = '\0' },
397cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str =  "+0",           .res =        0, .endptr_val = '\0' },
398cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str =  "-0",           .res =        0, .endptr_val = '\0' },
399cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str =   "1",           .res =        1, .endptr_val = '\0' },
400cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str =  "+1",           .res =        1, .endptr_val = '\0' },
401cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str =  "-1",           .res =       -1, .endptr_val = '\0' },
402cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str =  "1a",           .res =       26, .endptr_val = '\0' },
403cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "-5F7",          .res =    -1527, .endptr_val = '\0' },
404cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "0x1234567",     .res = 19088743, .endptr_val = '\0' },
405cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "007",           .res =        7, .endptr_val = '\0' },
406cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "0X00ABCD",      .res =    43981, .endptr_val = '\0' },
407cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "   +AbC",       .res =     2748, .endptr_val = '\0' },
408cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "   -0xAbC",     .res =    -2748, .endptr_val = '\0' },
409cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "   -0xxx",      .res =        0, .endptr_val = 'x'  },
410cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "\n\t\r\v  -56", .res =      -86, .endptr_val = '\0' },
411cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "123xyz",        .res =      291, .endptr_val = 'x'  },
412cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = " -123defghi",   .res = -1195503, .endptr_val = 'g'  },
413221666fbecd5198908befdb3d21d6c5ea9835a57njn
414221666fbecd5198908befdb3d21d6c5ea9835a57njn         // Whitespace after the +/- is not allowed;  conversion fails.
415cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "+ 1",    .res =  0, .endptr_val = '+' },
416cf0a8b9a81ef7e826f0735341e1b50cbefa27ce0bart         { .str = "-\n0x1", .res =  0, .endptr_val = '-' },
417221666fbecd5198908befdb3d21d6c5ea9835a57njn      };
418221666fbecd5198908befdb3d21d6c5ea9835a57njn
419221666fbecd5198908befdb3d21d6c5ea9835a57njn      // Nb: We test the results against strtoll() as well.
420221666fbecd5198908befdb3d21d6c5ea9835a57njn      int i;
421221666fbecd5198908befdb3d21d6c5ea9835a57njn      for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) {
42219f91bbaedb4caef8a60ce94b0f507193cc0bc10florian         HChar* endptr1;
42319f91bbaedb4caef8a60ce94b0f507193cc0bc10florian         HChar* endptr2;
424221666fbecd5198908befdb3d21d6c5ea9835a57njn         Long      res1 = VG_(strtoll16)(a[i].str, &endptr1);
425221666fbecd5198908befdb3d21d6c5ea9835a57njn         long long res2 =     strtoll   (a[i].str, &endptr2, 16);
426221666fbecd5198908befdb3d21d6c5ea9835a57njn         //printf("  res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1);
427221666fbecd5198908befdb3d21d6c5ea9835a57njn         //printf("  res2 = %lld, *endptr2 = '%c'\n", res2, *endptr2);
4282a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn         CHECK(a[i].res == res1 && a[i].endptr_val == *endptr1);
4292a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn         CHECK(res2     == res1 && *endptr2        == *endptr1);
430221666fbecd5198908befdb3d21d6c5ea9835a57njn      }
431221666fbecd5198908befdb3d21d6c5ea9835a57njn   }
432221666fbecd5198908befdb3d21d6c5ea9835a57njn
4332a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   // VG_(strtod)()
4342a5a76b43b99c5a62c16140505a7f9fcbc0a5fb4njn   // XXX: todo
435221666fbecd5198908befdb3d21d6c5ea9835a57njn}
436221666fbecd5198908befdb3d21d6c5ea9835a57njn
437132fdb03f69d704bb4777831936e169bd2380242njnvoid test_log2(void)
438132fdb03f69d704bb4777831936e169bd2380242njn{
439132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)(0) );
440132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(  0 == VG_(log2)(1) );
441132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(  1 == VG_(log2)(2) );
442132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)(3) );
443132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(  2 == VG_(log2)(4) );
444132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)(5) );
445132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)(6) );
446132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)(7) );
447132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(  3 == VG_(log2)(8) );
448132fdb03f69d704bb4777831936e169bd2380242njn
449132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)( 15) );
450132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(  4 == VG_(log2)( 16) );
451132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)( 17) );
452132fdb03f69d704bb4777831936e169bd2380242njn
453132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)( 63) );
454132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(  6 == VG_(log2)( 64) );
455132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)( 65) );
456132fdb03f69d704bb4777831936e169bd2380242njn
457132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)(255) );
458132fdb03f69d704bb4777831936e169bd2380242njn   CHECK(  8 == VG_(log2)(256) );
459132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)(257) );
460132fdb03f69d704bb4777831936e169bd2380242njn
461132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)(65535) );
462132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 16 == VG_(log2)(65536) );
463132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)(65537) );
464132fdb03f69d704bb4777831936e169bd2380242njn
465132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)(16777215) );
466132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 24 == VG_(log2)(16777216) );
467132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)(16777217) );
468132fdb03f69d704bb4777831936e169bd2380242njn
469132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)(2147483647U) );
470132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( 31 == VG_(log2)(2147483648U) );
471132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)(2147483649U) );
472132fdb03f69d704bb4777831936e169bd2380242njn
473132fdb03f69d704bb4777831936e169bd2380242njn   CHECK( -1 == VG_(log2)(4294967295U) );    // Max UInt
474132fdb03f69d704bb4777831936e169bd2380242njn}
475132fdb03f69d704bb4777831936e169bd2380242njn
476132fdb03f69d704bb4777831936e169bd2380242njnvoid test_random(void)
477132fdb03f69d704bb4777831936e169bd2380242njn{
478132fdb03f69d704bb4777831936e169bd2380242njn   // Hmm, it's really hard to unit test a pseudo-random number generator.
479132fdb03f69d704bb4777831936e169bd2380242njn   // So no testing here, sorry.
480132fdb03f69d704bb4777831936e169bd2380242njn}
481132fdb03f69d704bb4777831936e169bd2380242njn
482132fdb03f69d704bb4777831936e169bd2380242njn//-----------------------------------------------------------------------
483132fdb03f69d704bb4777831936e169bd2380242njn// main
484132fdb03f69d704bb4777831936e169bd2380242njn//-----------------------------------------------------------------------
485132fdb03f69d704bb4777831936e169bd2380242njn
486221666fbecd5198908befdb3d21d6c5ea9835a57njnint main(void)
487221666fbecd5198908befdb3d21d6c5ea9835a57njn{
488132fdb03f69d704bb4777831936e169bd2380242njn   // Nb: the order of the tests is based on the order of the code in
489132fdb03f69d704bb4777831936e169bd2380242njn   // m_libcbase.c, except that macros defined in pub_tool_libcbase.h are
490132fdb03f69d704bb4777831936e169bd2380242njn   // tested first.
491132fdb03f69d704bb4777831936e169bd2380242njn
492221666fbecd5198908befdb3d21d6c5ea9835a57njn   //--------------------------------------------------------------------
493132fdb03f69d704bb4777831936e169bd2380242njn   // pub_tool_libcbase.h macros
494221666fbecd5198908befdb3d21d6c5ea9835a57njn   //--------------------------------------------------------------------
495132fdb03f69d704bb4777831936e169bd2380242njn   test_VG_STREQ();
496132fdb03f69d704bb4777831936e169bd2380242njn   test_VG_STREQN();
49729a100cbcd50426b422cac5c855b38384c7c37c5njn   test_VG_IS_XYZ_ALIGNED();
498132fdb03f69d704bb4777831936e169bd2380242njn   test_VG_ROUND_et_al();
499221666fbecd5198908befdb3d21d6c5ea9835a57njn
500221666fbecd5198908befdb3d21d6c5ea9835a57njn   //--------------------------------------------------------------------
501221666fbecd5198908befdb3d21d6c5ea9835a57njn   // Char functions
502221666fbecd5198908befdb3d21d6c5ea9835a57njn   //--------------------------------------------------------------------
503132fdb03f69d704bb4777831936e169bd2380242njn   test_isspace();
504132fdb03f69d704bb4777831936e169bd2380242njn   test_isdigit();
505221666fbecd5198908befdb3d21d6c5ea9835a57njn
506221666fbecd5198908befdb3d21d6c5ea9835a57njn   //--------------------------------------------------------------------
507221666fbecd5198908befdb3d21d6c5ea9835a57njn   // String-to-number functions
508221666fbecd5198908befdb3d21d6c5ea9835a57njn   //--------------------------------------------------------------------
509132fdb03f69d704bb4777831936e169bd2380242njn   test_is_dec_digit();
510132fdb03f69d704bb4777831936e169bd2380242njn   test_is_hex_digit();
511132fdb03f69d704bb4777831936e169bd2380242njn   test_strtoll_and_strtod();
512221666fbecd5198908befdb3d21d6c5ea9835a57njn
513221666fbecd5198908befdb3d21d6c5ea9835a57njn   //--------------------------------------------------------------------
514221666fbecd5198908befdb3d21d6c5ea9835a57njn   // String functions
515221666fbecd5198908befdb3d21d6c5ea9835a57njn   //--------------------------------------------------------------------
516132fdb03f69d704bb4777831936e169bd2380242njn   // XXX: more todo: VG_(str_*)
517221666fbecd5198908befdb3d21d6c5ea9835a57njn
518221666fbecd5198908befdb3d21d6c5ea9835a57njn   //--------------------------------------------------------------------
519221666fbecd5198908befdb3d21d6c5ea9835a57njn   // Mem functions
520221666fbecd5198908befdb3d21d6c5ea9835a57njn   //--------------------------------------------------------------------
521132fdb03f69d704bb4777831936e169bd2380242njn   // XXX: todo: VG_(mem*)
522221666fbecd5198908befdb3d21d6c5ea9835a57njn
523221666fbecd5198908befdb3d21d6c5ea9835a57njn   //--------------------------------------------------------------------
524221666fbecd5198908befdb3d21d6c5ea9835a57njn   // Miscellaneous functions
525221666fbecd5198908befdb3d21d6c5ea9835a57njn   //--------------------------------------------------------------------
526132fdb03f69d704bb4777831936e169bd2380242njn   // XXX: todo: VG_(ssort)
527132fdb03f69d704bb4777831936e169bd2380242njn   test_log2();
528132fdb03f69d704bb4777831936e169bd2380242njn   test_random();
529221666fbecd5198908befdb3d21d6c5ea9835a57njn
530221666fbecd5198908befdb3d21d6c5ea9835a57njn   return 0;
531221666fbecd5198908befdb3d21d6c5ea9835a57njn}
532221666fbecd5198908befdb3d21d6c5ea9835a57njn
533