diff options
Diffstat (limited to 'base/string_util.cc')
-rw-r--r-- | base/string_util.cc | 84 |
1 files changed, 57 insertions, 27 deletions
diff --git a/base/string_util.cc b/base/string_util.cc index d84fadb..64c0cdc 100644 --- a/base/string_util.cc +++ b/base/string_util.cc @@ -127,14 +127,25 @@ class StringToLongTraits { } }; -class WStringToLongTraits { +class String16ToLongTraits { public: - typedef std::wstring string_type; + typedef string16 string_type; typedef long value_type; static const int kBase = 10; static inline value_type convert_func(const string_type::value_type* str, string_type::value_type** endptr) { +#if defined(WCHAR_T_IS_UTF16) return wcstol(str, endptr, kBase); +#elif defined(WCHAR_T_IS_UTF32) + std::string ascii_string = UTF16ToASCII(string16(str)); + char* ascii_end = NULL; + value_type ret = strtol(ascii_string.c_str(), &ascii_end, kBase); + if (ascii_string.c_str() + ascii_string.length() == ascii_end) { + *endptr = + const_cast<string_type::value_type*>(str) + ascii_string.length(); + } + return ret; +#endif } static inline bool valid_func(const string_type& str) { return !str.empty() && !iswspace(str[0]); @@ -159,9 +170,9 @@ class StringToInt64Traits { } }; -class WStringToInt64Traits { +class String16ToInt64Traits { public: - typedef std::wstring string_type; + typedef string16 string_type; typedef int64 value_type; static const int kBase = 10; static inline value_type convert_func(const string_type::value_type* str, @@ -169,7 +180,14 @@ class WStringToInt64Traits { #ifdef OS_WIN return _wcstoi64(str, endptr, kBase); #else // assume OS_POSIX - return wcstoll(str, endptr, kBase); + std::string ascii_string = UTF16ToASCII(string16(str)); + char* ascii_end = NULL; + value_type ret = strtoll(ascii_string.c_str(), &ascii_end, kBase); + if (ascii_string.c_str() + ascii_string.length() == ascii_end) { + *endptr = + const_cast<string_type::value_type*>(str) + ascii_string.length(); + } + return ret; #endif } static inline bool valid_func(const string_type& str) { @@ -194,14 +212,25 @@ class HexStringToLongTraits { } }; -class HexWStringToLongTraits { +class HexString16ToLongTraits { public: - typedef std::wstring string_type; + typedef string16 string_type; typedef long value_type; static const int kBase = 16; static inline value_type convert_func(const string_type::value_type* str, string_type::value_type** endptr) { +#if defined(WCHAR_T_IS_UTF16) return wcstoul(str, endptr, kBase); +#elif defined(WCHAR_T_IS_UTF32) + std::string ascii_string = UTF16ToASCII(string16(str)); + char* ascii_end = NULL; + value_type ret = strtoul(ascii_string.c_str(), &ascii_end, kBase); + if (ascii_string.c_str() + ascii_string.length() == ascii_end) { + *endptr = + const_cast<string_type::value_type*>(str) + ascii_string.length(); + } + return ret; +#endif } static inline bool valid_func(const string_type& str) { return !str.empty() && !iswspace(str[0]); @@ -221,22 +250,23 @@ class StringToDoubleTraits { } }; -class WStringToDoubleTraits { +class String16ToDoubleTraits { public: - typedef std::wstring string_type; + typedef string16 string_type; typedef double value_type; static inline value_type convert_func(const string_type::value_type* str, string_type::value_type** endptr) { - // Because dmg_fp::strtod does not like wchar_t, we convert it to ASCII. - // In theory, this should be safe, but it's possible that wide chars + // Because dmg_fp::strtod does not like char16, we convert it to ASCII. + // In theory, this should be safe, but it's possible that 16-bit chars // might get ignored by accident causing something to be parsed when it // shouldn't. - std::string ascii_string = WideToASCII(std::wstring(str)); + std::string ascii_string = UTF16ToASCII(string16(str)); char* ascii_end = NULL; value_type ret = dmg_fp::strtod(ascii_string.c_str(), &ascii_end); if (ascii_string.c_str() + ascii_string.length() == ascii_end) { // Put endptr at end of input string, so it's not recognized as an error. - *endptr = const_cast<string_type::value_type*>(str) + wcslen(str); + *endptr = + const_cast<string_type::value_type*>(str) + ascii_string.length(); } return ret; @@ -1426,18 +1456,18 @@ bool StringToInt(const std::string& input, int* output) { reinterpret_cast<long*>(output)); } -bool StringToInt(const std::wstring& input, int* output) { +bool StringToInt(const string16& input, int* output) { COMPILE_ASSERT(sizeof(int) == sizeof(long), cannot_wcstol_to_int); - return StringToNumber<WStringToLongTraits>(input, - reinterpret_cast<long*>(output)); + return StringToNumber<String16ToLongTraits>(input, + reinterpret_cast<long*>(output)); } bool StringToInt64(const std::string& input, int64* output) { return StringToNumber<StringToInt64Traits>(input, output); } -bool StringToInt64(const std::wstring& input, int64* output) { - return StringToNumber<WStringToInt64Traits>(input, output); +bool StringToInt64(const string16& input, int64* output) { + return StringToNumber<String16ToInt64Traits>(input, output); } bool HexStringToInt(const std::string& input, int* output) { @@ -1446,9 +1476,9 @@ bool HexStringToInt(const std::string& input, int* output) { reinterpret_cast<long*>(output)); } -bool HexStringToInt(const std::wstring& input, int* output) { +bool HexStringToInt(const string16& input, int* output) { COMPILE_ASSERT(sizeof(int) == sizeof(long), cannot_wcstol_to_int); - return StringToNumber<HexWStringToLongTraits>( + return StringToNumber<HexString16ToLongTraits>( input, reinterpret_cast<long*>(output)); } @@ -1490,7 +1520,7 @@ bool HexStringToBytes(const std::string& input, std::vector<uint8>* output) { return HexStringToBytesT(input, output); } -bool HexStringToBytes(const std::wstring& input, std::vector<uint8>* output) { +bool HexStringToBytes(const string16& input, std::vector<uint8>* output) { return HexStringToBytesT(input, output); } @@ -1500,7 +1530,7 @@ int StringToInt(const std::string& value) { return result; } -int StringToInt(const std::wstring& value) { +int StringToInt(const string16& value) { int result; StringToInt(value, &result); return result; @@ -1512,7 +1542,7 @@ int64 StringToInt64(const std::string& value) { return result; } -int64 StringToInt64(const std::wstring& value) { +int64 StringToInt64(const string16& value) { int64 result; StringToInt64(value, &result); return result; @@ -1524,7 +1554,7 @@ int HexStringToInt(const std::string& value) { return result; } -int HexStringToInt(const std::wstring& value) { +int HexStringToInt(const string16& value) { int result; HexStringToInt(value, &result); return result; @@ -1534,8 +1564,8 @@ bool StringToDouble(const std::string& input, double* output) { return StringToNumber<StringToDoubleTraits>(input, output); } -bool StringToDouble(const std::wstring& input, double* output) { - return StringToNumber<WStringToDoubleTraits>(input, output); +bool StringToDouble(const string16& input, double* output) { + return StringToNumber<String16ToDoubleTraits>(input, output); } double StringToDouble(const std::string& value) { @@ -1544,7 +1574,7 @@ double StringToDouble(const std::string& value) { return result; } -double StringToDouble(const std::wstring& value) { +double StringToDouble(const string16& value) { double result; StringToDouble(value, &result); return result; |