| Index: core/src/fxcrt/fx_basic_gcc.cpp
 | 
| diff --git a/core/src/fxcrt/fx_basic_gcc.cpp b/core/src/fxcrt/fx_basic_gcc.cpp
 | 
| index f8b0c7ac78e21e1ee9ca68b6c21559db9619798a..c352ee3f81a3b1ff87ed298aa5d52e060481e232 100644
 | 
| --- a/core/src/fxcrt/fx_basic_gcc.cpp
 | 
| +++ b/core/src/fxcrt/fx_basic_gcc.cpp
 | 
| @@ -5,29 +5,49 @@
 | 
|  // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 | 
|  
 | 
|  #include <limits>
 | 
| +#include <cctype>
 | 
| +#include <cwctype>
 | 
|  
 | 
|  #include "core/include/fxcrt/fx_ext.h"
 | 
|  #include "core/include/fxcrt/fx_string.h"
 | 
|  
 | 
| -template <class T, class STR_T>
 | 
| -T FXSYS_StrToInt(STR_T str) {
 | 
| +template <class T>
 | 
| +T FXSYS_StrToInt(const FX_CHAR* str) {
 | 
|    FX_BOOL neg = FALSE;
 | 
| -  if (str == NULL) {
 | 
| +  if (!str)
 | 
|      return 0;
 | 
| -  }
 | 
| +
 | 
|    if (*str == '-') {
 | 
|      neg = TRUE;
 | 
|      str++;
 | 
|    }
 | 
|    T num = 0;
 | 
| -  while (*str) {
 | 
| -    if ((*str) < '0' || (*str) > '9') {
 | 
| +  while (*str && std::isdigit(*str)) {
 | 
| +    if (num > (std::numeric_limits<T>::max() - 9) / 10)
 | 
|        break;
 | 
| -    }
 | 
| -    if (num > (std::numeric_limits<T>::max() - 9) / 10) {
 | 
| +
 | 
| +    num = num * 10 + FXSYS_toDecimalDigit(*str);
 | 
| +    str++;
 | 
| +  }
 | 
| +  return neg ? -num : num;
 | 
| +}
 | 
| +
 | 
| +template <class T>
 | 
| +T FXSYS_StrToInt(const FX_WCHAR* str) {
 | 
| +  FX_BOOL neg = FALSE;
 | 
| +  if (!str)
 | 
| +    return 0;
 | 
| +
 | 
| +  if (*str == '-') {
 | 
| +    neg = TRUE;
 | 
| +    str++;
 | 
| +  }
 | 
| +  T num = 0;
 | 
| +  while (*str && std::iswdigit(*str)) {
 | 
| +    if (num > (std::numeric_limits<T>::max() - 9) / 10)
 | 
|        break;
 | 
| -    }
 | 
| -    num = num * 10 + (*str) - '0';
 | 
| +
 | 
| +    num = num * 10 + FXSYS_toDecimalDigitWide(*str);
 | 
|      str++;
 | 
|    }
 | 
|    return neg ? -num : num;
 | 
| @@ -71,16 +91,16 @@ STR_T FXSYS_IntToStr(T value, STR_T string, int radix) {
 | 
|  extern "C" {
 | 
|  #endif
 | 
|  int32_t FXSYS_atoi(const FX_CHAR* str) {
 | 
| -  return FXSYS_StrToInt<int32_t, const FX_CHAR*>(str);
 | 
| +  return FXSYS_StrToInt<int32_t>(str);
 | 
|  }
 | 
|  int32_t FXSYS_wtoi(const FX_WCHAR* str) {
 | 
| -  return FXSYS_StrToInt<int32_t, const FX_WCHAR*>(str);
 | 
| +  return FXSYS_StrToInt<int32_t>(str);
 | 
|  }
 | 
|  int64_t FXSYS_atoi64(const FX_CHAR* str) {
 | 
| -  return FXSYS_StrToInt<int64_t, const FX_CHAR*>(str);
 | 
| +  return FXSYS_StrToInt<int64_t>(str);
 | 
|  }
 | 
|  int64_t FXSYS_wtoi64(const FX_WCHAR* str) {
 | 
| -  return FXSYS_StrToInt<int64_t, const FX_WCHAR*>(str);
 | 
| +  return FXSYS_StrToInt<int64_t>(str);
 | 
|  }
 | 
|  const FX_CHAR* FXSYS_i64toa(int64_t value, FX_CHAR* str, int radix) {
 | 
|    return FXSYS_IntToStr<int64_t, uint64_t, FX_CHAR*>(value, str, radix);
 | 
| 
 |