summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Dolan <mu@netsoc.tcd.ie>2012-09-09 15:35:34 +0100
committerStephen Dolan <mu@netsoc.tcd.ie>2012-09-09 15:35:34 +0100
commite6a85737daaefd0066b684ff6fd3d3c5a60b0ac0 (patch)
tree143dea0a1e1b7c9629d409d79b70e85a0f0cf287
parent0dfaebcdcb419a67c7de893dbee5c10c2d6ced29 (diff)
Print bad number values (Inf,NaN) "correctly".
-rw-r--r--c/jv_print.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/c/jv_print.c b/c/jv_print.c
index c9808ea7..c2f7f58d 100644
--- a/c/jv_print.c
+++ b/c/jv_print.c
@@ -67,6 +67,9 @@ static void jv_dump_string(jv str, int ascii_only) {
static void jv_dump_term(struct dtoa_context* C, jv x) {
char buf[JVP_DTOA_FMT_MAX_LEN];
switch (jv_get_kind(x)) {
+ case JV_KIND_INVALID:
+ assert(0 && "Invalid value");
+ break;
case JV_KIND_NULL:
printf("null");
break;
@@ -76,9 +79,19 @@ static void jv_dump_term(struct dtoa_context* C, jv x) {
case JV_KIND_TRUE:
printf("true");
break;
- case JV_KIND_NUMBER:
- printf("%s", jvp_dtoa_fmt(C, buf, jv_number_value(x)));
+ case JV_KIND_NUMBER: {
+ double d = jv_number_value(x);
+ if (d != d) {
+ // JSON doesn't have NaN, so we'll render it as "null"
+ printf("null");
+ } else {
+ // Normalise infinities to something we can print in valid JSON
+ if (d > DBL_MAX) d = DBL_MAX;
+ if (d < -DBL_MAX) d = -DBL_MAX;
+ printf("%s", jvp_dtoa_fmt(C, buf, d));
+ }
break;
+ }
case JV_KIND_STRING:
// FIXME: all sorts of broken
putchar('"');