diff options
author | David Robillard <d@drobilla.net> | 2019-12-18 20:05:18 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2019-12-19 08:43:27 -0500 |
commit | 4693e2d0f4b6b218e059dbcf3fb0f49baaa072eb (patch) | |
tree | b2105140e6fa9a581b5dc20a63c8e6e3891e606b /src | |
parent | 28de6689533914888093d32d3075f58e6f32a4a1 (diff) | |
download | serd-4693e2d0f4b6b218e059dbcf3fb0f49baaa072eb.tar.gz serd-4693e2d0f4b6b218e059dbcf3fb0f49baaa072eb.tar.bz2 serd-4693e2d0f4b6b218e059dbcf3fb0f49baaa072eb.zip |
Add support for parsing NaN, INF, and -INF
Diffstat (limited to 'src')
-rw-r--r-- | src/string.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/string.c b/src/string.c index 7229d6b2..d5899751 100644 --- a/src/string.c +++ b/src/string.c @@ -105,6 +105,19 @@ serd_strtod(const char* str, size_t* end) { double result = 0.0; +#define SET_END(index) if (end) { *end = index; } + + if (!strcmp(str, "NaN")) { + SET_END(3); + return NAN; + } else if (!strcmp(str, "-INF")) { + SET_END(4); + return -INFINITY; + } else if (!strcmp(str, "INF")) { + SET_END(3); + return INFINITY; + } + // Point s at the first non-whitespace character const char* s = str; while (is_space(*s)) { ++s; } @@ -137,10 +150,7 @@ serd_strtod(const char* str, size_t* end) result *= pow(10, expt * expt_sign); } - if (end) { - *end = s - str; - } - + SET_END(s - str); return result * sign; } |