1 // Copyright 2017 The Abseil Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 // This file contains string processing functions related to
16 // numeric values.
17
18 #include "absl/strings/numbers.h"
19
20 #include <algorithm>
21 #include <cassert>
22 #include <cfloat> // for DBL_DIG and FLT_DIG
23 #include <cmath> // for HUGE_VAL
24 #include <cstdint>
25 #include <cstdio>
26 #include <cstdlib>
27 #include <cstring>
28 #include <iterator>
29 #include <limits>
30 #include <memory>
31 #include <utility>
32
33 #include "absl/base/attributes.h"
34 #include "absl/base/internal/raw_logging.h"
35 #include "absl/numeric/bits.h"
36 #include "absl/strings/ascii.h"
37 #include "absl/strings/charconv.h"
38 #include "absl/strings/escaping.h"
39 #include "absl/strings/internal/memutil.h"
40 #include "absl/strings/match.h"
41 #include "absl/strings/str_cat.h"
42
43 namespace absl {
44 ABSL_NAMESPACE_BEGIN
45
SimpleAtof(absl::string_view str,float * out)46 bool SimpleAtof(absl::string_view str, float* out) {
47 *out = 0.0;
48 str = StripAsciiWhitespace(str);
49 // std::from_chars doesn't accept an initial +, but SimpleAtof does, so if one
50 // is present, skip it, while avoiding accepting "+-0" as valid.
51 if (!str.empty() && str[0] == '+') {
52 str.remove_prefix(1);
53 if (!str.empty() && str[0] == '-') {
54 return false;
55 }
56 }
57 auto result = absl::from_chars(str.data(), str.data() + str.size(), *out);
58 if (result.ec == std::errc::invalid_argument) {
59 return false;
60 }
61 if (result.ptr != str.data() + str.size()) {
62 // not all non-whitespace characters consumed
63 return false;
64 }
65 // from_chars() with DR 3081's current wording will return max() on
66 // overflow. SimpleAtof returns infinity instead.
67 if (result.ec == std::errc::result_out_of_range) {
68 if (*out > 1.0) {
69 *out = std::numeric_limits<float>::infinity();
70 } else if (*out < -1.0) {
71 *out = -std::numeric_limits<float>::infinity();
72 }
73 }
74 return true;
75 }
76
SimpleAtod(absl::string_view str,double * out)77 bool SimpleAtod(absl::string_view str, double* out) {
78 *out = 0.0;
79 str = StripAsciiWhitespace(str);
80 // std::from_chars doesn't accept an initial +, but SimpleAtod does, so if one
81 // is present, skip it, while avoiding accepting "+-0" as valid.
82 if (!str.empty() && str[0] == '+') {
83 str.remove_prefix(1);
84 if (!str.empty() && str[0] == '-') {
85 return false;
86 }
87 }
88 auto result = absl::from_chars(str.data(), str.data() + str.size(), *out);
89 if (result.ec == std::errc::invalid_argument) {
90 return false;
91 }
92 if (result.ptr != str.data() + str.size()) {
93 // not all non-whitespace characters consumed
94 return false;
95 }
96 // from_chars() with DR 3081's current wording will return max() on
97 // overflow. SimpleAtod returns infinity instead.
98 if (result.ec == std::errc::result_out_of_range) {
99 if (*out > 1.0) {
100 *out = std::numeric_limits<double>::infinity();
101 } else if (*out < -1.0) {
102 *out = -std::numeric_limits<double>::infinity();
103 }
104 }
105 return true;
106 }
107
SimpleAtob(absl::string_view str,bool * out)108 bool SimpleAtob(absl::string_view str, bool* out) {
109 ABSL_RAW_CHECK(out != nullptr, "Output pointer must not be nullptr.");
110 if (EqualsIgnoreCase(str, "true") || EqualsIgnoreCase(str, "t") ||
111 EqualsIgnoreCase(str, "yes") || EqualsIgnoreCase(str, "y") ||
112 EqualsIgnoreCase(str, "1")) {
113 *out = true;
114 return true;
115 }
116 if (EqualsIgnoreCase(str, "false") || EqualsIgnoreCase(str, "f") ||
117 EqualsIgnoreCase(str, "no") || EqualsIgnoreCase(str, "n") ||
118 EqualsIgnoreCase(str, "0")) {
119 *out = false;
120 return true;
121 }
122 return false;
123 }
124
125 // ----------------------------------------------------------------------
126 // FastIntToBuffer() overloads
127 //
128 // Like the Fast*ToBuffer() functions above, these are intended for speed.
129 // Unlike the Fast*ToBuffer() functions, however, these functions write
130 // their output to the beginning of the buffer. The caller is responsible
131 // for ensuring that the buffer has enough space to hold the output.
132 //
133 // Returns a pointer to the end of the string (i.e. the null character
134 // terminating the string).
135 // ----------------------------------------------------------------------
136
137 namespace {
138
139 // Used to optimize printing a decimal number's final digit.
140 const char one_ASCII_final_digits[10][2] {
141 {'0', 0}, {'1', 0}, {'2', 0}, {'3', 0}, {'4', 0},
142 {'5', 0}, {'6', 0}, {'7', 0}, {'8', 0}, {'9', 0},
143 };
144
145 } // namespace
146
FastIntToBuffer(uint32_t i,char * buffer)147 char* numbers_internal::FastIntToBuffer(uint32_t i, char* buffer) {
148 uint32_t digits;
149 // The idea of this implementation is to trim the number of divides to as few
150 // as possible, and also reducing memory stores and branches, by going in
151 // steps of two digits at a time rather than one whenever possible.
152 // The huge-number case is first, in the hopes that the compiler will output
153 // that case in one branch-free block of code, and only output conditional
154 // branches into it from below.
155 if (i >= 1000000000) { // >= 1,000,000,000
156 digits = i / 100000000; // 100,000,000
157 i -= digits * 100000000;
158 PutTwoDigits(digits, buffer);
159 buffer += 2;
160 lt100_000_000:
161 digits = i / 1000000; // 1,000,000
162 i -= digits * 1000000;
163 PutTwoDigits(digits, buffer);
164 buffer += 2;
165 lt1_000_000:
166 digits = i / 10000; // 10,000
167 i -= digits * 10000;
168 PutTwoDigits(digits, buffer);
169 buffer += 2;
170 lt10_000:
171 digits = i / 100;
172 i -= digits * 100;
173 PutTwoDigits(digits, buffer);
174 buffer += 2;
175 lt100:
176 digits = i;
177 PutTwoDigits(digits, buffer);
178 buffer += 2;
179 *buffer = 0;
180 return buffer;
181 }
182
183 if (i < 100) {
184 digits = i;
185 if (i >= 10) goto lt100;
186 memcpy(buffer, one_ASCII_final_digits[i], 2);
187 return buffer + 1;
188 }
189 if (i < 10000) { // 10,000
190 if (i >= 1000) goto lt10_000;
191 digits = i / 100;
192 i -= digits * 100;
193 *buffer++ = '0' + static_cast<char>(digits);
194 goto lt100;
195 }
196 if (i < 1000000) { // 1,000,000
197 if (i >= 100000) goto lt1_000_000;
198 digits = i / 10000; // 10,000
199 i -= digits * 10000;
200 *buffer++ = '0' + static_cast<char>(digits);
201 goto lt10_000;
202 }
203 if (i < 100000000) { // 100,000,000
204 if (i >= 10000000) goto lt100_000_000;
205 digits = i / 1000000; // 1,000,000
206 i -= digits * 1000000;
207 *buffer++ = '0' + static_cast<char>(digits);
208 goto lt1_000_000;
209 }
210 // we already know that i < 1,000,000,000
211 digits = i / 100000000; // 100,000,000
212 i -= digits * 100000000;
213 *buffer++ = '0' + static_cast<char>(digits);
214 goto lt100_000_000;
215 }
216
FastIntToBuffer(int32_t i,char * buffer)217 char* numbers_internal::FastIntToBuffer(int32_t i, char* buffer) {
218 uint32_t u = static_cast<uint32_t>(i);
219 if (i < 0) {
220 *buffer++ = '-';
221 // We need to do the negation in modular (i.e., "unsigned")
222 // arithmetic; MSVC++ apprently warns for plain "-u", so
223 // we write the equivalent expression "0 - u" instead.
224 u = 0 - u;
225 }
226 return numbers_internal::FastIntToBuffer(u, buffer);
227 }
228
FastIntToBuffer(uint64_t i,char * buffer)229 char* numbers_internal::FastIntToBuffer(uint64_t i, char* buffer) {
230 uint32_t u32 = static_cast<uint32_t>(i);
231 if (u32 == i) return numbers_internal::FastIntToBuffer(u32, buffer);
232
233 // Here we know i has at least 10 decimal digits.
234 uint64_t top_1to11 = i / 1000000000;
235 u32 = static_cast<uint32_t>(i - top_1to11 * 1000000000);
236 uint32_t top_1to11_32 = static_cast<uint32_t>(top_1to11);
237
238 if (top_1to11_32 == top_1to11) {
239 buffer = numbers_internal::FastIntToBuffer(top_1to11_32, buffer);
240 } else {
241 // top_1to11 has more than 32 bits too; print it in two steps.
242 uint32_t top_8to9 = static_cast<uint32_t>(top_1to11 / 100);
243 uint32_t mid_2 = static_cast<uint32_t>(top_1to11 - top_8to9 * 100);
244 buffer = numbers_internal::FastIntToBuffer(top_8to9, buffer);
245 PutTwoDigits(mid_2, buffer);
246 buffer += 2;
247 }
248
249 // We have only 9 digits now, again the maximum uint32_t can handle fully.
250 uint32_t digits = u32 / 10000000; // 10,000,000
251 u32 -= digits * 10000000;
252 PutTwoDigits(digits, buffer);
253 buffer += 2;
254 digits = u32 / 100000; // 100,000
255 u32 -= digits * 100000;
256 PutTwoDigits(digits, buffer);
257 buffer += 2;
258 digits = u32 / 1000; // 1,000
259 u32 -= digits * 1000;
260 PutTwoDigits(digits, buffer);
261 buffer += 2;
262 digits = u32 / 10;
263 u32 -= digits * 10;
264 PutTwoDigits(digits, buffer);
265 buffer += 2;
266 memcpy(buffer, one_ASCII_final_digits[u32], 2);
267 return buffer + 1;
268 }
269
FastIntToBuffer(int64_t i,char * buffer)270 char* numbers_internal::FastIntToBuffer(int64_t i, char* buffer) {
271 uint64_t u = static_cast<uint64_t>(i);
272 if (i < 0) {
273 *buffer++ = '-';
274 u = 0 - u;
275 }
276 return numbers_internal::FastIntToBuffer(u, buffer);
277 }
278
279 // Given a 128-bit number expressed as a pair of uint64_t, high half first,
280 // return that number multiplied by the given 32-bit value. If the result is
281 // too large to fit in a 128-bit number, divide it by 2 until it fits.
Mul32(std::pair<uint64_t,uint64_t> num,uint32_t mul)282 static std::pair<uint64_t, uint64_t> Mul32(std::pair<uint64_t, uint64_t> num,
283 uint32_t mul) {
284 uint64_t bits0_31 = num.second & 0xFFFFFFFF;
285 uint64_t bits32_63 = num.second >> 32;
286 uint64_t bits64_95 = num.first & 0xFFFFFFFF;
287 uint64_t bits96_127 = num.first >> 32;
288
289 // The picture so far: each of these 64-bit values has only the lower 32 bits
290 // filled in.
291 // bits96_127: [ 00000000 xxxxxxxx ]
292 // bits64_95: [ 00000000 xxxxxxxx ]
293 // bits32_63: [ 00000000 xxxxxxxx ]
294 // bits0_31: [ 00000000 xxxxxxxx ]
295
296 bits0_31 *= mul;
297 bits32_63 *= mul;
298 bits64_95 *= mul;
299 bits96_127 *= mul;
300
301 // Now the top halves may also have value, though all 64 of their bits will
302 // never be set at the same time, since they are a result of a 32x32 bit
303 // multiply. This makes the carry calculation slightly easier.
304 // bits96_127: [ mmmmmmmm | mmmmmmmm ]
305 // bits64_95: [ | mmmmmmmm mmmmmmmm | ]
306 // bits32_63: | [ mmmmmmmm | mmmmmmmm ]
307 // bits0_31: | [ | mmmmmmmm mmmmmmmm ]
308 // eventually: [ bits128_up | ...bits64_127.... | ..bits0_63... ]
309
310 uint64_t bits0_63 = bits0_31 + (bits32_63 << 32);
311 uint64_t bits64_127 = bits64_95 + (bits96_127 << 32) + (bits32_63 >> 32) +
312 (bits0_63 < bits0_31);
313 uint64_t bits128_up = (bits96_127 >> 32) + (bits64_127 < bits64_95);
314 if (bits128_up == 0) return {bits64_127, bits0_63};
315
316 auto shift = static_cast<unsigned>(bit_width(bits128_up));
317 uint64_t lo = (bits0_63 >> shift) + (bits64_127 << (64 - shift));
318 uint64_t hi = (bits64_127 >> shift) + (bits128_up << (64 - shift));
319 return {hi, lo};
320 }
321
322 // Compute num * 5 ^ expfive, and return the first 128 bits of the result,
323 // where the first bit is always a one. So PowFive(1, 0) starts 0b100000,
324 // PowFive(1, 1) starts 0b101000, PowFive(1, 2) starts 0b110010, etc.
PowFive(uint64_t num,int expfive)325 static std::pair<uint64_t, uint64_t> PowFive(uint64_t num, int expfive) {
326 std::pair<uint64_t, uint64_t> result = {num, 0};
327 while (expfive >= 13) {
328 // 5^13 is the highest power of five that will fit in a 32-bit integer.
329 result = Mul32(result, 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5);
330 expfive -= 13;
331 }
332 constexpr uint32_t powers_of_five[13] = {
333 1,
334 5,
335 5 * 5,
336 5 * 5 * 5,
337 5 * 5 * 5 * 5,
338 5 * 5 * 5 * 5 * 5,
339 5 * 5 * 5 * 5 * 5 * 5,
340 5 * 5 * 5 * 5 * 5 * 5 * 5,
341 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,
342 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,
343 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,
344 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5,
345 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5};
346 result = Mul32(result, powers_of_five[expfive & 15]);
347 int shift = countl_zero(result.first);
348 if (shift != 0) {
349 result.first = (result.first << shift) + (result.second >> (64 - shift));
350 result.second = (result.second << shift);
351 }
352 return result;
353 }
354
355 struct ExpDigits {
356 int32_t exponent;
357 char digits[6];
358 };
359
360 // SplitToSix converts value, a positive double-precision floating-point number,
361 // into a base-10 exponent and 6 ASCII digits, where the first digit is never
362 // zero. For example, SplitToSix(1) returns an exponent of zero and a digits
363 // array of {'1', '0', '0', '0', '0', '0'}. If value is exactly halfway between
364 // two possible representations, e.g. value = 100000.5, then "round to even" is
365 // performed.
SplitToSix(const double value)366 static ExpDigits SplitToSix(const double value) {
367 ExpDigits exp_dig;
368 int exp = 5;
369 double d = value;
370 // First step: calculate a close approximation of the output, where the
371 // value d will be between 100,000 and 999,999, representing the digits
372 // in the output ASCII array, and exp is the base-10 exponent. It would be
373 // faster to use a table here, and to look up the base-2 exponent of value,
374 // however value is an IEEE-754 64-bit number, so the table would have 2,000
375 // entries, which is not cache-friendly.
376 if (d >= 999999.5) {
377 if (d >= 1e+261) exp += 256, d *= 1e-256;
378 if (d >= 1e+133) exp += 128, d *= 1e-128;
379 if (d >= 1e+69) exp += 64, d *= 1e-64;
380 if (d >= 1e+37) exp += 32, d *= 1e-32;
381 if (d >= 1e+21) exp += 16, d *= 1e-16;
382 if (d >= 1e+13) exp += 8, d *= 1e-8;
383 if (d >= 1e+9) exp += 4, d *= 1e-4;
384 if (d >= 1e+7) exp += 2, d *= 1e-2;
385 if (d >= 1e+6) exp += 1, d *= 1e-1;
386 } else {
387 if (d < 1e-250) exp -= 256, d *= 1e256;
388 if (d < 1e-122) exp -= 128, d *= 1e128;
389 if (d < 1e-58) exp -= 64, d *= 1e64;
390 if (d < 1e-26) exp -= 32, d *= 1e32;
391 if (d < 1e-10) exp -= 16, d *= 1e16;
392 if (d < 1e-2) exp -= 8, d *= 1e8;
393 if (d < 1e+2) exp -= 4, d *= 1e4;
394 if (d < 1e+4) exp -= 2, d *= 1e2;
395 if (d < 1e+5) exp -= 1, d *= 1e1;
396 }
397 // At this point, d is in the range [99999.5..999999.5) and exp is in the
398 // range [-324..308]. Since we need to round d up, we want to add a half
399 // and truncate.
400 // However, the technique above may have lost some precision, due to its
401 // repeated multiplication by constants that each may be off by half a bit
402 // of precision. This only matters if we're close to the edge though.
403 // Since we'd like to know if the fractional part of d is close to a half,
404 // we multiply it by 65536 and see if the fractional part is close to 32768.
405 // (The number doesn't have to be a power of two,but powers of two are faster)
406 uint64_t d64k = d * 65536;
407 uint32_t dddddd; // A 6-digit decimal integer.
408 if ((d64k % 65536) == 32767 || (d64k % 65536) == 32768) {
409 // OK, it's fairly likely that precision was lost above, which is
410 // not a surprise given only 52 mantissa bits are available. Therefore
411 // redo the calculation using 128-bit numbers. (64 bits are not enough).
412
413 // Start out with digits rounded down; maybe add one below.
414 dddddd = static_cast<uint32_t>(d64k / 65536);
415
416 // mantissa is a 64-bit integer representing M.mmm... * 2^63. The actual
417 // value we're representing, of course, is M.mmm... * 2^exp2.
418 int exp2;
419 double m = std::frexp(value, &exp2);
420 uint64_t mantissa = m * (32768.0 * 65536.0 * 65536.0 * 65536.0);
421 // std::frexp returns an m value in the range [0.5, 1.0), however we
422 // can't multiply it by 2^64 and convert to an integer because some FPUs
423 // throw an exception when converting an number higher than 2^63 into an
424 // integer - even an unsigned 64-bit integer! Fortunately it doesn't matter
425 // since m only has 52 significant bits anyway.
426 mantissa <<= 1;
427 exp2 -= 64; // not needed, but nice for debugging
428
429 // OK, we are here to compare:
430 // (dddddd + 0.5) * 10^(exp-5) vs. mantissa * 2^exp2
431 // so we can round up dddddd if appropriate. Those values span the full
432 // range of 600 orders of magnitude of IEE 64-bit floating-point.
433 // Fortunately, we already know they are very close, so we don't need to
434 // track the base-2 exponent of both sides. This greatly simplifies the
435 // the math since the 2^exp2 calculation is unnecessary and the power-of-10
436 // calculation can become a power-of-5 instead.
437
438 std::pair<uint64_t, uint64_t> edge, val;
439 if (exp >= 6) {
440 // Compare (dddddd + 0.5) * 5 ^ (exp - 5) to mantissa
441 // Since we're tossing powers of two, 2 * dddddd + 1 is the
442 // same as dddddd + 0.5
443 edge = PowFive(2 * dddddd + 1, exp - 5);
444
445 val.first = mantissa;
446 val.second = 0;
447 } else {
448 // We can't compare (dddddd + 0.5) * 5 ^ (exp - 5) to mantissa as we did
449 // above because (exp - 5) is negative. So we compare (dddddd + 0.5) to
450 // mantissa * 5 ^ (5 - exp)
451 edge = PowFive(2 * dddddd + 1, 0);
452
453 val = PowFive(mantissa, 5 - exp);
454 }
455 // printf("exp=%d %016lx %016lx vs %016lx %016lx\n", exp, val.first,
456 // val.second, edge.first, edge.second);
457 if (val > edge) {
458 dddddd++;
459 } else if (val == edge) {
460 dddddd += (dddddd & 1);
461 }
462 } else {
463 // Here, we are not close to the edge.
464 dddddd = static_cast<uint32_t>((d64k + 32768) / 65536);
465 }
466 if (dddddd == 1000000) {
467 dddddd = 100000;
468 exp += 1;
469 }
470 exp_dig.exponent = exp;
471
472 uint32_t two_digits = dddddd / 10000;
473 dddddd -= two_digits * 10000;
474 numbers_internal::PutTwoDigits(two_digits, &exp_dig.digits[0]);
475
476 two_digits = dddddd / 100;
477 dddddd -= two_digits * 100;
478 numbers_internal::PutTwoDigits(two_digits, &exp_dig.digits[2]);
479
480 numbers_internal::PutTwoDigits(dddddd, &exp_dig.digits[4]);
481 return exp_dig;
482 }
483
484 // Helper function for fast formatting of floating-point.
485 // The result is the same as "%g", a.k.a. "%.6g".
SixDigitsToBuffer(double d,char * const buffer)486 size_t numbers_internal::SixDigitsToBuffer(double d, char* const buffer) {
487 static_assert(std::numeric_limits<float>::is_iec559,
488 "IEEE-754/IEC-559 support only");
489
490 char* out = buffer; // we write data to out, incrementing as we go, but
491 // FloatToBuffer always returns the address of the buffer
492 // passed in.
493
494 if (std::isnan(d)) {
495 strcpy(out, "nan"); // NOLINT(runtime/printf)
496 return 3;
497 }
498 if (d == 0) { // +0 and -0 are handled here
499 if (std::signbit(d)) *out++ = '-';
500 *out++ = '0';
501 *out = 0;
502 return static_cast<size_t>(out - buffer);
503 }
504 if (d < 0) {
505 *out++ = '-';
506 d = -d;
507 }
508 if (d > std::numeric_limits<double>::max()) {
509 strcpy(out, "inf"); // NOLINT(runtime/printf)
510 return static_cast<size_t>(out + 3 - buffer);
511 }
512
513 auto exp_dig = SplitToSix(d);
514 int exp = exp_dig.exponent;
515 const char* digits = exp_dig.digits;
516 out[0] = '0';
517 out[1] = '.';
518 switch (exp) {
519 case 5:
520 memcpy(out, &digits[0], 6), out += 6;
521 *out = 0;
522 return static_cast<size_t>(out - buffer);
523 case 4:
524 memcpy(out, &digits[0], 5), out += 5;
525 if (digits[5] != '0') {
526 *out++ = '.';
527 *out++ = digits[5];
528 }
529 *out = 0;
530 return static_cast<size_t>(out - buffer);
531 case 3:
532 memcpy(out, &digits[0], 4), out += 4;
533 if ((digits[5] | digits[4]) != '0') {
534 *out++ = '.';
535 *out++ = digits[4];
536 if (digits[5] != '0') *out++ = digits[5];
537 }
538 *out = 0;
539 return static_cast<size_t>(out - buffer);
540 case 2:
541 memcpy(out, &digits[0], 3), out += 3;
542 *out++ = '.';
543 memcpy(out, &digits[3], 3);
544 out += 3;
545 while (out[-1] == '0') --out;
546 if (out[-1] == '.') --out;
547 *out = 0;
548 return static_cast<size_t>(out - buffer);
549 case 1:
550 memcpy(out, &digits[0], 2), out += 2;
551 *out++ = '.';
552 memcpy(out, &digits[2], 4);
553 out += 4;
554 while (out[-1] == '0') --out;
555 if (out[-1] == '.') --out;
556 *out = 0;
557 return static_cast<size_t>(out - buffer);
558 case 0:
559 memcpy(out, &digits[0], 1), out += 1;
560 *out++ = '.';
561 memcpy(out, &digits[1], 5);
562 out += 5;
563 while (out[-1] == '0') --out;
564 if (out[-1] == '.') --out;
565 *out = 0;
566 return static_cast<size_t>(out - buffer);
567 case -4:
568 out[2] = '0';
569 ++out;
570 ABSL_FALLTHROUGH_INTENDED;
571 case -3:
572 out[2] = '0';
573 ++out;
574 ABSL_FALLTHROUGH_INTENDED;
575 case -2:
576 out[2] = '0';
577 ++out;
578 ABSL_FALLTHROUGH_INTENDED;
579 case -1:
580 out += 2;
581 memcpy(out, &digits[0], 6);
582 out += 6;
583 while (out[-1] == '0') --out;
584 *out = 0;
585 return static_cast<size_t>(out - buffer);
586 }
587 assert(exp < -4 || exp >= 6);
588 out[0] = digits[0];
589 assert(out[1] == '.');
590 out += 2;
591 memcpy(out, &digits[1], 5), out += 5;
592 while (out[-1] == '0') --out;
593 if (out[-1] == '.') --out;
594 *out++ = 'e';
595 if (exp > 0) {
596 *out++ = '+';
597 } else {
598 *out++ = '-';
599 exp = -exp;
600 }
601 if (exp > 99) {
602 int dig1 = exp / 100;
603 exp -= dig1 * 100;
604 *out++ = '0' + static_cast<char>(dig1);
605 }
606 PutTwoDigits(static_cast<uint32_t>(exp), out);
607 out += 2;
608 *out = 0;
609 return static_cast<size_t>(out - buffer);
610 }
611
612 namespace {
613 // Represents integer values of digits.
614 // Uses 36 to indicate an invalid character since we support
615 // bases up to 36.
616 static const int8_t kAsciiToInt[256] = {
617 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, // 16 36s.
618 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
619 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 1, 2, 3, 4, 5,
620 6, 7, 8, 9, 36, 36, 36, 36, 36, 36, 36, 10, 11, 12, 13, 14, 15, 16, 17,
621 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
622 36, 36, 36, 36, 36, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
623 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 36, 36, 36, 36, 36,
624 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
625 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
626 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
627 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
628 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
629 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
630 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36};
631
632 // Parse the sign and optional hex or oct prefix in text.
safe_parse_sign_and_base(absl::string_view * text,int * base_ptr,bool * negative_ptr)633 inline bool safe_parse_sign_and_base(absl::string_view* text /*inout*/,
634 int* base_ptr /*inout*/,
635 bool* negative_ptr /*output*/) {
636 if (text->data() == nullptr) {
637 return false;
638 }
639
640 const char* start = text->data();
641 const char* end = start + text->size();
642 int base = *base_ptr;
643
644 // Consume whitespace.
645 while (start < end &&
646 absl::ascii_isspace(static_cast<unsigned char>(start[0]))) {
647 ++start;
648 }
649 while (start < end &&
650 absl::ascii_isspace(static_cast<unsigned char>(end[-1]))) {
651 --end;
652 }
653 if (start >= end) {
654 return false;
655 }
656
657 // Consume sign.
658 *negative_ptr = (start[0] == '-');
659 if (*negative_ptr || start[0] == '+') {
660 ++start;
661 if (start >= end) {
662 return false;
663 }
664 }
665
666 // Consume base-dependent prefix.
667 // base 0: "0x" -> base 16, "0" -> base 8, default -> base 10
668 // base 16: "0x" -> base 16
669 // Also validate the base.
670 if (base == 0) {
671 if (end - start >= 2 && start[0] == '0' &&
672 (start[1] == 'x' || start[1] == 'X')) {
673 base = 16;
674 start += 2;
675 if (start >= end) {
676 // "0x" with no digits after is invalid.
677 return false;
678 }
679 } else if (end - start >= 1 && start[0] == '0') {
680 base = 8;
681 start += 1;
682 } else {
683 base = 10;
684 }
685 } else if (base == 16) {
686 if (end - start >= 2 && start[0] == '0' &&
687 (start[1] == 'x' || start[1] == 'X')) {
688 start += 2;
689 if (start >= end) {
690 // "0x" with no digits after is invalid.
691 return false;
692 }
693 }
694 } else if (base >= 2 && base <= 36) {
695 // okay
696 } else {
697 return false;
698 }
699 *text = absl::string_view(start, static_cast<size_t>(end - start));
700 *base_ptr = base;
701 return true;
702 }
703
704 // Consume digits.
705 //
706 // The classic loop:
707 //
708 // for each digit
709 // value = value * base + digit
710 // value *= sign
711 //
712 // The classic loop needs overflow checking. It also fails on the most
713 // negative integer, -2147483648 in 32-bit two's complement representation.
714 //
715 // My improved loop:
716 //
717 // if (!negative)
718 // for each digit
719 // value = value * base
720 // value = value + digit
721 // else
722 // for each digit
723 // value = value * base
724 // value = value - digit
725 //
726 // Overflow checking becomes simple.
727
728 // Lookup tables per IntType:
729 // vmax/base and vmin/base are precomputed because division costs at least 8ns.
730 // TODO(junyer): Doing this per base instead (i.e. an array of structs, not a
731 // struct of arrays) would probably be better in terms of d-cache for the most
732 // commonly used bases.
733 template <typename IntType>
734 struct LookupTables {
735 ABSL_CONST_INIT static const IntType kVmaxOverBase[];
736 ABSL_CONST_INIT static const IntType kVminOverBase[];
737 };
738
739 // An array initializer macro for X/base where base in [0, 36].
740 // However, note that lookups for base in [0, 1] should never happen because
741 // base has been validated to be in [2, 36] by safe_parse_sign_and_base().
742 #define X_OVER_BASE_INITIALIZER(X) \
743 { \
744 0, 0, X / 2, X / 3, X / 4, X / 5, X / 6, X / 7, X / 8, X / 9, X / 10, \
745 X / 11, X / 12, X / 13, X / 14, X / 15, X / 16, X / 17, X / 18, \
746 X / 19, X / 20, X / 21, X / 22, X / 23, X / 24, X / 25, X / 26, \
747 X / 27, X / 28, X / 29, X / 30, X / 31, X / 32, X / 33, X / 34, \
748 X / 35, X / 36, \
749 }
750
751 // This kVmaxOverBase is generated with
752 // for (int base = 2; base < 37; ++base) {
753 // absl::uint128 max = std::numeric_limits<absl::uint128>::max();
754 // auto result = max / base;
755 // std::cout << " MakeUint128(" << absl::Uint128High64(result) << "u, "
756 // << absl::Uint128Low64(result) << "u),\n";
757 // }
758 // See https://godbolt.org/z/aneYsb
759 //
760 // uint128& operator/=(uint128) is not constexpr, so hardcode the resulting
761 // array to avoid a static initializer.
762 template <>
763 ABSL_CONST_INIT const uint128 LookupTables<uint128>::kVmaxOverBase[] = {
764 0,
765 0,
766 MakeUint128(9223372036854775807u, 18446744073709551615u),
767 MakeUint128(6148914691236517205u, 6148914691236517205u),
768 MakeUint128(4611686018427387903u, 18446744073709551615u),
769 MakeUint128(3689348814741910323u, 3689348814741910323u),
770 MakeUint128(3074457345618258602u, 12297829382473034410u),
771 MakeUint128(2635249153387078802u, 5270498306774157604u),
772 MakeUint128(2305843009213693951u, 18446744073709551615u),
773 MakeUint128(2049638230412172401u, 14347467612885206812u),
774 MakeUint128(1844674407370955161u, 11068046444225730969u),
775 MakeUint128(1676976733973595601u, 8384883669867978007u),
776 MakeUint128(1537228672809129301u, 6148914691236517205u),
777 MakeUint128(1418980313362273201u, 4256940940086819603u),
778 MakeUint128(1317624576693539401u, 2635249153387078802u),
779 MakeUint128(1229782938247303441u, 1229782938247303441u),
780 MakeUint128(1152921504606846975u, 18446744073709551615u),
781 MakeUint128(1085102592571150095u, 1085102592571150095u),
782 MakeUint128(1024819115206086200u, 16397105843297379214u),
783 MakeUint128(970881267037344821u, 16504981539634861972u),
784 MakeUint128(922337203685477580u, 14757395258967641292u),
785 MakeUint128(878416384462359600u, 14054662151397753612u),
786 MakeUint128(838488366986797800u, 13415813871788764811u),
787 MakeUint128(802032351030850070u, 4812194106185100421u),
788 MakeUint128(768614336404564650u, 12297829382473034410u),
789 MakeUint128(737869762948382064u, 11805916207174113034u),
790 MakeUint128(709490156681136600u, 11351842506898185609u),
791 MakeUint128(683212743470724133u, 17080318586768103348u),
792 MakeUint128(658812288346769700u, 10540996613548315209u),
793 MakeUint128(636094623231363848u, 15266270957552732371u),
794 MakeUint128(614891469123651720u, 9838263505978427528u),
795 MakeUint128(595056260442243600u, 9520900167075897608u),
796 MakeUint128(576460752303423487u, 18446744073709551615u),
797 MakeUint128(558992244657865200u, 8943875914525843207u),
798 MakeUint128(542551296285575047u, 9765923333140350855u),
799 MakeUint128(527049830677415760u, 8432797290838652167u),
800 MakeUint128(512409557603043100u, 8198552921648689607u),
801 };
802
803 // This kVmaxOverBase generated with
804 // for (int base = 2; base < 37; ++base) {
805 // absl::int128 max = std::numeric_limits<absl::int128>::max();
806 // auto result = max / base;
807 // std::cout << "\tMakeInt128(" << absl::Int128High64(result) << ", "
808 // << absl::Int128Low64(result) << "u),\n";
809 // }
810 // See https://godbolt.org/z/7djYWz
811 //
812 // int128& operator/=(int128) is not constexpr, so hardcode the resulting array
813 // to avoid a static initializer.
814 template <>
815 ABSL_CONST_INIT const int128 LookupTables<int128>::kVmaxOverBase[] = {
816 0,
817 0,
818 MakeInt128(4611686018427387903, 18446744073709551615u),
819 MakeInt128(3074457345618258602, 12297829382473034410u),
820 MakeInt128(2305843009213693951, 18446744073709551615u),
821 MakeInt128(1844674407370955161, 11068046444225730969u),
822 MakeInt128(1537228672809129301, 6148914691236517205u),
823 MakeInt128(1317624576693539401, 2635249153387078802u),
824 MakeInt128(1152921504606846975, 18446744073709551615u),
825 MakeInt128(1024819115206086200, 16397105843297379214u),
826 MakeInt128(922337203685477580, 14757395258967641292u),
827 MakeInt128(838488366986797800, 13415813871788764811u),
828 MakeInt128(768614336404564650, 12297829382473034410u),
829 MakeInt128(709490156681136600, 11351842506898185609u),
830 MakeInt128(658812288346769700, 10540996613548315209u),
831 MakeInt128(614891469123651720, 9838263505978427528u),
832 MakeInt128(576460752303423487, 18446744073709551615u),
833 MakeInt128(542551296285575047, 9765923333140350855u),
834 MakeInt128(512409557603043100, 8198552921648689607u),
835 MakeInt128(485440633518672410, 17475862806672206794u),
836 MakeInt128(461168601842738790, 7378697629483820646u),
837 MakeInt128(439208192231179800, 7027331075698876806u),
838 MakeInt128(419244183493398900, 6707906935894382405u),
839 MakeInt128(401016175515425035, 2406097053092550210u),
840 MakeInt128(384307168202282325, 6148914691236517205u),
841 MakeInt128(368934881474191032, 5902958103587056517u),
842 MakeInt128(354745078340568300, 5675921253449092804u),
843 MakeInt128(341606371735362066, 17763531330238827482u),
844 MakeInt128(329406144173384850, 5270498306774157604u),
845 MakeInt128(318047311615681924, 7633135478776366185u),
846 MakeInt128(307445734561825860, 4919131752989213764u),
847 MakeInt128(297528130221121800, 4760450083537948804u),
848 MakeInt128(288230376151711743, 18446744073709551615u),
849 MakeInt128(279496122328932600, 4471937957262921603u),
850 MakeInt128(271275648142787523, 14106333703424951235u),
851 MakeInt128(263524915338707880, 4216398645419326083u),
852 MakeInt128(256204778801521550, 4099276460824344803u),
853 };
854
855 // This kVminOverBase generated with
856 // for (int base = 2; base < 37; ++base) {
857 // absl::int128 min = std::numeric_limits<absl::int128>::min();
858 // auto result = min / base;
859 // std::cout << "\tMakeInt128(" << absl::Int128High64(result) << ", "
860 // << absl::Int128Low64(result) << "u),\n";
861 // }
862 //
863 // See https://godbolt.org/z/7djYWz
864 //
865 // int128& operator/=(int128) is not constexpr, so hardcode the resulting array
866 // to avoid a static initializer.
867 template <>
868 ABSL_CONST_INIT const int128 LookupTables<int128>::kVminOverBase[] = {
869 0,
870 0,
871 MakeInt128(-4611686018427387904, 0u),
872 MakeInt128(-3074457345618258603, 6148914691236517206u),
873 MakeInt128(-2305843009213693952, 0u),
874 MakeInt128(-1844674407370955162, 7378697629483820647u),
875 MakeInt128(-1537228672809129302, 12297829382473034411u),
876 MakeInt128(-1317624576693539402, 15811494920322472814u),
877 MakeInt128(-1152921504606846976, 0u),
878 MakeInt128(-1024819115206086201, 2049638230412172402u),
879 MakeInt128(-922337203685477581, 3689348814741910324u),
880 MakeInt128(-838488366986797801, 5030930201920786805u),
881 MakeInt128(-768614336404564651, 6148914691236517206u),
882 MakeInt128(-709490156681136601, 7094901566811366007u),
883 MakeInt128(-658812288346769701, 7905747460161236407u),
884 MakeInt128(-614891469123651721, 8608480567731124088u),
885 MakeInt128(-576460752303423488, 0u),
886 MakeInt128(-542551296285575048, 8680820740569200761u),
887 MakeInt128(-512409557603043101, 10248191152060862009u),
888 MakeInt128(-485440633518672411, 970881267037344822u),
889 MakeInt128(-461168601842738791, 11068046444225730970u),
890 MakeInt128(-439208192231179801, 11419412998010674810u),
891 MakeInt128(-419244183493398901, 11738837137815169211u),
892 MakeInt128(-401016175515425036, 16040647020617001406u),
893 MakeInt128(-384307168202282326, 12297829382473034411u),
894 MakeInt128(-368934881474191033, 12543785970122495099u),
895 MakeInt128(-354745078340568301, 12770822820260458812u),
896 MakeInt128(-341606371735362067, 683212743470724134u),
897 MakeInt128(-329406144173384851, 13176245766935394012u),
898 MakeInt128(-318047311615681925, 10813608594933185431u),
899 MakeInt128(-307445734561825861, 13527612320720337852u),
900 MakeInt128(-297528130221121801, 13686293990171602812u),
901 MakeInt128(-288230376151711744, 0u),
902 MakeInt128(-279496122328932601, 13974806116446630013u),
903 MakeInt128(-271275648142787524, 4340410370284600381u),
904 MakeInt128(-263524915338707881, 14230345428290225533u),
905 MakeInt128(-256204778801521551, 14347467612885206813u),
906 };
907
908 template <typename IntType>
909 ABSL_CONST_INIT const IntType LookupTables<IntType>::kVmaxOverBase[] =
910 X_OVER_BASE_INITIALIZER(std::numeric_limits<IntType>::max());
911
912 template <typename IntType>
913 ABSL_CONST_INIT const IntType LookupTables<IntType>::kVminOverBase[] =
914 X_OVER_BASE_INITIALIZER(std::numeric_limits<IntType>::min());
915
916 #undef X_OVER_BASE_INITIALIZER
917
918 template <typename IntType>
safe_parse_positive_int(absl::string_view text,int base,IntType * value_p)919 inline bool safe_parse_positive_int(absl::string_view text, int base,
920 IntType* value_p) {
921 IntType value = 0;
922 const IntType vmax = std::numeric_limits<IntType>::max();
923 assert(vmax > 0);
924 assert(base >= 0);
925 const IntType base_inttype = static_cast<IntType>(base);
926 assert(vmax >= base_inttype);
927 const IntType vmax_over_base = LookupTables<IntType>::kVmaxOverBase[base];
928 assert(base < 2 ||
929 std::numeric_limits<IntType>::max() / base_inttype == vmax_over_base);
930 const char* start = text.data();
931 const char* end = start + text.size();
932 // loop over digits
933 for (; start < end; ++start) {
934 unsigned char c = static_cast<unsigned char>(start[0]);
935 IntType digit = static_cast<IntType>(kAsciiToInt[c]);
936 if (digit >= base_inttype) {
937 *value_p = value;
938 return false;
939 }
940 if (value > vmax_over_base) {
941 *value_p = vmax;
942 return false;
943 }
944 value *= base_inttype;
945 if (value > vmax - digit) {
946 *value_p = vmax;
947 return false;
948 }
949 value += digit;
950 }
951 *value_p = value;
952 return true;
953 }
954
955 template <typename IntType>
safe_parse_negative_int(absl::string_view text,int base,IntType * value_p)956 inline bool safe_parse_negative_int(absl::string_view text, int base,
957 IntType* value_p) {
958 IntType value = 0;
959 const IntType vmin = std::numeric_limits<IntType>::min();
960 assert(vmin < 0);
961 assert(vmin <= 0 - base);
962 IntType vmin_over_base = LookupTables<IntType>::kVminOverBase[base];
963 assert(base < 2 ||
964 std::numeric_limits<IntType>::min() / base == vmin_over_base);
965 // 2003 c++ standard [expr.mul]
966 // "... the sign of the remainder is implementation-defined."
967 // Although (vmin/base)*base + vmin%base is always vmin.
968 // 2011 c++ standard tightens the spec but we cannot rely on it.
969 // TODO(junyer): Handle this in the lookup table generation.
970 if (vmin % base > 0) {
971 vmin_over_base += 1;
972 }
973 const char* start = text.data();
974 const char* end = start + text.size();
975 // loop over digits
976 for (; start < end; ++start) {
977 unsigned char c = static_cast<unsigned char>(start[0]);
978 int digit = kAsciiToInt[c];
979 if (digit >= base) {
980 *value_p = value;
981 return false;
982 }
983 if (value < vmin_over_base) {
984 *value_p = vmin;
985 return false;
986 }
987 value *= base;
988 if (value < vmin + digit) {
989 *value_p = vmin;
990 return false;
991 }
992 value -= digit;
993 }
994 *value_p = value;
995 return true;
996 }
997
998 // Input format based on POSIX.1-2008 strtol
999 // http://pubs.opengroup.org/onlinepubs/9699919799/functions/strtol.html
1000 template <typename IntType>
safe_int_internal(absl::string_view text,IntType * value_p,int base)1001 inline bool safe_int_internal(absl::string_view text, IntType* value_p,
1002 int base) {
1003 *value_p = 0;
1004 bool negative;
1005 if (!safe_parse_sign_and_base(&text, &base, &negative)) {
1006 return false;
1007 }
1008 if (!negative) {
1009 return safe_parse_positive_int(text, base, value_p);
1010 } else {
1011 return safe_parse_negative_int(text, base, value_p);
1012 }
1013 }
1014
1015 template <typename IntType>
safe_uint_internal(absl::string_view text,IntType * value_p,int base)1016 inline bool safe_uint_internal(absl::string_view text, IntType* value_p,
1017 int base) {
1018 *value_p = 0;
1019 bool negative;
1020 if (!safe_parse_sign_and_base(&text, &base, &negative) || negative) {
1021 return false;
1022 }
1023 return safe_parse_positive_int(text, base, value_p);
1024 }
1025 } // anonymous namespace
1026
1027 namespace numbers_internal {
1028
1029 // Digit conversion.
1030 ABSL_CONST_INIT ABSL_DLL const char kHexChar[] =
1031 "0123456789abcdef";
1032
1033 ABSL_CONST_INIT ABSL_DLL const char kHexTable[513] =
1034 "000102030405060708090a0b0c0d0e0f"
1035 "101112131415161718191a1b1c1d1e1f"
1036 "202122232425262728292a2b2c2d2e2f"
1037 "303132333435363738393a3b3c3d3e3f"
1038 "404142434445464748494a4b4c4d4e4f"
1039 "505152535455565758595a5b5c5d5e5f"
1040 "606162636465666768696a6b6c6d6e6f"
1041 "707172737475767778797a7b7c7d7e7f"
1042 "808182838485868788898a8b8c8d8e8f"
1043 "909192939495969798999a9b9c9d9e9f"
1044 "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf"
1045 "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
1046 "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
1047 "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
1048 "e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
1049 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";
1050
1051 ABSL_CONST_INIT ABSL_DLL const char two_ASCII_digits[100][2] = {
1052 {'0', '0'}, {'0', '1'}, {'0', '2'}, {'0', '3'}, {'0', '4'}, {'0', '5'},
1053 {'0', '6'}, {'0', '7'}, {'0', '8'}, {'0', '9'}, {'1', '0'}, {'1', '1'},
1054 {'1', '2'}, {'1', '3'}, {'1', '4'}, {'1', '5'}, {'1', '6'}, {'1', '7'},
1055 {'1', '8'}, {'1', '9'}, {'2', '0'}, {'2', '1'}, {'2', '2'}, {'2', '3'},
1056 {'2', '4'}, {'2', '5'}, {'2', '6'}, {'2', '7'}, {'2', '8'}, {'2', '9'},
1057 {'3', '0'}, {'3', '1'}, {'3', '2'}, {'3', '3'}, {'3', '4'}, {'3', '5'},
1058 {'3', '6'}, {'3', '7'}, {'3', '8'}, {'3', '9'}, {'4', '0'}, {'4', '1'},
1059 {'4', '2'}, {'4', '3'}, {'4', '4'}, {'4', '5'}, {'4', '6'}, {'4', '7'},
1060 {'4', '8'}, {'4', '9'}, {'5', '0'}, {'5', '1'}, {'5', '2'}, {'5', '3'},
1061 {'5', '4'}, {'5', '5'}, {'5', '6'}, {'5', '7'}, {'5', '8'}, {'5', '9'},
1062 {'6', '0'}, {'6', '1'}, {'6', '2'}, {'6', '3'}, {'6', '4'}, {'6', '5'},
1063 {'6', '6'}, {'6', '7'}, {'6', '8'}, {'6', '9'}, {'7', '0'}, {'7', '1'},
1064 {'7', '2'}, {'7', '3'}, {'7', '4'}, {'7', '5'}, {'7', '6'}, {'7', '7'},
1065 {'7', '8'}, {'7', '9'}, {'8', '0'}, {'8', '1'}, {'8', '2'}, {'8', '3'},
1066 {'8', '4'}, {'8', '5'}, {'8', '6'}, {'8', '7'}, {'8', '8'}, {'8', '9'},
1067 {'9', '0'}, {'9', '1'}, {'9', '2'}, {'9', '3'}, {'9', '4'}, {'9', '5'},
1068 {'9', '6'}, {'9', '7'}, {'9', '8'}, {'9', '9'}};
1069
safe_strto32_base(absl::string_view text,int32_t * value,int base)1070 bool safe_strto32_base(absl::string_view text, int32_t* value, int base) {
1071 return safe_int_internal<int32_t>(text, value, base);
1072 }
1073
safe_strto64_base(absl::string_view text,int64_t * value,int base)1074 bool safe_strto64_base(absl::string_view text, int64_t* value, int base) {
1075 return safe_int_internal<int64_t>(text, value, base);
1076 }
1077
safe_strto128_base(absl::string_view text,int128 * value,int base)1078 bool safe_strto128_base(absl::string_view text, int128* value, int base) {
1079 return safe_int_internal<absl::int128>(text, value, base);
1080 }
1081
safe_strtou32_base(absl::string_view text,uint32_t * value,int base)1082 bool safe_strtou32_base(absl::string_view text, uint32_t* value, int base) {
1083 return safe_uint_internal<uint32_t>(text, value, base);
1084 }
1085
safe_strtou64_base(absl::string_view text,uint64_t * value,int base)1086 bool safe_strtou64_base(absl::string_view text, uint64_t* value, int base) {
1087 return safe_uint_internal<uint64_t>(text, value, base);
1088 }
1089
safe_strtou128_base(absl::string_view text,uint128 * value,int base)1090 bool safe_strtou128_base(absl::string_view text, uint128* value, int base) {
1091 return safe_uint_internal<absl::uint128>(text, value, base);
1092 }
1093
1094 } // namespace numbers_internal
1095 ABSL_NAMESPACE_END
1096 } // namespace absl
1097