Print bad number values (Inf,NaN) "correctly".

This commit is contained in:
Stephen Dolan committed 2012-09-09 15:35:34 +01:00
1 parent 0dfaebcdcb
commit e6a85737da
1 file changed
+15 -2
+15 -2
View File
@@ -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) { static void jv_dump_term(struct dtoa_context* C, jv x) {
char buf[JVP_DTOA_FMT_MAX_LEN]; char buf[JVP_DTOA_FMT_MAX_LEN];
switch (jv_get_kind(x)) { switch (jv_get_kind(x)) {
case JV_KIND_INVALID:
assert(0 && "Invalid value");
break;
case JV_KIND_NULL: case JV_KIND_NULL:
printf("null"); printf("null");
break; break;
@@ -76,9 +79,19 @@ static void jv_dump_term(struct dtoa_context* C, jv x) {
case JV_KIND_TRUE: case JV_KIND_TRUE:
printf("true"); printf("true");
break; break;
case JV_KIND_NUMBER: case JV_KIND_NUMBER: {
printf("%s", jvp_dtoa_fmt(C, buf, jv_number_value(x))); 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; break;
}
case JV_KIND_STRING: case JV_KIND_STRING:
// FIXME: all sorts of broken // FIXME: all sorts of broken
putchar('"'); putchar('"');