summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2019-01-21 01:03:44 +0100
committerGravatar Nikias Bassen2019-01-21 01:11:06 +0100
commit5f8ca6e30334b81bd39a67f87a011cee8f282c3c (patch)
tree9ebaa5e3f37a43da60da335b5b7972446301c4b0
parente1f852150d5d3794f32c0ee0fc8314dcb7d2f499 (diff)
downloadlibplist-5f8ca6e30334b81bd39a67f87a011cee8f282c3c.tar.gz
libplist-5f8ca6e30334b81bd39a67f87a011cee8f282c3c.tar.bz2
xplist: Fix dtostr() inserting ':' to output string when fractional part overflows
-rw-r--r--src/xplist.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/xplist.c b/src/xplist.c
index c89b143..fc8fd61 100644
--- a/src/xplist.c
+++ b/src/xplist.c
@@ -107,9 +107,22 @@ static size_t dtostr(char *buf, size_t bufsize, double realval)
107 int64_t v; 107 int64_t v;
108 size_t len; 108 size_t len;
109 size_t p; 109 size_t p;
110 double CORR = 0.0000005;
110 111
111 f = modf(f, &ip); 112 f = modf(f, &ip);
112 len = snprintf(buf, bufsize, "%s%"PRIi64, ((f < 0) && (ip >= 0)) ? "-" : "", (int64_t)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 {
120 if (((int)((f + CORR) * 10.0f)) >= 10) {
121 v++;
122 f = 0;
123 }
124 }
125 len = snprintf(buf, bufsize, "%s%"PRIi64, ((f < 0) && (ip >= 0)) ? "-" : "", v);
113 if (len >= bufsize) { 126 if (len >= bufsize) {
114 return 0; 127 return 0;
115 } 128 }
@@ -117,7 +130,7 @@ static size_t dtostr(char *buf, size_t bufsize, double realval)
117 if (f < 0) { 130 if (f < 0) {
118 f *= -1; 131 f *= -1;
119 } 132 }
120 f += 0.0000004; 133 f += CORR;
121 134
122 p = len; 135 p = len;
123 buf[p++] = '.'; 136 buf[p++] = '.';