summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 @@
36#include <time.h> 36#include <time.h>
37 37
38#include <inttypes.h> 38#include <inttypes.h>
39#include <float.h>
39#include <math.h> 40#include <math.h>
40#include <limits.h> 41#include <limits.h>
41 42
@@ -102,46 +103,24 @@ void plist_xml_deinit(void)
102 103
103static size_t dtostr(char *buf, size_t bufsize, double realval) 104static size_t dtostr(char *buf, size_t bufsize, double realval)
104{ 105{
105 double f = realval; 106 size_t len = 0;
106 double ip = 0.0; 107 if (isnan(realval)) {
107 int64_t v; 108 len = snprintf(buf, bufsize, "nan");
108 size_t len; 109 } else if (isinf(realval)) {
109 size_t p; 110 len = snprintf(buf, bufsize, "%cinfinity", (realval > 0.0) ? '+' : '-');
110 double CORR = 0.0000005; 111 } else if (realval == 0.0f) {
111 112 len = snprintf(buf, bufsize, "0.0");
112 f = modf(f, &ip);
113 v = (int64_t)ip;
114 if (f < 0) {
115 if (((int)((f - CORR) * -10.0f)) >= 10) {
116 v--;
117 f = 0;
118 }
119 } else { 113 } else {
120 if (((int)((f + CORR) * 10.0f)) >= 10) { 114 size_t i = 0;
121 v++; 115 len = snprintf(buf, bufsize, "%.*g", 17, realval);
122 f = 0; 116 for (i = 0; i < len; i++) {
117 if (buf[i] == ',') {
118 buf[i] = '.';
119 break;
120 }
123 } 121 }
124 } 122 }
125 len = snprintf(buf, bufsize, "%s%"PRIi64, ((f < 0) && (ip >= 0)) ? "-" : "", v); 123 return len;
126 if (len >= bufsize) {
127 return 0;
128 }
129
130 if (f < 0) {
131 f *= -1;
132 }
133 f += CORR;
134
135 p = len;
136 buf[p++] = '.';
137
138 while (p < bufsize && (p <= len+6)) {
139 f = modf(f*10, &ip);
140 v = (int)ip;
141 buf[p++] = (v + 0x30);
142 }
143 buf[p] = '\0';
144 return p;
145} 124}
146 125
147static void node_to_xml(node_t* node, bytearray_t **outbuf, uint32_t depth) 126static void node_to_xml(node_t* node, bytearray_t **outbuf, uint32_t depth)