ref: 5355ad5a63bd77ed01b2e131fd88ef9a24dc023f
parent: bd6714c9841a2deceed19c2e1f656093d86d00af
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Tue Jan 9 12:50:57 EST 2024
Refactor float conversion.
--- a/src/runtime/eval.c
+++ b/src/runtime/eval.c
@@ -1354,11 +1354,13 @@
return (bits[i / BITS_PER_WORD] & (1ULL << (i % BITS_PER_WORD))) != 0;
}
+size_t strNodes(size_t len);
+NODEPTR mkStringC(const char *str);
+
#if WANT_STDIO
void
-putdblb(flt_t x, BFILE *p)
+convdbl(char *str, flt_t x)
{- char str[30];
/* Using 16 decimals will lose some precision.
* 17 would keep the precision, but it frequently looks very ugly.
*/
@@ -1368,6 +1370,23 @@
/* XXX wrong for inf and NaN */
strcat(str, ".0");
}
+}
+
+NODEPTR
+dblToString(flt_t x)
+{+ char str[30];
+ convdbl(str, x);
+ // turn it into a mhs string
+ GCCHECK(strNodes(strlen(str)));
+ return mkStringC(str);
+}
+
+void
+putdblb(flt_t x, BFILE *p)
+{+ char str[30];
+ convdbl(str, x);
putsb(str, p);
}
@@ -2115,38 +2134,16 @@
xd = strtof(msg, NULL);
#endif
FREE(msg);
-
POP(1);
n = TOP(-1);
-
GOIND(mkFlt(xd));
case T_FSHOW:
- // check that the double exists
CHECK(1);
- // evaluate it
xd = evaldbl(ARG(TOP(0)));
- // turn it into a string
- char str[30];
- /* Using 16 decimals will lose some precision.
- * 17 would keep the precision, but it frequently looks very ugly.
- */
- (void)snprintf(str, 25, "%.16g", xd);
- if (!strchr(str, '.') && !strchr(str, 'e') && !strchr(str, 'E')) {- /* There is no decimal point and no exponent, so add a decimal point */
- /* XXX wrong for inf and NaN */
- strcat(str, ".0");
- }
-
- // turn it into a mhs string
- GCCHECK(strNodes(strlen(str)));
- NODEPTR s = mkStringC(str);
-
- // remove the double from the stack
POP(1);
n = TOP(-1);
- // update n to be s
- GOIND(s);
+ GOIND(dblToString(xd));
#endif /* WANT_FLOAT */
/* Retag a word sized value, keeping the value bits */
@@ -2663,7 +2660,7 @@
int inrts;
#if WANT_STDIO
char *outname = 0;
- size_t file_size;
+ size_t file_size = 0;
#endif
int dump_ticks = 0;
--
⑨