1d52f0aecSMichael Jones //===-- Unittests for strtoul ---------------------------------------------===//
2d52f0aecSMichael Jones //
3d52f0aecSMichael Jones // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d52f0aecSMichael Jones // See https://llvm.org/LICENSE.txt for license information.
5d52f0aecSMichael Jones // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d52f0aecSMichael Jones //
7d52f0aecSMichael Jones //===----------------------------------------------------------------------===//
8d52f0aecSMichael Jones
9d52f0aecSMichael Jones #include "src/stdlib/strtoul.h"
10d52f0aecSMichael Jones
11d52f0aecSMichael Jones #include <errno.h>
12d52f0aecSMichael Jones #include <limits.h>
131d02a8bcSMichael Jones #include <stddef.h>
14d52f0aecSMichael Jones
154e1a164dSRoland McGrath #include "utils/UnitTest/Test.h"
164e1a164dSRoland McGrath
TEST(LlvmLibcStrToULTest,InvalidBase)17d52f0aecSMichael Jones TEST(LlvmLibcStrToULTest, InvalidBase) {
18d52f0aecSMichael Jones const char *ten = "10";
19d52f0aecSMichael Jones errno = 0;
20d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(ten, nullptr, -1), 0ul);
21d52f0aecSMichael Jones ASSERT_EQ(errno, EINVAL);
22d52f0aecSMichael Jones }
23d52f0aecSMichael Jones
TEST(LlvmLibcStrToULTest,CleanBaseTenDecode)24d52f0aecSMichael Jones TEST(LlvmLibcStrToULTest, CleanBaseTenDecode) {
25d52f0aecSMichael Jones char *str_end = nullptr;
26d52f0aecSMichael Jones
27d52f0aecSMichael Jones const char *ten = "10";
28d52f0aecSMichael Jones errno = 0;
29d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(ten, &str_end, 10), 10ul);
30d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
311d02a8bcSMichael Jones EXPECT_EQ(str_end - ten, ptrdiff_t(2));
32d52f0aecSMichael Jones errno = 0;
33d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(ten, nullptr, 10), 10ul);
34d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
35d52f0aecSMichael Jones
36d52f0aecSMichael Jones const char *hundred = "100";
37d52f0aecSMichael Jones errno = 0;
38d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(hundred, &str_end, 10), 100ul);
39d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
401d02a8bcSMichael Jones EXPECT_EQ(str_end - hundred, ptrdiff_t(3));
41d52f0aecSMichael Jones
42d52f0aecSMichael Jones const char *negative = "-100";
43d52f0aecSMichael Jones errno = 0;
44d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(negative, &str_end, 10), -(100ul));
45d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
461d02a8bcSMichael Jones EXPECT_EQ(str_end - negative, ptrdiff_t(4));
47d52f0aecSMichael Jones
48fdee2d76SMichael Jones const char *big_number = "1234567890";
49d52f0aecSMichael Jones errno = 0;
50fdee2d76SMichael Jones ASSERT_EQ(__llvm_libc::strtoul(big_number, &str_end, 10), 1234567890ul);
51d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
52fdee2d76SMichael Jones EXPECT_EQ(str_end - big_number, ptrdiff_t(10));
53d52f0aecSMichael Jones
54d52f0aecSMichael Jones const char *too_big_number = "123456789012345678901";
55d52f0aecSMichael Jones errno = 0;
56d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(too_big_number, &str_end, 10), ULONG_MAX);
57d52f0aecSMichael Jones ASSERT_EQ(errno, ERANGE);
581d02a8bcSMichael Jones EXPECT_EQ(str_end - too_big_number, ptrdiff_t(21));
59d52f0aecSMichael Jones
60d52f0aecSMichael Jones const char *too_big_negative_number = "-123456789012345678901";
61d52f0aecSMichael Jones errno = 0;
62d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(too_big_negative_number, &str_end, 10),
63d52f0aecSMichael Jones ULONG_MAX);
64d52f0aecSMichael Jones ASSERT_EQ(errno, ERANGE);
651d02a8bcSMichael Jones EXPECT_EQ(str_end - too_big_negative_number, ptrdiff_t(22));
66d52f0aecSMichael Jones
67d52f0aecSMichael Jones const char *long_number_range_test =
68d52f0aecSMichael Jones "10000000000000000000000000000000000000000000000000";
69d52f0aecSMichael Jones errno = 0;
70d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(long_number_range_test, &str_end, 10),
71d52f0aecSMichael Jones ULONG_MAX);
72d52f0aecSMichael Jones ASSERT_EQ(errno, ERANGE);
731d02a8bcSMichael Jones EXPECT_EQ(str_end - long_number_range_test, ptrdiff_t(50));
74d52f0aecSMichael Jones }
75d52f0aecSMichael Jones
TEST(LlvmLibcStrToULTest,MessyBaseTenDecode)76d52f0aecSMichael Jones TEST(LlvmLibcStrToULTest, MessyBaseTenDecode) {
77d52f0aecSMichael Jones char *str_end = nullptr;
78d52f0aecSMichael Jones
79d52f0aecSMichael Jones const char *spaces_before = " 10";
80d52f0aecSMichael Jones errno = 0;
81d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(spaces_before, &str_end, 10), 10ul);
82d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
831d02a8bcSMichael Jones EXPECT_EQ(str_end - spaces_before, ptrdiff_t(7));
84d52f0aecSMichael Jones
85d52f0aecSMichael Jones const char *spaces_after = "10 ";
86d52f0aecSMichael Jones errno = 0;
87d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(spaces_after, &str_end, 10), 10ul);
88d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
891d02a8bcSMichael Jones EXPECT_EQ(str_end - spaces_after, ptrdiff_t(2));
90d52f0aecSMichael Jones
91d52f0aecSMichael Jones const char *word_before = "word10";
92d52f0aecSMichael Jones errno = 0;
93d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(word_before, &str_end, 10), 0ul);
94d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
951d02a8bcSMichael Jones EXPECT_EQ(str_end - word_before, ptrdiff_t(0));
96d52f0aecSMichael Jones
97d52f0aecSMichael Jones const char *word_after = "10word";
98d52f0aecSMichael Jones errno = 0;
99d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(word_after, &str_end, 10), 10ul);
100d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
1011d02a8bcSMichael Jones EXPECT_EQ(str_end - word_after, ptrdiff_t(2));
102d52f0aecSMichael Jones
103d52f0aecSMichael Jones const char *two_numbers = "10 999";
104d52f0aecSMichael Jones errno = 0;
105d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(two_numbers, &str_end, 10), 10ul);
106d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
1071d02a8bcSMichael Jones EXPECT_EQ(str_end - two_numbers, ptrdiff_t(2));
108d52f0aecSMichael Jones
109d52f0aecSMichael Jones const char *two_signs = "--10 999";
110d52f0aecSMichael Jones errno = 0;
111d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(two_signs, &str_end, 10), 0ul);
112d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
113*53804d4eSMichael Jones EXPECT_EQ(str_end - two_signs, ptrdiff_t(0));
114d52f0aecSMichael Jones
115d52f0aecSMichael Jones const char *sign_before = "+2=4";
116d52f0aecSMichael Jones errno = 0;
117d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(sign_before, &str_end, 10), 2ul);
118d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
1191d02a8bcSMichael Jones EXPECT_EQ(str_end - sign_before, ptrdiff_t(2));
120d52f0aecSMichael Jones
121d52f0aecSMichael Jones const char *sign_after = "2+2=4";
122d52f0aecSMichael Jones errno = 0;
123d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(sign_after, &str_end, 10), 2ul);
124d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
1251d02a8bcSMichael Jones EXPECT_EQ(str_end - sign_after, ptrdiff_t(1));
126d52f0aecSMichael Jones
127d52f0aecSMichael Jones const char *tab_before = "\t10";
128d52f0aecSMichael Jones errno = 0;
129d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(tab_before, &str_end, 10), 10ul);
130d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
1311d02a8bcSMichael Jones EXPECT_EQ(str_end - tab_before, ptrdiff_t(3));
132d52f0aecSMichael Jones
133d52f0aecSMichael Jones const char *all_together = "\t -12345and+67890";
134d52f0aecSMichael Jones errno = 0;
135d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(all_together, &str_end, 10), -(12345ul));
136d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
1371d02a8bcSMichael Jones EXPECT_EQ(str_end - all_together, ptrdiff_t(9));
138*53804d4eSMichael Jones
139*53804d4eSMichael Jones const char *just_spaces = " ";
140*53804d4eSMichael Jones errno = 0;
141*53804d4eSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(just_spaces, &str_end, 10), 0ul);
142*53804d4eSMichael Jones ASSERT_EQ(errno, 0);
143*53804d4eSMichael Jones EXPECT_EQ(str_end - just_spaces, ptrdiff_t(0));
144*53804d4eSMichael Jones
145*53804d4eSMichael Jones const char *just_space_and_sign = " +";
146*53804d4eSMichael Jones errno = 0;
147*53804d4eSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(just_space_and_sign, &str_end, 10), 0ul);
148*53804d4eSMichael Jones ASSERT_EQ(errno, 0);
149*53804d4eSMichael Jones EXPECT_EQ(str_end - just_space_and_sign, ptrdiff_t(0));
150d52f0aecSMichael Jones }
151d52f0aecSMichael Jones
int_to_b36_char(int input)152d52f0aecSMichael Jones static char int_to_b36_char(int input) {
153d52f0aecSMichael Jones if (input < 0 || input > 36)
154d52f0aecSMichael Jones return '0';
155d52f0aecSMichael Jones if (input < 10)
1564e1a164dSRoland McGrath return static_cast<char>('0' + input);
1574e1a164dSRoland McGrath return static_cast<char>('A' + input - 10);
158d52f0aecSMichael Jones }
159d52f0aecSMichael Jones
TEST(LlvmLibcStrToULTest,DecodeInOtherBases)160d52f0aecSMichael Jones TEST(LlvmLibcStrToULTest, DecodeInOtherBases) {
161d52f0aecSMichael Jones char small_string[4] = {'\0', '\0', '\0', '\0'};
1624e1a164dSRoland McGrath for (int base = 2; base <= 36; ++base) {
1634e1a164dSRoland McGrath for (int first_digit = 0; first_digit <= 36; ++first_digit) {
164d52f0aecSMichael Jones small_string[0] = int_to_b36_char(first_digit);
165d52f0aecSMichael Jones if (first_digit < base) {
166d52f0aecSMichael Jones errno = 0;
167d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
1684e1a164dSRoland McGrath static_cast<unsigned long int>(first_digit));
169d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
170d52f0aecSMichael Jones } else {
171d52f0aecSMichael Jones errno = 0;
172d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base), 0ul);
173d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
174d52f0aecSMichael Jones }
175d52f0aecSMichael Jones }
176d52f0aecSMichael Jones }
177d52f0aecSMichael Jones
1784e1a164dSRoland McGrath for (int base = 2; base <= 36; ++base) {
1794e1a164dSRoland McGrath for (int first_digit = 0; first_digit <= 36; ++first_digit) {
180d52f0aecSMichael Jones small_string[0] = int_to_b36_char(first_digit);
1814e1a164dSRoland McGrath for (int second_digit = 0; second_digit <= 36; ++second_digit) {
182d52f0aecSMichael Jones small_string[1] = int_to_b36_char(second_digit);
183d52f0aecSMichael Jones if (first_digit < base && second_digit < base) {
184d52f0aecSMichael Jones errno = 0;
185d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
1864e1a164dSRoland McGrath static_cast<unsigned long int>(second_digit +
1874e1a164dSRoland McGrath (first_digit * base)));
188d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
189d52f0aecSMichael Jones } else if (first_digit < base) {
190d52f0aecSMichael Jones errno = 0;
191d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
1924e1a164dSRoland McGrath static_cast<unsigned long int>(first_digit));
193d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
194d52f0aecSMichael Jones } else {
195d52f0aecSMichael Jones errno = 0;
196d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base), 0ul);
197d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
198d52f0aecSMichael Jones }
199d52f0aecSMichael Jones }
200d52f0aecSMichael Jones }
201d52f0aecSMichael Jones }
202d52f0aecSMichael Jones
2034e1a164dSRoland McGrath for (int base = 2; base <= 36; ++base) {
2044e1a164dSRoland McGrath for (int first_digit = 0; first_digit <= 36; ++first_digit) {
205d52f0aecSMichael Jones small_string[0] = int_to_b36_char(first_digit);
2064e1a164dSRoland McGrath for (int second_digit = 0; second_digit <= 36; ++second_digit) {
207d52f0aecSMichael Jones small_string[1] = int_to_b36_char(second_digit);
2084e1a164dSRoland McGrath for (int third_digit = 0; third_digit <= 36; ++third_digit) {
209d52f0aecSMichael Jones small_string[2] = int_to_b36_char(third_digit);
210d52f0aecSMichael Jones
211d52f0aecSMichael Jones if (first_digit < base && second_digit < base && third_digit < base) {
212d52f0aecSMichael Jones errno = 0;
213d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
2144e1a164dSRoland McGrath static_cast<unsigned long int>(
215d52f0aecSMichael Jones third_digit + (second_digit * base) +
2164e1a164dSRoland McGrath (first_digit * base * base)));
217d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
218d52f0aecSMichael Jones } else if (first_digit < base && second_digit < base) {
219d52f0aecSMichael Jones errno = 0;
220d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
2214e1a164dSRoland McGrath static_cast<unsigned long int>(second_digit +
2224e1a164dSRoland McGrath (first_digit * base)));
223d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
224d52f0aecSMichael Jones } else if (first_digit < base) {
225d52f0aecSMichael Jones // if the base is 16 there is a special case for the prefix 0X.
226d52f0aecSMichael Jones // The number is treated as a one digit hexadecimal.
227d52f0aecSMichael Jones if (base == 16 && first_digit == 0 && second_digit == 33) {
228d52f0aecSMichael Jones if (third_digit < base) {
229d52f0aecSMichael Jones errno = 0;
230d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
2314e1a164dSRoland McGrath static_cast<unsigned long int>(third_digit));
232d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
233d52f0aecSMichael Jones } else {
234d52f0aecSMichael Jones errno = 0;
235d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
236d52f0aecSMichael Jones 0ul);
237d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
238d52f0aecSMichael Jones }
239d52f0aecSMichael Jones } else {
240d52f0aecSMichael Jones errno = 0;
241d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base),
242225eb8a2SRoland McGrath static_cast<unsigned long int>(first_digit));
243d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
244d52f0aecSMichael Jones }
245d52f0aecSMichael Jones } else {
246d52f0aecSMichael Jones errno = 0;
247d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(small_string, nullptr, base), 0ul);
248d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
249d52f0aecSMichael Jones }
250d52f0aecSMichael Jones }
251d52f0aecSMichael Jones }
252d52f0aecSMichael Jones }
253d52f0aecSMichael Jones }
254d52f0aecSMichael Jones }
255d52f0aecSMichael Jones
TEST(LlvmLibcStrToULTest,CleanBaseSixteenDecode)256d52f0aecSMichael Jones TEST(LlvmLibcStrToULTest, CleanBaseSixteenDecode) {
257d52f0aecSMichael Jones char *str_end = nullptr;
258d52f0aecSMichael Jones
259d52f0aecSMichael Jones const char *no_prefix = "123abc";
260d52f0aecSMichael Jones errno = 0;
261d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(no_prefix, &str_end, 16), 0x123abcul);
262d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
2631d02a8bcSMichael Jones EXPECT_EQ(str_end - no_prefix, ptrdiff_t(6));
264d52f0aecSMichael Jones
265d52f0aecSMichael Jones const char *yes_prefix = "0x456def";
266d52f0aecSMichael Jones errno = 0;
267d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(yes_prefix, &str_end, 16), 0x456deful);
268d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
2691d02a8bcSMichael Jones EXPECT_EQ(str_end - yes_prefix, ptrdiff_t(8));
27037ce7349SMichael Jones
27137ce7349SMichael Jones const char *letter_after_prefix = "0xabc123";
27237ce7349SMichael Jones errno = 0;
27337ce7349SMichael Jones ASSERT_EQ(__llvm_libc::strtoul(letter_after_prefix, &str_end, 16),
27437ce7349SMichael Jones 0xabc123ul);
27537ce7349SMichael Jones ASSERT_EQ(errno, 0);
27637ce7349SMichael Jones EXPECT_EQ(str_end - letter_after_prefix, ptrdiff_t(8));
27737ce7349SMichael Jones }
27837ce7349SMichael Jones
TEST(LlvmLibcStrToULTest,MessyBaseSixteenDecode)27937ce7349SMichael Jones TEST(LlvmLibcStrToULTest, MessyBaseSixteenDecode) {
28037ce7349SMichael Jones char *str_end = nullptr;
28137ce7349SMichael Jones
28237ce7349SMichael Jones const char *just_prefix = "0x";
28337ce7349SMichael Jones errno = 0;
28437ce7349SMichael Jones ASSERT_EQ(__llvm_libc::strtoul(just_prefix, &str_end, 16), 0ul);
28537ce7349SMichael Jones ASSERT_EQ(errno, 0);
28637ce7349SMichael Jones EXPECT_EQ(str_end - just_prefix, ptrdiff_t(1));
28737ce7349SMichael Jones
28837ce7349SMichael Jones errno = 0;
28937ce7349SMichael Jones ASSERT_EQ(__llvm_libc::strtoul(just_prefix, &str_end, 0), 0ul);
29037ce7349SMichael Jones ASSERT_EQ(errno, 0);
29137ce7349SMichael Jones EXPECT_EQ(str_end - just_prefix, ptrdiff_t(1));
29237ce7349SMichael Jones
29337ce7349SMichael Jones const char *prefix_with_x_after = "0xx";
29437ce7349SMichael Jones errno = 0;
29537ce7349SMichael Jones ASSERT_EQ(__llvm_libc::strtoul(prefix_with_x_after, &str_end, 16), 0ul);
29637ce7349SMichael Jones ASSERT_EQ(errno, 0);
29737ce7349SMichael Jones EXPECT_EQ(str_end - prefix_with_x_after, ptrdiff_t(1));
29837ce7349SMichael Jones
29937ce7349SMichael Jones errno = 0;
30037ce7349SMichael Jones ASSERT_EQ(__llvm_libc::strtoul(prefix_with_x_after, &str_end, 0), 0ul);
30137ce7349SMichael Jones ASSERT_EQ(errno, 0);
30237ce7349SMichael Jones EXPECT_EQ(str_end - prefix_with_x_after, ptrdiff_t(1));
303d52f0aecSMichael Jones }
304d52f0aecSMichael Jones
TEST(LlvmLibcStrToULTest,AutomaticBaseSelection)305d52f0aecSMichael Jones TEST(LlvmLibcStrToULTest, AutomaticBaseSelection) {
306d52f0aecSMichael Jones char *str_end = nullptr;
307d52f0aecSMichael Jones
308d52f0aecSMichael Jones const char *base_ten = "12345";
309d52f0aecSMichael Jones errno = 0;
310d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(base_ten, &str_end, 0), 12345ul);
311d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
3121d02a8bcSMichael Jones EXPECT_EQ(str_end - base_ten, ptrdiff_t(5));
313d52f0aecSMichael Jones
314d52f0aecSMichael Jones const char *base_sixteen_no_prefix = "123abc";
315d52f0aecSMichael Jones errno = 0;
316d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(base_sixteen_no_prefix, &str_end, 0), 123ul);
317d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
3181d02a8bcSMichael Jones EXPECT_EQ(str_end - base_sixteen_no_prefix, ptrdiff_t(3));
319d52f0aecSMichael Jones
320d52f0aecSMichael Jones const char *base_sixteen_with_prefix = "0x456def";
321d52f0aecSMichael Jones errno = 0;
322d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(base_sixteen_with_prefix, &str_end, 0),
323d52f0aecSMichael Jones 0x456deful);
324d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
3251d02a8bcSMichael Jones EXPECT_EQ(str_end - base_sixteen_with_prefix, ptrdiff_t(8));
326d52f0aecSMichael Jones
327d52f0aecSMichael Jones const char *base_eight_with_prefix = "012345";
328d52f0aecSMichael Jones errno = 0;
329d52f0aecSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(base_eight_with_prefix, &str_end, 0),
330d52f0aecSMichael Jones 012345ul);
331d52f0aecSMichael Jones ASSERT_EQ(errno, 0);
3321d02a8bcSMichael Jones EXPECT_EQ(str_end - base_eight_with_prefix, ptrdiff_t(6));
333*53804d4eSMichael Jones
334*53804d4eSMichael Jones const char *just_zero = "0";
335*53804d4eSMichael Jones errno = 0;
336*53804d4eSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(just_zero, &str_end, 0), 0ul);
337*53804d4eSMichael Jones ASSERT_EQ(errno, 0);
338*53804d4eSMichael Jones EXPECT_EQ(str_end - just_zero, ptrdiff_t(1));
339*53804d4eSMichael Jones
340*53804d4eSMichael Jones const char *just_zero_x = "0x";
341*53804d4eSMichael Jones errno = 0;
342*53804d4eSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(just_zero_x, &str_end, 0), 0ul);
343*53804d4eSMichael Jones ASSERT_EQ(errno, 0);
344*53804d4eSMichael Jones EXPECT_EQ(str_end - just_zero_x, ptrdiff_t(1));
345*53804d4eSMichael Jones
346*53804d4eSMichael Jones const char *just_zero_eight = "08";
347*53804d4eSMichael Jones errno = 0;
348*53804d4eSMichael Jones ASSERT_EQ(__llvm_libc::strtoul(just_zero_eight, &str_end, 0), 0ul);
349*53804d4eSMichael Jones ASSERT_EQ(errno, 0);
350*53804d4eSMichael Jones EXPECT_EQ(str_end - just_zero_eight, ptrdiff_t(1));
351d52f0aecSMichael Jones }
352