From c90c662f85ca1a36794a0404b2101a72de020ca3 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Thu, 15 Apr 2021 18:34:17 -0400 Subject: Use exess for reading and writing numeric and binary literals --- src/string.c | 67 +++++++----------------------------------------------------- 1 file changed, 7 insertions(+), 60 deletions(-) (limited to 'src/string.c') diff --git a/src/string.c b/src/string.c index 3a750c4f..c5b1d6f7 100644 --- a/src/string.c +++ b/src/string.c @@ -16,6 +16,7 @@ #include "string_utils.h" +#include "exess/exess.h" #include "serd/serd.h" #include @@ -105,68 +106,14 @@ serd_strlen(const char* const str, SerdNodeFlags* const flags) return strlen(str); } -static double -read_sign(const char** const sptr) -{ - double sign = 1.0; - - switch (**sptr) { - case '-': - sign = -1.0; - ++(*sptr); - break; - case '+': - ++(*sptr); - break; - default: - break; - } - - return sign; -} - double -serd_strtod(const char* const str, char** const endptr) +serd_strtod(const char* const str, const char** const end) { - double result = 0.0; - - // Point s at the first non-whitespace character - const char* s = str; - while (is_space(*s)) { - ++s; - } - - // Read leading sign if necessary - const double sign = read_sign(&s); - - // Parse integer part - for (; is_digit(*s); ++s) { - result = (result * 10.0) + (*s - '0'); - } - - // Parse fractional part - if (*s == '.') { - double denom = 10.0; - for (++s; is_digit(*s); ++s) { - result += (*s - '0') / denom; - denom *= 10.0; - } - } - - // Parse exponent - if (*s == 'e' || *s == 'E') { - ++s; - double expt = 0.0; - double expt_sign = read_sign(&s); - for (; is_digit(*s); ++s) { - expt = (expt * 10.0) + (*s - '0'); - } - result *= pow(10, expt * expt_sign); - } - - if (endptr) { - *endptr = (char*)s; + double value = (double)NAN; + const ExessResult r = exess_read_double(&value, str); + if (end) { + *end = str + r.count; } - return result * sign; + return r.status ? (double)NAN : value; } -- cgit v1.2.1