| 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 bf3d61524ec832d824b899bf16310660d702b464..6f17482156be7436f0e53e55243b2e1a63548202 100644
|
| --- a/core/src/fxcrt/fx_basic_gcc.cpp
|
| +++ b/core/src/fxcrt/fx_basic_gcc.cpp
|
| @@ -32,30 +32,41 @@ T FXSYS_StrToInt(STR_T str) {
|
| }
|
| return neg ? -num : num;
|
| }
|
| -template <typename T, typename STR_T>
|
| +
|
| +template <typename T, typename UT, typename STR_T>
|
| STR_T FXSYS_IntToStr(T value, STR_T string, int radix) {
|
| - int i = 0;
|
| - if (value < 0) {
|
| - string[i++] = '-';
|
| - value = -value;
|
| - } else if (value == 0) {
|
| + if (radix < 2 || radix > 16) {
|
| + string[0] = 0;
|
| + return string;
|
| + }
|
| + if (value == 0) {
|
| string[0] = '0';
|
| string[1] = 0;
|
| return string;
|
| }
|
| + int i = 0;
|
| + UT uvalue;
|
| + if (value < 0) {
|
| + string[i++] = '-';
|
| + // Standard trick to avoid undefined behaviour when negating INT_MIN.
|
| + uvalue = static_cast<UT>(-(value + 1)) + 1;
|
| + } else {
|
| + uvalue = value;
|
| + }
|
| int digits = 1;
|
| - T order = value / 10;
|
| + T order = uvalue / radix;
|
| while (order > 0) {
|
| digits++;
|
| - order = order / 10;
|
| + order = order / radix;
|
| }
|
| for (int d = digits - 1; d > -1; d--) {
|
| - string[d + i] = "0123456789abcdef"[value % 10];
|
| - value /= 10;
|
| + string[d + i] = "0123456789abcdef"[uvalue % radix];
|
| + uvalue /= radix;
|
| }
|
| string[digits + i] = 0;
|
| return string;
|
| }
|
| +
|
| #ifdef __cplusplus
|
| extern "C" {
|
| #endif
|
| @@ -72,10 +83,7 @@ int64_t FXSYS_wtoi64(const FX_WCHAR* str) {
|
| return FXSYS_StrToInt<int64_t, const FX_WCHAR*>(str);
|
| }
|
| const FX_CHAR* FXSYS_i64toa(int64_t value, FX_CHAR* str, int radix) {
|
| - return FXSYS_IntToStr<int64_t, FX_CHAR*>(value, str, radix);
|
| -}
|
| -const FX_WCHAR* FXSYS_i64tow(int64_t value, FX_WCHAR* str, int radix) {
|
| - return FXSYS_IntToStr<int64_t, FX_WCHAR*>(value, str, radix);
|
| + return FXSYS_IntToStr<int64_t, uint64_t, FX_CHAR*>(value, str, radix);
|
| }
|
| #ifdef __cplusplus
|
| }
|
| @@ -182,7 +190,7 @@ int FXSYS_wcsicmp(const FX_WCHAR* dst, const FX_WCHAR* src) {
|
| return (f - l);
|
| }
|
| char* FXSYS_itoa(int value, char* string, int radix) {
|
| - return FXSYS_IntToStr<int32_t, FX_CHAR*>(value, string, radix);
|
| + return FXSYS_IntToStr<int32_t, uint32_t, FX_CHAR*>(value, string, radix);
|
| }
|
| #ifdef __cplusplus
|
| }
|
|
|