diff --git a/cJSON.c b/cJSON.c index 191dc33..5eced55 100644 --- a/cJSON.c +++ b/cJSON.c @@ -270,35 +270,78 @@ static int update(printbuffer *p) } /* Render the number nicely from the given item into a string. */ -static char *print_number(cJSON *item,printbuffer *p) +static char *print_number(cJSON *item, printbuffer *p) { - char *str=0; - double d=item->valuedouble; - if (d==0) - { - if (p) str=ensure(p,2); - else str=(char*)cJSON_malloc(2); /* special case for 0. */ - if (str) strcpy(str,"0"); - } - else if (fabs(((double)item->valueint)-d)<=DBL_EPSILON && d<=INT_MAX && d>=INT_MIN) - { - if (p) str=ensure(p,21); - else str=(char*)cJSON_malloc(21); /* 2^64+1 can be represented in 21 chars. */ - if (str) sprintf(str,"%d",item->valueint); - } - else - { - if (p) str=ensure(p,64); - else str=(char*)cJSON_malloc(64); /* This is a nice tradeoff. */ - if (str) - { - if (d*0!=0) sprintf(str,"null"); /* This checks for NaN and Infinity */ - else if (fabs(floor(d)-d)<=DBL_EPSILON && fabs(d)<1.0e60) sprintf(str,"%.0f",d); - else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d); - else sprintf(str,"%f",d); - } - } - return str; + char *str = 0; + double d = item->valuedouble; + /* special case for 0. */ + if (d == 0) + { + if (p) + { + str = ensure(p, 2); + } + else + { + str = (char*)cJSON_malloc(2); + } + if (str) + { + strcpy(str,"0"); + } + } + /* value is an int */ + else if ((fabs(((double)item->valueint) - d) <= DBL_EPSILON) && (d <= INT_MAX) && (d >= INT_MIN)) + { + if (p) + { + str = ensure(p, 21); + } + else + { + /* 2^64+1 can be represented in 21 chars. */ + str = (char*)cJSON_malloc(21); + } + if (str) + { + sprintf(str, "%d", item->valueint); + } + } + /* value is a floating point number */ + else + { + if (p) + { + /* This is a nice tradeoff. */ + str = ensure(p, 64); + } + else + { + /* This is a nice tradeoff. */ + str=(char*)cJSON_malloc(64); + } + if (str) + { + /* This checks for NaN and Infinity */ + if ((d * 0) != 0) + { + sprintf(str, "null"); + } + else if ((fabs(floor(d) - d) <= DBL_EPSILON) && (fabs(d) < 1.0e60)) + { + sprintf(str, "%.0f", d); + } + else if ((fabs(d) < 1.0e-6) || (fabs(d) > 1.0e9)) + { + sprintf(str, "%e", d); + } + else + { + sprintf(str, "%f", d); + } + } + } + return str; } static unsigned parse_hex4(const char *str)