diff options
author | Stephen Dolan <mu@netsoc.tcd.ie> | 2012-09-09 15:35:34 +0100 |
---|---|---|
committer | Stephen Dolan <mu@netsoc.tcd.ie> | 2012-09-09 15:35:34 +0100 |
commit | e6a85737daaefd0066b684ff6fd3d3c5a60b0ac0 (patch) | |
tree | 143dea0a1e1b7c9629d409d79b70e85a0f0cf287 | |
parent | 0dfaebcdcb419a67c7de893dbee5c10c2d6ced29 (diff) |
Print bad number values (Inf,NaN) "correctly".
-rw-r--r-- | c/jv_print.c | 17 |
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('"'); |