Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include <cctype> | 7 #include <cctype> |
| 8 #include <cwctype> | 8 #include <cwctype> |
| 9 #include <limits> | 9 #include <limits> |
| 10 | 10 |
| 11 #include "core/include/fxcrt/fx_ext.h" | 11 #include "core/include/fxcrt/fx_ext.h" |
| 12 #include "core/include/fxcrt/fx_string.h" | 12 #include "core/include/fxcrt/fx_string.h" |
| 13 | 13 |
| 14 template <class T> | 14 template <typename IntType, typename CharType> |
| 15 T FXSYS_StrToInt(const FX_CHAR* str) { | 15 IntType FXSYS_StrToInt(const CharType* str) { |
| 16 bool neg = false; | 16 bool neg = false; |
|
Tom Sepez
2016/03/03 19:26:47
nit: move to line 20. maybe
bool neg = std::numeri
dsinclair
2016/03/03 20:06:50
Done.
| |
| 17 if (!str) | 17 if (!str) |
| 18 return 0; | 18 return 0; |
| 19 | 19 |
| 20 if (std::numeric_limits<T>::is_signed && *str == '-') { | 20 if (std::numeric_limits<IntType>::is_signed && *str == '-') { |
| 21 neg = true; | 21 neg = true; |
| 22 str++; | 22 str++; |
| 23 } | 23 } |
| 24 T num = 0; | 24 |
| 25 while (*str && std::isdigit(*str)) { | 25 IntType num = 0; |
| 26 T val = FXSYS_toDecimalDigit(*str); | 26 while (*str && FXSYS_isDecimalDigit(*str)) { |
| 27 if (num > (std::numeric_limits<T>::max() - val) / 10) | 27 IntType val = FXSYS_toDecimalDigit(*str); |
| 28 if (num > (std::numeric_limits<IntType>::max() - val) / 10) | |
| 28 break; | 29 break; |
| 29 | 30 |
| 30 num = num * 10 + val; | 31 num = num * 10 + val; |
| 31 str++; | |
| 32 } | |
| 33 return neg ? -num : num; | |
| 34 } | |
| 35 | |
| 36 template <class T> | |
| 37 T FXSYS_StrToInt(const FX_WCHAR* str) { | |
| 38 bool neg = false; | |
| 39 if (!str) | |
| 40 return 0; | |
| 41 | |
| 42 if (std::numeric_limits<T>::is_signed && *str == '-') { | |
| 43 neg = true; | |
| 44 str++; | |
| 45 } | |
| 46 T num = 0; | |
| 47 while (*str && std::iswdigit(*str)) { | |
| 48 T val = FXSYS_toDecimalDigitWide(*str); | |
| 49 if (num > (std::numeric_limits<T>::max() - val) / 10) | |
| 50 break; | |
| 51 | |
| 52 num = num * 10 + val; | |
| 53 str++; | 32 str++; |
| 54 } | 33 } |
| 55 return neg ? -num : num; | 34 return neg ? -num : num; |
| 56 } | 35 } |
| 57 | 36 |
| 58 template <typename T, typename UT, typename STR_T> | 37 template <typename T, typename UT, typename STR_T> |
| 59 STR_T FXSYS_IntToStr(T value, STR_T string, int radix) { | 38 STR_T FXSYS_IntToStr(T value, STR_T string, int radix) { |
| 60 if (radix < 2 || radix > 16) { | 39 if (radix < 2 || radix > 16) { |
| 61 string[0] = 0; | 40 string[0] = 0; |
| 62 return string; | 41 return string; |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 86 uvalue /= radix; | 65 uvalue /= radix; |
| 87 } | 66 } |
| 88 string[digits + i] = 0; | 67 string[digits + i] = 0; |
| 89 return string; | 68 return string; |
| 90 } | 69 } |
| 91 | 70 |
| 92 #ifdef __cplusplus | 71 #ifdef __cplusplus |
| 93 extern "C" { | 72 extern "C" { |
| 94 #endif | 73 #endif |
| 95 int32_t FXSYS_atoi(const FX_CHAR* str) { | 74 int32_t FXSYS_atoi(const FX_CHAR* str) { |
| 96 return FXSYS_StrToInt<int32_t>(str); | 75 return FXSYS_StrToInt<int32_t, FX_CHAR>(str); |
| 97 } | 76 } |
| 98 uint32_t FXSYS_atoui(const FX_CHAR* str) { | 77 uint32_t FXSYS_atoui(const FX_CHAR* str) { |
| 99 return FXSYS_StrToInt<uint32_t>(str); | 78 return FXSYS_StrToInt<uint32_t>(str); |
| 100 } | 79 } |
| 101 int32_t FXSYS_wtoi(const FX_WCHAR* str) { | 80 int32_t FXSYS_wtoi(const FX_WCHAR* str) { |
| 102 return FXSYS_StrToInt<int32_t>(str); | 81 return FXSYS_StrToInt<int32_t, FX_WCHAR>(str); |
| 103 } | 82 } |
| 104 int64_t FXSYS_atoi64(const FX_CHAR* str) { | 83 int64_t FXSYS_atoi64(const FX_CHAR* str) { |
| 105 return FXSYS_StrToInt<int64_t>(str); | 84 return FXSYS_StrToInt<int64_t, FX_CHAR>(str); |
| 106 } | 85 } |
| 107 int64_t FXSYS_wtoi64(const FX_WCHAR* str) { | 86 int64_t FXSYS_wtoi64(const FX_WCHAR* str) { |
| 108 return FXSYS_StrToInt<int64_t>(str); | 87 return FXSYS_StrToInt<int64_t, FX_WCHAR>(str); |
| 109 } | 88 } |
| 110 const FX_CHAR* FXSYS_i64toa(int64_t value, FX_CHAR* str, int radix) { | 89 const FX_CHAR* FXSYS_i64toa(int64_t value, FX_CHAR* str, int radix) { |
| 111 return FXSYS_IntToStr<int64_t, uint64_t, FX_CHAR*>(value, str, radix); | 90 return FXSYS_IntToStr<int64_t, uint64_t, FX_CHAR*>(value, str, radix); |
| 112 } | 91 } |
| 113 #ifdef __cplusplus | 92 #ifdef __cplusplus |
| 114 } | 93 } |
| 115 #endif | 94 #endif |
| 116 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | 95 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| 117 #ifdef __cplusplus | 96 #ifdef __cplusplus |
| 118 extern "C" { | 97 extern "C" { |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 256 buf[wlen] = bstr[i]; | 235 buf[wlen] = bstr[i]; |
| 257 } | 236 } |
| 258 wlen++; | 237 wlen++; |
| 259 } | 238 } |
| 260 return wlen; | 239 return wlen; |
| 261 } | 240 } |
| 262 #ifdef __cplusplus | 241 #ifdef __cplusplus |
| 263 } | 242 } |
| 264 #endif | 243 #endif |
| 265 #endif | 244 #endif |
| OLD | NEW |