summaryrefslogtreecommitdiffstats
path: root/src/xplist.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xplist.c')
-rw-r--r--src/xplist.c53
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)