From 3284cc2f1b9508ae4708c4e95e7b92c836682b79 Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Sun, 29 Aug 2010 15:15:21 +0000 Subject: XPath: Number to string conversion uses ecvt_s under MSVC8+ (major speedup), minor conversion refactoring git-svn-id: http://pugixml.googlecode.com/svn/trunk@649 99668b35-9821-0410-8761-19e4c4f06640 --- src/pugixpath.cpp | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/pugixpath.cpp b/src/pugixpath.cpp index a30ec55..e866c4f 100644 --- a/src/pugixpath.cpp +++ b/src/pugixpath.cpp @@ -337,11 +337,35 @@ namespace return (value != 0 && !is_nan(value)); } + void truncate_zeros(char* begin, char* end) + { + while (begin != end && end[-1] == '0') end--; + + *end = 0; + } + // gets mantissa digits in the form of 0.xxxxx with 0. implied and the exponent - void convert_number_to_mantissa_exponent(double value, char* buffer, char** out_mantissa, int* out_exponent) +#if defined(_MSC_VER) && _MSC_VER >= 1400 + void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent) + { + // get base values + int sign, exponent; + _ecvt_s(buffer, buffer_size, value, DBL_DIG + 1, &exponent, &sign); + + // truncate redundant zeros + truncate_zeros(buffer, buffer + strlen(buffer)); + + // fill results + *out_mantissa = buffer; + *out_exponent = exponent; + } +#else + void convert_number_to_mantissa_exponent(double value, char* buffer, size_t buffer_size, char** out_mantissa, int* out_exponent) { // get a scientific notation value with IEEE DBL_DIG decimals - sprintf(buffer, "%.15e", value); + sprintf(buffer, "%.*e", DBL_DIG, value); + assert(strlen(buffer) < buffer_size); + (void)!buffer_size; // get the exponent (possibly negative) char* exponent_string = strchr(buffer, 'e'); @@ -359,16 +383,13 @@ namespace exponent++; // remove extra mantissa digits and zero-terminate mantissa - char* mantissa_end = exponent_string; - - while (mantissa != mantissa_end && *(mantissa_end - 1) == '0') --mantissa_end; - - *mantissa_end = 0; + truncate_zeros(mantissa, exponent_string); // fill results *out_mantissa = mantissa; *out_exponent = exponent; } +#endif string_t convert_number_to_string(double value) { @@ -381,7 +402,7 @@ namespace char* mantissa; int exponent; - convert_number_to_mantissa_exponent(value, mantissa_buffer, &mantissa, &exponent); + convert_number_to_mantissa_exponent(value, mantissa_buffer, sizeof(mantissa_buffer), &mantissa, &exponent); // make the number! char_t result[512]; -- cgit v1.2.3