diff options
-rw-r--r-- | src/xplist.c | 53 |
1 files changed, 16 insertions, 37 deletions
diff --git a/src/xplist.c b/src/xplist.c index fc8fd61..0cf4663 100644 --- a/src/xplist.c +++ b/src/xplist.c @@ -36,6 +36,7 @@ #include <time.h> #include <inttypes.h> +#include <float.h> #include <math.h> #include <limits.h> @@ -102,46 +103,24 @@ void plist_xml_deinit(void) static size_t dtostr(char *buf, size_t bufsize, double realval) { - double f = realval; - double ip = 0.0; - int64_t v; - size_t len; - size_t p; - double CORR = 0.0000005; - - f = modf(f, &ip); - v = (int64_t)ip; - if (f < 0) { - if (((int)((f - CORR) * -10.0f)) >= 10) { - v--; - f = 0; - } + size_t len = 0; + if (isnan(realval)) { + len = snprintf(buf, bufsize, "nan"); + } else if (isinf(realval)) { + len = snprintf(buf, bufsize, "%cinfinity", (realval > 0.0) ? '+' : '-'); + } else if (realval == 0.0f) { + len = snprintf(buf, bufsize, "0.0"); } else { - if (((int)((f + CORR) * 10.0f)) >= 10) { - v++; - f = 0; + size_t i = 0; + len = snprintf(buf, bufsize, "%.*g", 17, realval); + for (i = 0; i < len; i++) { + if (buf[i] == ',') { + buf[i] = '.'; + break; + } } } - len = snprintf(buf, bufsize, "%s%"PRIi64, ((f < 0) && (ip >= 0)) ? "-" : "", v); - if (len >= bufsize) { - return 0; - } - - if (f < 0) { - f *= -1; - } - f += CORR; - - p = len; - buf[p++] = '.'; - - while (p < bufsize && (p <= len+6)) { - f = modf(f*10, &ip); - v = (int)ip; - buf[p++] = (v + 0x30); - } - buf[p] = '\0'; - return p; + return len; } static void node_to_xml(node_t* node, bytearray_t **outbuf, uint32_t depth) |