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
107
cJSON.c
107
cJSON.c
@ -223,13 +223,18 @@ static unsigned char* ensure(printbuffer *p, size_t needed)
|
|||||||
unsigned char *newbuffer = NULL;
|
unsigned char *newbuffer = NULL;
|
||||||
size_t newsize = 0;
|
size_t newsize = 0;
|
||||||
|
|
||||||
|
if (p == NULL)
|
||||||
|
{
|
||||||
|
return (unsigned char*)cJSON_malloc(needed);
|
||||||
|
}
|
||||||
|
|
||||||
if (needed > INT_MAX)
|
if (needed > INT_MAX)
|
||||||
{
|
{
|
||||||
/* sizes bigger than INT_MAX are currently not supported */
|
/* sizes bigger than INT_MAX are currently not supported */
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!p || !p->buffer)
|
if (p->buffer == NULL)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -298,51 +303,29 @@ static unsigned char *print_number(const cJSON *item, printbuffer *p)
|
|||||||
double d = item->valuedouble;
|
double d = item->valuedouble;
|
||||||
/* special case for 0. */
|
/* special case for 0. */
|
||||||
if (d == 0)
|
if (d == 0)
|
||||||
{
|
|
||||||
if (p)
|
|
||||||
{
|
{
|
||||||
str = ensure(p, 2);
|
str = ensure(p, 2);
|
||||||
}
|
if (str != NULL)
|
||||||
else
|
|
||||||
{
|
|
||||||
str = (unsigned char*)cJSON_malloc(2);
|
|
||||||
}
|
|
||||||
if (str)
|
|
||||||
{
|
{
|
||||||
strcpy((char*)str,"0");
|
strcpy((char*)str,"0");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* value is an int */
|
/* value is an int */
|
||||||
else if ((fabs(((double)item->valueint) - d) <= DBL_EPSILON) && (d <= INT_MAX) && (d >= INT_MIN))
|
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. */
|
/* 2^64+1 can be represented in 21 chars. */
|
||||||
str = (unsigned char*)cJSON_malloc(21);
|
str = ensure(p, 21);
|
||||||
}
|
if (str != NULL)
|
||||||
if (str)
|
|
||||||
{
|
{
|
||||||
sprintf((char*)str, "%d", item->valueint);
|
sprintf((char*)str, "%d", item->valueint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* value is a floating point number */
|
/* value is a floating point number */
|
||||||
else
|
else
|
||||||
{
|
|
||||||
if (p)
|
|
||||||
{
|
{
|
||||||
/* This is a nice tradeoff. */
|
/* This is a nice tradeoff. */
|
||||||
str = ensure(p, 64);
|
str = ensure(p, 64);
|
||||||
}
|
if (str != NULL)
|
||||||
else
|
|
||||||
{
|
|
||||||
/* This is a nice tradeoff. */
|
|
||||||
str = (unsigned char*)cJSON_malloc(64);
|
|
||||||
}
|
|
||||||
if (str)
|
|
||||||
{
|
{
|
||||||
/* This checks for NaN and Infinity */
|
/* This checks for NaN and Infinity */
|
||||||
if ((d * 0) != 0)
|
if ((d * 0) != 0)
|
||||||
@ -670,16 +653,9 @@ static unsigned char *print_string_ptr(const unsigned char *str, printbuffer *p)
|
|||||||
|
|
||||||
/* empty string */
|
/* empty string */
|
||||||
if (!str)
|
if (!str)
|
||||||
{
|
|
||||||
if (p)
|
|
||||||
{
|
{
|
||||||
out = ensure(p, 3);
|
out = ensure(p, 3);
|
||||||
}
|
if (out == NULL)
|
||||||
else
|
|
||||||
{
|
|
||||||
out = (unsigned char*)cJSON_malloc(3);
|
|
||||||
}
|
|
||||||
if (!out)
|
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -701,15 +677,9 @@ static unsigned char *print_string_ptr(const unsigned char *str, printbuffer *p)
|
|||||||
if (!flag)
|
if (!flag)
|
||||||
{
|
{
|
||||||
len = (size_t)(ptr - str);
|
len = (size_t)(ptr - str);
|
||||||
if (p)
|
|
||||||
{
|
|
||||||
out = ensure(p, len + 3);
|
out = ensure(p, len + 3);
|
||||||
}
|
if (out == NULL)
|
||||||
else
|
|
||||||
{
|
|
||||||
out = (unsigned char*)cJSON_malloc(len + 3);
|
|
||||||
}
|
|
||||||
if (!out)
|
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -739,15 +709,8 @@ static unsigned char *print_string_ptr(const unsigned char *str, printbuffer *p)
|
|||||||
ptr++;
|
ptr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p)
|
|
||||||
{
|
|
||||||
out = ensure(p, len + 3);
|
out = ensure(p, len + 3);
|
||||||
}
|
if (out == NULL)
|
||||||
else
|
|
||||||
{
|
|
||||||
out = (unsigned char*)cJSON_malloc(len + 3);
|
|
||||||
}
|
|
||||||
if (!out)
|
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -993,21 +956,21 @@ static unsigned char *print_value(const cJSON *item, size_t depth, cjbool fmt, p
|
|||||||
{
|
{
|
||||||
case cJSON_NULL:
|
case cJSON_NULL:
|
||||||
out = ensure(p, 5);
|
out = ensure(p, 5);
|
||||||
if (out)
|
if (out != NULL)
|
||||||
{
|
{
|
||||||
strcpy((char*)out, "null");
|
strcpy((char*)out, "null");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case cJSON_False:
|
case cJSON_False:
|
||||||
out = ensure(p, 6);
|
out = ensure(p, 6);
|
||||||
if (out)
|
if (out != NULL)
|
||||||
{
|
{
|
||||||
strcpy((char*)out, "false");
|
strcpy((char*)out, "false");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case cJSON_True:
|
case cJSON_True:
|
||||||
out = ensure(p, 5);
|
out = ensure(p, 5);
|
||||||
if (out)
|
if (out != NULL)
|
||||||
{
|
{
|
||||||
strcpy((char*)out, "true");
|
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');
|
raw_length = strlen(item->valuestring) + sizeof('\0');
|
||||||
out = ensure(p, raw_length);
|
out = ensure(p, raw_length);
|
||||||
if (out)
|
if (out != NULL)
|
||||||
{
|
{
|
||||||
memcpy(out, item->valuestring, raw_length);
|
memcpy(out, item->valuestring, raw_length);
|
||||||
}
|
}
|
||||||
@ -1188,16 +1151,9 @@ static unsigned char *print_array(const cJSON *item, size_t depth, cjbool fmt, p
|
|||||||
|
|
||||||
/* Explicitly handle numentries == 0 */
|
/* Explicitly handle numentries == 0 */
|
||||||
if (!numentries)
|
if (!numentries)
|
||||||
{
|
|
||||||
if (p)
|
|
||||||
{
|
{
|
||||||
out = ensure(p, 3);
|
out = ensure(p, 3);
|
||||||
}
|
if (out != NULL)
|
||||||
else
|
|
||||||
{
|
|
||||||
out = (unsigned char*)cJSON_malloc(3);
|
|
||||||
}
|
|
||||||
if (out)
|
|
||||||
{
|
{
|
||||||
strcpy((char*)out, "[]");
|
strcpy((char*)out, "[]");
|
||||||
}
|
}
|
||||||
@ -1211,7 +1167,7 @@ static unsigned char *print_array(const cJSON *item, size_t depth, cjbool fmt, p
|
|||||||
/* opening square bracket */
|
/* opening square bracket */
|
||||||
i = p->offset;
|
i = p->offset;
|
||||||
ptr = ensure(p, 1);
|
ptr = ensure(p, 1);
|
||||||
if (!ptr)
|
if (ptr == NULL)
|
||||||
{
|
{
|
||||||
return 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;
|
len = fmt ? 2 : 1;
|
||||||
ptr = ensure(p, len + 1);
|
ptr = ensure(p, len + 1);
|
||||||
if (!ptr)
|
if (ptr == NULL)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1245,7 +1201,7 @@ static unsigned char *print_array(const cJSON *item, size_t depth, cjbool fmt, p
|
|||||||
child = child->next;
|
child = child->next;
|
||||||
}
|
}
|
||||||
ptr = ensure(p, 2);
|
ptr = ensure(p, 2);
|
||||||
if (!ptr)
|
if (ptr == NULL)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1455,16 +1411,9 @@ static unsigned char *print_object(const cJSON *item, size_t depth, cjbool fmt,
|
|||||||
|
|
||||||
/* Explicitly handle empty object case */
|
/* Explicitly handle empty object case */
|
||||||
if (!numentries)
|
if (!numentries)
|
||||||
{
|
|
||||||
if (p)
|
|
||||||
{
|
{
|
||||||
out = ensure(p, fmt ? depth + 4 : 3);
|
out = ensure(p, fmt ? depth + 4 : 3);
|
||||||
}
|
if (out == NULL)
|
||||||
else
|
|
||||||
{
|
|
||||||
out = (unsigned char*)cJSON_malloc(fmt ? depth + 4 : 3);
|
|
||||||
}
|
|
||||||
if (!out)
|
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1489,7 +1438,7 @@ static unsigned char *print_object(const cJSON *item, size_t depth, cjbool fmt,
|
|||||||
i = p->offset;
|
i = p->offset;
|
||||||
len = fmt ? 2 : 1; /* fmt: {\n */
|
len = fmt ? 2 : 1; /* fmt: {\n */
|
||||||
ptr = ensure(p, len + 1);
|
ptr = ensure(p, len + 1);
|
||||||
if (!ptr)
|
if (ptr == NULL)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1509,7 +1458,7 @@ static unsigned char *print_object(const cJSON *item, size_t depth, cjbool fmt,
|
|||||||
if (fmt)
|
if (fmt)
|
||||||
{
|
{
|
||||||
ptr = ensure(p, depth);
|
ptr = ensure(p, depth);
|
||||||
if (!ptr)
|
if (ptr == NULL)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1529,7 +1478,7 @@ static unsigned char *print_object(const cJSON *item, size_t depth, cjbool fmt,
|
|||||||
|
|
||||||
len = fmt ? 2 : 1;
|
len = fmt ? 2 : 1;
|
||||||
ptr = ensure(p, len);
|
ptr = ensure(p, len);
|
||||||
if (!ptr)
|
if (ptr == NULL)
|
||||||
{
|
{
|
||||||
return 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 */
|
/* print comma if not last */
|
||||||
len = (size_t) (fmt ? 1 : 0) + (child->next ? 1 : 0);
|
len = (size_t) (fmt ? 1 : 0) + (child->next ? 1 : 0);
|
||||||
ptr = ensure(p, len + 1);
|
ptr = ensure(p, len + 1);
|
||||||
if (!ptr)
|
if (ptr == NULL)
|
||||||
{
|
{
|
||||||
return 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);
|
ptr = ensure(p, fmt ? (depth + 1) : 2);
|
||||||
if (!ptr)
|
if (ptr == NULL)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user