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