Index: base/string_util.cc |
diff --git a/base/string_util.cc b/base/string_util.cc |
index 4cc67d78a4de841bad819b0fe85540e7059c9cf0..b77a7fea42483342f17cc1a4dd08562c82981c39 100644 |
--- a/base/string_util.cc |
+++ b/base/string_util.cc |
@@ -89,14 +89,13 @@ static bool CompareParameter(const ReplacementOffset& elem1, |
// should check for leading whitespace. |
template<typename StringToNumberTraits> |
bool StringToNumber(const typename StringToNumberTraits::string_type& input, |
- typename StringToNumberTraits::value_type* output, |
- base::LocaleDependence locale_dependent) { |
+ typename StringToNumberTraits::value_type* output) { |
typedef StringToNumberTraits traits; |
errno = 0; // Thread-safe? It is on at least Mac, Linux, and Windows. |
typename traits::string_type::value_type* endptr = NULL; |
typename traits::value_type value = traits::convert_func(input.c_str(), |
- &endptr, locale_dependent == base::LOCALE_DEPENDENT); |
+ &endptr); |
*output = value; |
// Cases to return false: |
@@ -120,8 +119,7 @@ class StringToLongTraits { |
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, |
- bool locale_dependent) { |
+ string_type::value_type** endptr) { |
return strtol(str, endptr, kBase); |
} |
static inline bool valid_func(const string_type& str) { |
@@ -135,8 +133,7 @@ class WStringToLongTraits { |
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, |
- bool locale_dependent) { |
+ string_type::value_type** endptr) { |
return wcstol(str, endptr, kBase); |
} |
static inline bool valid_func(const string_type& str) { |
@@ -150,8 +147,7 @@ class StringToInt64Traits { |
typedef int64 value_type; |
static const int kBase = 10; |
static inline value_type convert_func(const string_type::value_type* str, |
- string_type::value_type** endptr, |
- bool locale_dependent) { |
+ string_type::value_type** endptr) { |
#ifdef OS_WIN |
return _strtoi64(str, endptr, kBase); |
#else // assume OS_POSIX |
@@ -169,8 +165,7 @@ class WStringToInt64Traits { |
typedef int64 value_type; |
static const int kBase = 10; |
static inline value_type convert_func(const string_type::value_type* str, |
- string_type::value_type** endptr, |
- bool locale_dependent) { |
+ string_type::value_type** endptr) { |
#ifdef OS_WIN |
return _wcstoi64(str, endptr, kBase); |
#else // assume OS_POSIX |
@@ -191,8 +186,7 @@ class HexStringToLongTraits { |
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, |
- bool locale_dependent) { |
+ string_type::value_type** endptr) { |
return strtoul(str, endptr, kBase); |
} |
static inline bool valid_func(const string_type& str) { |
@@ -206,8 +200,7 @@ class HexWStringToLongTraits { |
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, |
- bool locale_dependent) { |
+ string_type::value_type** endptr) { |
return wcstoul(str, endptr, kBase); |
} |
static inline bool valid_func(const string_type& str) { |
@@ -220,13 +213,8 @@ class StringToDoubleTraits { |
typedef std::string string_type; |
typedef double value_type; |
static inline value_type convert_func(const string_type::value_type* str, |
- string_type::value_type** endptr, |
- bool locale_dependent) { |
- if (locale_dependent) { |
- return strtod(str, endptr); |
- } else { |
- return dmg_fp::strtod(str, endptr); |
- } |
+ string_type::value_type** endptr) { |
+ return dmg_fp::strtod(str, endptr); |
} |
static inline bool valid_func(const string_type& str) { |
return !str.empty() && !isspace(str[0]); |
@@ -238,25 +226,20 @@ class WStringToDoubleTraits { |
typedef std::wstring string_type; |
typedef double value_type; |
static inline value_type convert_func(const string_type::value_type* str, |
- string_type::value_type** endptr, |
- bool locale_dependent) { |
- if (locale_dependent) { |
- return wcstod(str, endptr); |
- } else { |
- // 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 |
- // might get ignored by accident causing something to be parsed when it |
- // shouldn't. |
- std::string ascii_string = WideToASCII(std::wstring(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); |
- } |
- |
- return ret; |
+ 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 |
+ // might get ignored by accident causing something to be parsed when it |
+ // shouldn't. |
+ std::string ascii_string = WideToASCII(std::wstring(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); |
} |
+ |
+ return ret; |
} |
static inline bool valid_func(const string_type& str) { |
return !str.empty() && !iswspace(str[0]); |
@@ -305,45 +288,6 @@ bool IsWprintfFormatPortable(const wchar_t* format) { |
return true; |
} |
-std::string DoubleToString(double value, LocaleDependence locale_dependent) { |
- if (LOCALE_DEPENDENT == locale_dependent) { |
- return StringPrintf("%g", value); |
- } else { |
- char buffer[32]; |
- dmg_fp::g_fmt(buffer, value); |
- return std::string(buffer); |
- } |
-} |
- |
-std::wstring DoubleToWString(double value, LocaleDependence locale_dependent) { |
- return ASCIIToWide(DoubleToString(value, locale_dependent)); |
-} |
- |
-bool StringToDouble(const std::string& input, double* output, |
- LocaleDependence locale_dependent) { |
- return StringToNumber<StringToDoubleTraits>(input, output, |
- locale_dependent); |
-} |
- |
-bool StringToDouble(const std::wstring& input, double* output, |
- LocaleDependence locale_dependent) { |
- return StringToNumber<WStringToDoubleTraits>(input, output, |
- locale_dependent); |
-} |
- |
-double StringToDouble(const std::string& value, |
- LocaleDependence locale_dependent) { |
- double result; |
- StringToDouble(value, &result, locale_dependent); |
- return result; |
-} |
- |
-double StringToDouble(const std::wstring& value, |
- LocaleDependence locale_dependent) { |
- double result; |
- StringToDouble(value, &result, locale_dependent); |
- return result; |
-} |
} // namespace base |
@@ -1054,6 +998,17 @@ std::wstring Uint64ToWString(uint64 value) { |
IntToString(value); |
} |
+std::string DoubleToString(double value) { |
+ // According to g_fmt.cc, it is sufficient to declare a buffer of size 32. |
+ char buffer[32]; |
+ dmg_fp::g_fmt(buffer, value); |
+ return std::string(buffer); |
+} |
+ |
+std::wstring DoubleToWString(double value) { |
+ return ASCIIToWide(DoubleToString(value)); |
+} |
+ |
inline void StringAppendV(std::string* dst, const char* format, va_list ap) { |
StringAppendVT<char>(dst, format, ap); |
} |
@@ -1064,22 +1019,6 @@ inline void StringAppendV(std::wstring* dst, |
StringAppendVT<wchar_t>(dst, format, ap); |
} |
-bool StringToDouble(const std::string& input, double* output) { |
- return StringToDouble(input, output, base::LOCALE_DEPENDENT); |
-} |
- |
-bool StringToDouble(const std::wstring& input, double* output) { |
- return StringToDouble(input, output, base::LOCALE_DEPENDENT); |
-} |
- |
-double StringToDouble(const std::string& value) { |
- return StringToDouble(value, base::LOCALE_DEPENDENT); |
-} |
- |
-double StringToDouble(const std::wstring& value) { |
- return StringToDouble(value, base::LOCALE_DEPENDENT); |
-} |
- |
std::string StringPrintf(const char* format, ...) { |
va_list ap; |
va_start(ap, format); |
@@ -1419,36 +1358,33 @@ bool MatchPattern(const std::string& eval, const std::string& pattern) { |
bool StringToInt(const std::string& input, int* output) { |
COMPILE_ASSERT(sizeof(int) == sizeof(long), cannot_strtol_to_int); |
return StringToNumber<StringToLongTraits>(input, |
- reinterpret_cast<long*>(output), |
- base::LOCALE_DEPENDENT); |
+ reinterpret_cast<long*>(output)); |
} |
bool StringToInt(const std::wstring& input, int* output) { |
COMPILE_ASSERT(sizeof(int) == sizeof(long), cannot_wcstol_to_int); |
return StringToNumber<WStringToLongTraits>(input, |
- reinterpret_cast<long*>(output), |
- base::LOCALE_DEPENDENT); |
+ reinterpret_cast<long*>(output)); |
} |
bool StringToInt64(const std::string& input, int64* output) { |
- return StringToNumber<StringToInt64Traits>(input, output, base::LOCALE_DEPENDENT); |
+ return StringToNumber<StringToInt64Traits>(input, output); |
} |
bool StringToInt64(const std::wstring& input, int64* output) { |
- return StringToNumber<WStringToInt64Traits>(input, output, base::LOCALE_DEPENDENT); |
+ return StringToNumber<WStringToInt64Traits>(input, output); |
} |
bool HexStringToInt(const std::string& input, int* output) { |
COMPILE_ASSERT(sizeof(int) == sizeof(long), cannot_strtol_to_int); |
return StringToNumber<HexStringToLongTraits>(input, |
- reinterpret_cast<long*>(output), |
- base::LOCALE_DEPENDENT); |
+ reinterpret_cast<long*>(output)); |
} |
bool HexStringToInt(const std::wstring& input, int* output) { |
COMPILE_ASSERT(sizeof(int) == sizeof(long), cannot_wcstol_to_int); |
return StringToNumber<HexWStringToLongTraits>( |
- input, reinterpret_cast<long*>(output), base::LOCALE_DEPENDENT); |
+ input, reinterpret_cast<long*>(output)); |
} |
int StringToInt(const std::string& value) { |
@@ -1487,6 +1423,26 @@ int HexStringToInt(const std::wstring& value) { |
return result; |
} |
+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); |
+} |
+ |
+double StringToDouble(const std::string& value) { |
+ double result; |
+ StringToDouble(value, &result); |
+ return result; |
+} |
+ |
+double StringToDouble(const std::wstring& value) { |
+ double result; |
+ StringToDouble(value, &result); |
+ return result; |
+} |
+ |
// The following code is compatible with the OpenBSD lcpy interface. See: |
// http://www.gratisoft.us/todd/papers/strlcpy.html |
// ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/{wcs,str}lcpy.c |