mirror of
https://github.com/DaveGamble/cJSON.git
synced 2023-08-10 21:13:26 +03:00
ensure: if printbuffer is null: cJSON_malloc
This allowed for the removal of a lot of if (p) checks.
This commit is contained in:
parent
bd073343fa
commit
fc1d4b07df
123
cJSON.c
123
cJSON.c
@ -223,13 +223,18 @@ static unsigned char* ensure(printbuffer *p, size_t needed)
|
||||
unsigned char *newbuffer = NULL;
|
||||
size_t newsize = 0;
|
||||
|
||||
if (p == NULL)
|
||||
{
|
||||
return (unsigned char*)cJSON_malloc(needed);
|
||||
}
|
||||
|
||||
if (needed > INT_MAX)
|
||||
{
|
||||
/* sizes bigger than INT_MAX are currently not supported */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!p || !p->buffer)
|
||||
if (p->buffer == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -299,15 +304,8 @@ static unsigned char *print_number(const cJSON *item, printbuffer *p)
|
||||
/* special case for 0. */
|
||||
if (d == 0)
|
||||
{
|
||||
if (p)
|
||||
{
|
||||
str = ensure(p, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
str = (unsigned char*)cJSON_malloc(2);
|
||||
}
|
||||
if (str)
|
||||
str = ensure(p, 2);
|
||||
if (str != NULL)
|
||||
{
|
||||
strcpy((char*)str,"0");
|
||||
}
|
||||
@ -315,16 +313,9 @@ static unsigned char *print_number(const cJSON *item, printbuffer *p)
|
||||
/* 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 = (unsigned char*)cJSON_malloc(21);
|
||||
}
|
||||
if (str)
|
||||
str = ensure(p, 21);
|
||||
if (str != NULL)
|
||||
{
|
||||
sprintf((char*)str, "%d", item->valueint);
|
||||
}
|
||||
@ -332,17 +323,9 @@ static unsigned char *print_number(const cJSON *item, printbuffer *p)
|
||||
/* 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 = (unsigned char*)cJSON_malloc(64);
|
||||
}
|
||||
if (str)
|
||||
/* This is a nice tradeoff. */
|
||||
str = ensure(p, 64);
|
||||
if (str != NULL)
|
||||
{
|
||||
/* This checks for NaN and Infinity */
|
||||
if ((d * 0) != 0)
|
||||
@ -671,15 +654,8 @@ static unsigned char *print_string_ptr(const unsigned char *str, printbuffer *p)
|
||||
/* empty string */
|
||||
if (!str)
|
||||
{
|
||||
if (p)
|
||||
{
|
||||
out = ensure(p, 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
out = (unsigned char*)cJSON_malloc(3);
|
||||
}
|
||||
if (!out)
|
||||
out = ensure(p, 3);
|
||||
if (out == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -701,15 +677,9 @@ static unsigned char *print_string_ptr(const unsigned char *str, printbuffer *p)
|
||||
if (!flag)
|
||||
{
|
||||
len = (size_t)(ptr - str);
|
||||
if (p)
|
||||
{
|
||||
out = ensure(p, len + 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
out = (unsigned char*)cJSON_malloc(len + 3);
|
||||
}
|
||||
if (!out)
|
||||
|
||||
out = ensure(p, len + 3);
|
||||
if (out == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -739,15 +709,8 @@ static unsigned char *print_string_ptr(const unsigned char *str, printbuffer *p)
|
||||
ptr++;
|
||||
}
|
||||
|
||||
if (p)
|
||||
{
|
||||
out = ensure(p, len + 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
out = (unsigned char*)cJSON_malloc(len + 3);
|
||||
}
|
||||
if (!out)
|
||||
out = ensure(p, len + 3);
|
||||
if (out == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -993,21 +956,21 @@ static unsigned char *print_value(const cJSON *item, size_t depth, cjbool fmt, p
|
||||
{
|
||||
case cJSON_NULL:
|
||||
out = ensure(p, 5);
|
||||
if (out)
|
||||
if (out != NULL)
|
||||
{
|
||||
strcpy((char*)out, "null");
|
||||
}
|
||||
break;
|
||||
case cJSON_False:
|
||||
out = ensure(p, 6);
|
||||
if (out)
|
||||
if (out != NULL)
|
||||
{
|
||||
strcpy((char*)out, "false");
|
||||
}
|
||||
break;
|
||||
case cJSON_True:
|
||||
out = ensure(p, 5);
|
||||
if (out)
|
||||
if (out != NULL)
|
||||
{
|
||||
strcpy((char*)out, "true");
|
||||
}
|
||||
@ -1030,7 +993,7 @@ static unsigned char *print_value(const cJSON *item, size_t depth, cjbool fmt, p
|
||||
|
||||
raw_length = strlen(item->valuestring) + sizeof('\0');
|
||||
out = ensure(p, raw_length);
|
||||
if (out)
|
||||
if (out != NULL)
|
||||
{
|
||||
memcpy(out, item->valuestring, raw_length);
|
||||
}
|
||||
@ -1189,15 +1152,8 @@ static unsigned char *print_array(const cJSON *item, size_t depth, cjbool fmt, p
|
||||
/* Explicitly handle numentries == 0 */
|
||||
if (!numentries)
|
||||
{
|
||||
if (p)
|
||||
{
|
||||
out = ensure(p, 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
out = (unsigned char*)cJSON_malloc(3);
|
||||
}
|
||||
if (out)
|
||||
out = ensure(p, 3);
|
||||
if (out != NULL)
|
||||
{
|
||||
strcpy((char*)out, "[]");
|
||||
}
|
||||
@ -1211,7 +1167,7 @@ static unsigned char *print_array(const cJSON *item, size_t depth, cjbool fmt, p
|
||||
/* opening square bracket */
|
||||
i = p->offset;
|
||||
ptr = ensure(p, 1);
|
||||
if (!ptr)
|
||||
if (ptr == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -1230,7 +1186,7 @@ static unsigned char *print_array(const cJSON *item, size_t depth, cjbool fmt, p
|
||||
{
|
||||
len = fmt ? 2 : 1;
|
||||
ptr = ensure(p, len + 1);
|
||||
if (!ptr)
|
||||
if (ptr == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -1245,7 +1201,7 @@ static unsigned char *print_array(const cJSON *item, size_t depth, cjbool fmt, p
|
||||
child = child->next;
|
||||
}
|
||||
ptr = ensure(p, 2);
|
||||
if (!ptr)
|
||||
if (ptr == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -1456,15 +1412,8 @@ static unsigned char *print_object(const cJSON *item, size_t depth, cjbool fmt,
|
||||
/* Explicitly handle empty object case */
|
||||
if (!numentries)
|
||||
{
|
||||
if (p)
|
||||
{
|
||||
out = ensure(p, fmt ? depth + 4 : 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
out = (unsigned char*)cJSON_malloc(fmt ? depth + 4 : 3);
|
||||
}
|
||||
if (!out)
|
||||
out = ensure(p, fmt ? depth + 4 : 3);
|
||||
if (out == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -1489,7 +1438,7 @@ static unsigned char *print_object(const cJSON *item, size_t depth, cjbool fmt,
|
||||
i = p->offset;
|
||||
len = fmt ? 2 : 1; /* fmt: {\n */
|
||||
ptr = ensure(p, len + 1);
|
||||
if (!ptr)
|
||||
if (ptr == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -1509,7 +1458,7 @@ static unsigned char *print_object(const cJSON *item, size_t depth, cjbool fmt,
|
||||
if (fmt)
|
||||
{
|
||||
ptr = ensure(p, depth);
|
||||
if (!ptr)
|
||||
if (ptr == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -1529,7 +1478,7 @@ static unsigned char *print_object(const cJSON *item, size_t depth, cjbool fmt,
|
||||
|
||||
len = fmt ? 2 : 1;
|
||||
ptr = ensure(p, len);
|
||||
if (!ptr)
|
||||
if (ptr == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -1550,7 +1499,7 @@ static unsigned char *print_object(const cJSON *item, size_t depth, cjbool fmt,
|
||||
/* print comma if not last */
|
||||
len = (size_t) (fmt ? 1 : 0) + (child->next ? 1 : 0);
|
||||
ptr = ensure(p, len + 1);
|
||||
if (!ptr)
|
||||
if (ptr == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -1570,7 +1519,7 @@ static unsigned char *print_object(const cJSON *item, size_t depth, cjbool fmt,
|
||||
}
|
||||
|
||||
ptr = ensure(p, fmt ? (depth + 1) : 2);
|
||||
if (!ptr)
|
||||
if (ptr == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user