1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This module does unit testing of m_libcbase.
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h>
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_basics.h"  /* UInt et al, needed for pub_tool_vki.h */
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_vki.h"
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "m_libcbase.c"
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define  CHECK(x) \
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (!x) { fprintf(stderr, "failure: %s:%d\n", __FILE__, __LINE__); }
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_VG_STREQ(void)
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQ(NULL,    NULL) );  // Nb: strcmp() considers these equal
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQ(NULL,    "ab") );  // Nb: strcmp() seg faults on this
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQ("ab",    NULL) );  // Nb: strcmp() seg faults on this
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQ("",      "a")  );
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQ("a",     "")   );
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQ("abc",   "abcd"));
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQ("abcd",  "abc") );
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQ("Abcd",  "abcd"));
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQ("abcd",  "Abcd"));
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VG_STREQ("",     "") );
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VG_STREQ("a",    "a") );
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VG_STREQ("abcd", "abcd") );
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_VG_STREQN(void)
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQN(0, NULL,    NULL) );
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQN(5, NULL,    NULL) );
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQN(0, NULL,    "ab") );
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQN(5, NULL,    "ab") );
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQN(0, "ab",    NULL) );
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQN(1, "",      "a")  );
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQN(1, "a",     "")   );
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQN(4, "abc",   "abcd"));
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQN(4, "abcd",  "abc") );
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQN(1, "Abcd",  "abcd"));
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQN(4, "Abcd",  "abcd"));
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQN(4, "abcd",  "abce"));
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_STREQN(9, "abcd",  "abce"));
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VG_STREQN(0, "",     "") );
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VG_STREQN(1, "",     "") );
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VG_STREQN(0, "a",    "a") );
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VG_STREQN(1, "a",    "a") );
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VG_STREQN(2, "a",    "a") );
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VG_STREQN(9, "a",    "a") );
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VG_STREQN(1, "ab",   "ac"));
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VG_STREQN(3, "abcd", "abce"));
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// On PPC/Linux VKI_PAGE_SIZE is a variable, not a macro.
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux)
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownunsigned long VKI_PAGE_SIZE  = 1UL << 12;
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_VG_IS_XYZ_ALIGNED(void)
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_2_ALIGNED(0x0) );
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_2_ALIGNED(0x1) );
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_2_ALIGNED(0x2) );
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_2_ALIGNED(0x3) );
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_2_ALIGNED(0x4) );
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_2_ALIGNED(0x5) );
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_2_ALIGNED(0x6) );
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_2_ALIGNED(0x7) );
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_2_ALIGNED(0x8) );
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_2_ALIGNED(0x9) );
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_2_ALIGNED(0xa) );
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_2_ALIGNED(0xb) );
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_2_ALIGNED(0xc) );
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_2_ALIGNED(0xd) );
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_2_ALIGNED(0xe) );
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_2_ALIGNED(0xf) );
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_4_ALIGNED(0x0) );
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_4_ALIGNED(0x1) );
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_4_ALIGNED(0x2) );
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_4_ALIGNED(0x3) );
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_4_ALIGNED(0x4) );
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_4_ALIGNED(0x5) );
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_4_ALIGNED(0x6) );
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_4_ALIGNED(0x7) );
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_4_ALIGNED(0x8) );
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_4_ALIGNED(0x9) );
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_4_ALIGNED(0xa) );
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_4_ALIGNED(0xb) );
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_4_ALIGNED(0xc) );
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_4_ALIGNED(0xd) );
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_4_ALIGNED(0xe) );
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_4_ALIGNED(0xf) );
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_8_ALIGNED(0x0) );
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_8_ALIGNED(0x1) );
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_8_ALIGNED(0x2) );
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_8_ALIGNED(0x3) );
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_8_ALIGNED(0x4) );
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_8_ALIGNED(0x5) );
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_8_ALIGNED(0x6) );
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_8_ALIGNED(0x7) );
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_8_ALIGNED(0x8) );
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_8_ALIGNED(0x9) );
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_8_ALIGNED(0xa) );
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_8_ALIGNED(0xb) );
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_8_ALIGNED(0xc) );
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_8_ALIGNED(0xd) );
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_8_ALIGNED(0xe) );
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_8_ALIGNED(0xf) );
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_16_ALIGNED(0x0) );
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0x1) );
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0x2) );
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0x3) );
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0x4) );
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0x5) );
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0x6) );
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0x7) );
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0x8) );
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0x9) );
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0xa) );
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0xb) );
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0xc) );
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0xd) );
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0xe) );
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_16_ALIGNED(0xf) );
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_WORD_ALIGNED(0x0) );
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_WORD_ALIGNED(0x1) );
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_WORD_ALIGNED(0x2) );
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_WORD_ALIGNED(0x3) );
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // 0x4 case below
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_WORD_ALIGNED(0x5) );
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_WORD_ALIGNED(0x6) );
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_WORD_ALIGNED(0x7) );
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_WORD_ALIGNED(0x8) );
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_WORD_ALIGNED(0x9) );
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_WORD_ALIGNED(0xa) );
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_WORD_ALIGNED(0xb) );
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // 0xc case below
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_WORD_ALIGNED(0xd) );
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_WORD_ALIGNED(0xe) );
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_WORD_ALIGNED(0xf) );
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if        (4 == sizeof(void*)) {
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CHECK(   VG_IS_WORD_ALIGNED(0x4) );
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CHECK(   VG_IS_WORD_ALIGNED(0xc) );
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else if (8 == sizeof(void*)) {
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CHECK( ! VG_IS_WORD_ALIGNED(0x4) );
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CHECK( ! VG_IS_WORD_ALIGNED(0xc) );
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } else {
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assert(0);
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_PAGE_ALIGNED(0x0) );
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_PAGE_ALIGNED(0x1) );
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_PAGE_ALIGNED(0x2) );
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_PAGE_ALIGNED(0x3) );
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_PAGE_ALIGNED(0x4) );
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE-1) );
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE  ) );
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_IS_PAGE_ALIGNED(VKI_PAGE_SIZE+1) );
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_VG_ROUND_et_al()
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(0, 1) );
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 1 == VG_ROUNDDN(1, 1) );
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 2 == VG_ROUNDDN(2, 1) );
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 3 == VG_ROUNDDN(3, 1) );
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 4 == VG_ROUNDDN(4, 1) );
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 5 == VG_ROUNDDN(5, 1) );
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 6 == VG_ROUNDDN(6, 1) );
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 7 == VG_ROUNDDN(7, 1) );
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDUP(0, 1) );
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 1 == VG_ROUNDUP(1, 1) );
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 2 == VG_ROUNDUP(2, 1) );
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 3 == VG_ROUNDUP(3, 1) );
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 4 == VG_ROUNDUP(4, 1) );
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 5 == VG_ROUNDUP(5, 1) );
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 6 == VG_ROUNDUP(6, 1) );
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 7 == VG_ROUNDUP(7, 1) );
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(0, 2) );
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(1, 2) );
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 2 == VG_ROUNDDN(2, 2) );
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 2 == VG_ROUNDDN(3, 2) );
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 4 == VG_ROUNDDN(4, 2) );
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 4 == VG_ROUNDDN(5, 2) );
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 6 == VG_ROUNDDN(6, 2) );
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 6 == VG_ROUNDDN(7, 2) );
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDUP(0, 2) );
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 2 == VG_ROUNDUP(1, 2) );
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 2 == VG_ROUNDUP(2, 2) );
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 4 == VG_ROUNDUP(3, 2) );
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 4 == VG_ROUNDUP(4, 2) );
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 6 == VG_ROUNDUP(5, 2) );
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 6 == VG_ROUNDUP(6, 2) );
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 8 == VG_ROUNDUP(7, 2) );
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(0, 4) );
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(1, 4) );
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(2, 4) );
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(3, 4) );
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 4 == VG_ROUNDDN(4, 4) );
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 4 == VG_ROUNDDN(5, 4) );
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 4 == VG_ROUNDDN(6, 4) );
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 4 == VG_ROUNDDN(7, 4) );
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDUP(0, 4) );
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 4 == VG_ROUNDUP(1, 4) );
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 4 == VG_ROUNDUP(2, 4) );
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 4 == VG_ROUNDUP(3, 4) );
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 4 == VG_ROUNDUP(4, 4) );
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 8 == VG_ROUNDUP(5, 4) );
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 8 == VG_ROUNDUP(6, 4) );
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 8 == VG_ROUNDUP(7, 4) );
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(0, 8) );
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(1, 8) );
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(2, 8) );
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(3, 8) );
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(4, 8) );
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(5, 8) );
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(6, 8) );
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDDN(7, 8) );
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0 == VG_ROUNDUP(0, 8) );
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 8 == VG_ROUNDUP(1, 8) );
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 8 == VG_ROUNDUP(2, 8) );
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 8 == VG_ROUNDUP(3, 8) );
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 8 == VG_ROUNDUP(4, 8) );
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 8 == VG_ROUNDUP(5, 8) );
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 8 == VG_ROUNDUP(6, 8) );
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 8 == VG_ROUNDUP(7, 8) );
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0             == VG_PGROUNDDN(0) );
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0             == VG_PGROUNDDN(1) );
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0             == VG_PGROUNDDN(2) );
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0             == VG_PGROUNDDN(3) );
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0             == VG_PGROUNDDN(4) );
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0             == VG_PGROUNDDN(VKI_PAGE_SIZE-1) );
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VKI_PAGE_SIZE == VG_PGROUNDDN(VKI_PAGE_SIZE  ) );
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VKI_PAGE_SIZE == VG_PGROUNDDN(VKI_PAGE_SIZE+1) );
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 0               == VG_PGROUNDUP(0) );
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(1) );
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(2) );
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(3) );
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(4) );
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(VKI_PAGE_SIZE-1) );
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VKI_PAGE_SIZE   == VG_PGROUNDUP(VKI_PAGE_SIZE  ) );
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( VKI_PAGE_SIZE*2 == VG_PGROUNDUP(VKI_PAGE_SIZE+1) );
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_isspace(void)
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_(isspace)(' ') );
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_(isspace)('\n') );
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_(isspace)('\t') );
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_(isspace)('3') );
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_(isspace)('x') );
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_isdigit(void)
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_(isdigit)('0') );
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_(isdigit)('1') );
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_(isdigit)('5') );
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(   VG_(isdigit)('9') );
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_(isdigit)('a') );
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( ! VG_(isdigit)('!') );
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_is_dec_digit()
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Long x;
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( is_dec_digit('0', &x) && 0 == x );
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( is_dec_digit('1', &x) && 1 == x );
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( is_dec_digit('9', &x) && 9 == x );
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_is_hex_digit()
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Long x;
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( is_hex_digit('0', &x) &&  0 == x );
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( is_hex_digit('1', &x) &&  1 == x );
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( is_hex_digit('9', &x) &&  9 == x );
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( is_hex_digit('a', &x) && 10 == x );
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( is_hex_digit('f', &x) && 15 == x );
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( is_hex_digit('A', &x) && 10 == x );
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( is_hex_digit('F', &x) && 15 == x );
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_strtoll_and_strtod(void)
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // For VG_(strtoll*)()
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   typedef struct {
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Char* str;        // The string to convert.
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Long  res;        // The result.
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Char  endptr_val; // The char one past the end of the converted text.
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } StrtollInputs;
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // VG_(strtoll10)()
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      StrtollInputs a[] = {
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // If there's no number at the head of the string, return 0, and
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // make 'endptr' point to the start of the string.
315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "",      .res = 0, .endptr_val = '\0' },
316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = " \n\t", .res = 0, .endptr_val = ' '  },
317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "one",   .res = 0, .endptr_val = 'o'  },
318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "\ntwo", .res = 0, .endptr_val = '\n' },
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Successful conversion.  Leading whitespace is ignored.  A single
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // '-' or '+' is accepted.
322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str =  "0",            .res =       0, .endptr_val = '\0' },
323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "+0",            .res =       0, .endptr_val = '\0' },
324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "-0",            .res =       0, .endptr_val = '\0' },
325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str =  "1",            .res =       1, .endptr_val = '\0' },
326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "+1",            .res =       1, .endptr_val = '\0' },
327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "-1",            .res =      -1, .endptr_val = '\0' },
328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "12",            .res =      12, .endptr_val = '\0' },
329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "-567",          .res =    -567, .endptr_val = '\0' },
330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "1234567",       .res = 1234567, .endptr_val = '\0' },
331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "007",           .res =       7, .endptr_val = '\0' },
332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "   +42",        .res =      42, .endptr_val = '\0' },
333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "\n\t\r\v  -56", .res =     -56, .endptr_val = '\0' },
334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "123xyz",        .res =     123, .endptr_val = 'x'  },
335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = " -123abc",      .res =    -123, .endptr_val = 'a'  },
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Whitespace after the +/- is not allowed;  conversion fails.
338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "+ 1",   .res =  0, .endptr_val = '+' },
339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "-\n1",  .res =  0, .endptr_val = '-' },
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      };
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Nb: We test the results against strtoll() as well.
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int i;
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) {
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Char* endptr1;
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         char* endptr2;
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Long      res1 = VG_(strtoll10)(a[i].str, &endptr1);
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         long long res2 =     strtoll   (a[i].str, &endptr2, 10);
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         //printf("res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1);
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         //printf("res2 = %lld, *endptr2 = '%c'\n", res2, *endptr2);
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         CHECK(a[i].res == res1 && a[i].endptr_val == *endptr1);
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         CHECK(res2     == res1 && *endptr2        == *endptr1);
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // VG_(strtoll16)()
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      StrtollInputs a[] = {
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // If there's no number at the head of the string, return 0, and
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // make 'endptr' point to the start of the string.
361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "",      .res = 0, .endptr_val = '\0' },
362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = " \n\t", .res = 0, .endptr_val = ' '  },
363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "one",   .res = 0, .endptr_val = 'o'  },
364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "\ntwo", .res = 0, .endptr_val = '\n' },
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Successful conversion.  Leading whitespace is ignored.  A single
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // '-' or '+' is accepted.  "0X" and "0x" are also allowed at the
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // front, but if no digits follow, just the "0" is converted.
369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str =   "0",           .res =        0, .endptr_val = '\0' },
370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "0x0",           .res =        0, .endptr_val = '\0' },
371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "0X0",           .res =        0, .endptr_val = '\0' },
372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "0x",            .res =        0, .endptr_val = 'x'  },
373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "0Xg",           .res =        0, .endptr_val = 'X'  },
374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str =   "0",           .res =        0, .endptr_val = '\0' },
375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str =  "+0",           .res =        0, .endptr_val = '\0' },
376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str =  "-0",           .res =        0, .endptr_val = '\0' },
377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str =   "1",           .res =        1, .endptr_val = '\0' },
378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str =  "+1",           .res =        1, .endptr_val = '\0' },
379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str =  "-1",           .res =       -1, .endptr_val = '\0' },
380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str =  "1a",           .res =       26, .endptr_val = '\0' },
381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "-5F7",          .res =    -1527, .endptr_val = '\0' },
382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "0x1234567",     .res = 19088743, .endptr_val = '\0' },
383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "007",           .res =        7, .endptr_val = '\0' },
384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "0X00ABCD",      .res =    43981, .endptr_val = '\0' },
385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "   +AbC",       .res =     2748, .endptr_val = '\0' },
386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "   -0xAbC",     .res =    -2748, .endptr_val = '\0' },
387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "   -0xxx",      .res =        0, .endptr_val = 'x'  },
388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "\n\t\r\v  -56", .res =      -86, .endptr_val = '\0' },
389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "123xyz",        .res =      291, .endptr_val = 'x'  },
390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = " -123defghi",   .res = -1195503, .endptr_val = 'g'  },
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // Whitespace after the +/- is not allowed;  conversion fails.
393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "+ 1",    .res =  0, .endptr_val = '+' },
394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         { .str = "-\n0x1", .res =  0, .endptr_val = '-' },
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      };
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Nb: We test the results against strtoll() as well.
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      int i;
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) {
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Char* endptr1;
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         char* endptr2;
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Long      res1 = VG_(strtoll16)(a[i].str, &endptr1);
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         long long res2 =     strtoll   (a[i].str, &endptr2, 16);
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         //printf("  res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1);
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         //printf("  res2 = %lld, *endptr2 = '%c'\n", res2, *endptr2);
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         CHECK(a[i].res == res1 && a[i].endptr_val == *endptr1);
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         CHECK(res2     == res1 && *endptr2        == *endptr1);
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // VG_(strtod)()
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // XXX: todo
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_log2(void)
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)(0) );
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(  0 == VG_(log2)(1) );
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(  1 == VG_(log2)(2) );
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)(3) );
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(  2 == VG_(log2)(4) );
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)(5) );
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)(6) );
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)(7) );
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(  3 == VG_(log2)(8) );
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)( 15) );
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(  4 == VG_(log2)( 16) );
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)( 17) );
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)( 63) );
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(  6 == VG_(log2)( 64) );
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)( 65) );
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)(255) );
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK(  8 == VG_(log2)(256) );
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)(257) );
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)(65535) );
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 16 == VG_(log2)(65536) );
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)(65537) );
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)(16777215) );
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 24 == VG_(log2)(16777216) );
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)(16777217) );
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)(2147483647U) );
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( 31 == VG_(log2)(2147483648U) );
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)(2147483649U) );
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CHECK( -1 == VG_(log2)(4294967295U) );    // Max UInt
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid test_random(void)
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Hmm, it's really hard to unit test a pseudo-random number generator.
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // So no testing here, sorry.
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//-----------------------------------------------------------------------
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// main
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//-----------------------------------------------------------------------
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(void)
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Nb: the order of the tests is based on the order of the code in
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // m_libcbase.c, except that macros defined in pub_tool_libcbase.h are
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // tested first.
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //--------------------------------------------------------------------
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // pub_tool_libcbase.h macros
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //--------------------------------------------------------------------
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_VG_STREQ();
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_VG_STREQN();
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_VG_IS_XYZ_ALIGNED();
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_VG_ROUND_et_al();
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //--------------------------------------------------------------------
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Char functions
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //--------------------------------------------------------------------
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_isspace();
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_isdigit();
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //--------------------------------------------------------------------
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // String-to-number functions
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //--------------------------------------------------------------------
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_is_dec_digit();
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_is_hex_digit();
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_strtoll_and_strtod();
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //--------------------------------------------------------------------
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // String functions
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //--------------------------------------------------------------------
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // XXX: more todo: VG_(str_*)
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //--------------------------------------------------------------------
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Mem functions
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //--------------------------------------------------------------------
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // XXX: todo: VG_(mem*)
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //--------------------------------------------------------------------
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // Miscellaneous functions
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //--------------------------------------------------------------------
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // XXX: todo: VG_(ssort)
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_log2();
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   test_random();
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
511