|
|
@ -41,6 +41,7 @@ |
|
|
|
#include <limits> |
|
|
|
#include <limits> |
|
|
|
|
|
|
|
|
|
|
|
#include <google/protobuf/stubs/stl_util.h> |
|
|
|
#include <google/protobuf/stubs/stl_util.h> |
|
|
|
|
|
|
|
#include <google/protobuf/io/strtod.h> |
|
|
|
|
|
|
|
|
|
|
|
#ifdef _WIN32 |
|
|
|
#ifdef _WIN32 |
|
|
|
// MSVC has only _snprintf, not snprintf.
|
|
|
|
// MSVC has only _snprintf, not snprintf.
|
|
|
@ -1286,7 +1287,7 @@ char* DoubleToBuffer(double value, char* buffer) { |
|
|
|
// of a double. This long double may have extra bits that make it compare
|
|
|
|
// of a double. This long double may have extra bits that make it compare
|
|
|
|
// unequal to "value" even though it would be exactly equal if it were
|
|
|
|
// unequal to "value" even though it would be exactly equal if it were
|
|
|
|
// truncated to a double.
|
|
|
|
// truncated to a double.
|
|
|
|
volatile double parsed_value = strtod(buffer, nullptr); |
|
|
|
volatile double parsed_value = io::NoLocaleStrtod(buffer, nullptr); |
|
|
|
if (parsed_value != value) { |
|
|
|
if (parsed_value != value) { |
|
|
|
int snprintf_result = |
|
|
|
int snprintf_result = |
|
|
|
snprintf(buffer, kDoubleToBufferSize, "%.*g", DBL_DIG+2, value); |
|
|
|
snprintf(buffer, kDoubleToBufferSize, "%.*g", DBL_DIG+2, value); |
|
|
@ -1338,7 +1339,7 @@ bool safe_strtof(const char* str, float* value) { |
|
|
|
char* endptr; |
|
|
|
char* endptr; |
|
|
|
errno = 0; // errno only gets set on errors
|
|
|
|
errno = 0; // errno only gets set on errors
|
|
|
|
#if defined(_WIN32) || defined (__hpux) // has no strtof()
|
|
|
|
#if defined(_WIN32) || defined (__hpux) // has no strtof()
|
|
|
|
*value = strtod(str, &endptr); |
|
|
|
*value = io::NoLocaleStrtod(str, &endptr); |
|
|
|
#else |
|
|
|
#else |
|
|
|
*value = strtof(str, &endptr); |
|
|
|
*value = strtof(str, &endptr); |
|
|
|
#endif |
|
|
|
#endif |
|
|
@ -1347,7 +1348,7 @@ bool safe_strtof(const char* str, float* value) { |
|
|
|
|
|
|
|
|
|
|
|
bool safe_strtod(const char* str, double* value) { |
|
|
|
bool safe_strtod(const char* str, double* value) { |
|
|
|
char* endptr; |
|
|
|
char* endptr; |
|
|
|
*value = strtod(str, &endptr); |
|
|
|
*value = io::NoLocaleStrtod(str, &endptr); |
|
|
|
if (endptr != str) { |
|
|
|
if (endptr != str) { |
|
|
|
while (ascii_isspace(*endptr)) ++endptr; |
|
|
|
while (ascii_isspace(*endptr)) ++endptr; |
|
|
|
} |
|
|
|
} |
|
|
|