From 90f5f084f6273c04a0a0c06d3877ac84af87f372 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 23 Jan 2014 17:30:23 +0100 Subject: [PATCH] libstl: use strtof() if available (in stla_read.c) strtof() is faster than strtod(), see: http://www.gnu.org/software/libc/manual/html_node/Parsing-of-Floats.html "(...) strtof can be substantially faster than strtod, but has less precision" strtof() was added in C99 so BUILD_STRICT_C90 must be disabled to have any chance to use it (MSVC does not provide strtof(), GCC does). --- src/libstl/stla_read.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/libstl/stla_read.c b/src/libstl/stla_read.c index a1d58ed..6dbb2a1 100644 --- a/src/libstl/stla_read.c +++ b/src/libstl/stla_read.c @@ -219,10 +219,15 @@ static int eat_string(foug_stream_fwd_iterator_t* it, foug_string_buffer_t* str_ static int get_real32(const char* str, foug_real32_t* value_ptr) { - char* conv_end_ptr; /* for strtod() */ + char* end_ptr; /* for strtod() */ - *value_ptr = (foug_real32_t)strtod(str, &conv_end_ptr); - if (conv_end_ptr == str || errno == ERANGE) +#ifdef FOUG_HAVE_STRTOF_FUNC + *value_ptr = strtof(str, &end_ptr); /* Requires C99 */ +#else + *value_ptr = (foug_real32_t)strtod(str, &end_ptr); +#endif + + if (end_ptr == str || errno == ERANGE) return -1; return 0;