Import patch to fix:cJSON_PrintUnformatted() behaves unexpected if an empty array shall be printed to text. from Jerome Lang 2012-04-19

This commit is contained in:
Pierre-Noel Bouteville 2016-12-04 08:14:56 -06:00 committed by Gregory Nutt
parent feb18e9750
commit 85eea42ff6

View File

@ -3,7 +3,7 @@
*
* This file is a part of NuttX:
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Copyright (C) 2011, 2016 Gregory Nutt. All rights reserved.
* Ported by: Darcy Gong
*
* And derives from the cJSON Project which has an MIT license:
@ -34,6 +34,7 @@
* Included Files
****************************************************************************/
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
@ -446,6 +447,7 @@ static char *print_string_ptr(const char *str)
ptr2 = out;
ptr = str;
*ptr2++ = '\"';
while (*ptr)
{
if ((unsigned char)*ptr > 31 && *ptr != '\"' && *ptr != '\\')
@ -697,52 +699,56 @@ static const char *parse_array(cJSON *item, const char *value)
static char *print_array(cJSON *item, int depth, int fmt)
{
char **entries;
char **entries=0;
char *out = 0;
char *ptr;
char *ret;
int len = 5;
cJSON *child = item->child;
bool fail = false;
int numentries = 0;
int i = 0;
int fail = 0;
/* How many entries in the array? */
while (child)
while (child != NULL)
{
numentries++, child = child->next;
}
/* Allocate an array to hold the values for each */
entries = (char **)cJSON_malloc(numentries * sizeof(char *));
if (!entries)
{
return 0;
}
memset(entries, 0, numentries * sizeof(char *));
/* Retrieve all the results: */
child = item->child;
while (child && !fail)
{
ret = print_value(child, depth + 1, fmt);
entries[i++] = ret;
if (ret)
{
len += strlen(ret) + 2 + (fmt ? 1 : 0);
}
else
{
fail = 1;
}
numentries++;
child = child->next;
}
if (numentries > 0)
{
/* Allocate an array to hold the values for each */
entries = (char **)cJSON_malloc(numentries * sizeof(char *));
if (entries == NULL)
{
return 0;
}
memset(entries, 0, numentries * sizeof(char *));
/* Retrieve all the results: */
child = item->child;
while (child && !fail)
{
ret = print_value(child, depth + 1, fmt);
entries[i++] = ret;
if (ret)
{
len += strlen(ret) + 2 + (fmt ? 1 : 0);
}
else
{
fail = true;
}
child = child->next;
}
}
/* If we didn't fail, try to malloc the output string */
if (!fail)
@ -754,7 +760,7 @@ static char *print_array(cJSON *item, int depth, int fmt)
if (!out)
{
fail = 1;
fail = true;
}
/* Handle failure. */
@ -769,15 +775,20 @@ static char *print_array(cJSON *item, int depth, int fmt)
}
}
cJSON_free(entries);
if ( entries )
{
cJSON_free(entries);
}
return 0;
}
/* Compose the output array. */
*out = '[';
ptr = out + 1;
ptr = out + 1;
*ptr = 0;
for (i = 0; i < numentries; i++)
{
strcpy(ptr, entries[i]);
@ -792,10 +803,15 @@ static char *print_array(cJSON *item, int depth, int fmt)
*ptr = 0;
}
cJSON_free(entries[i]);
}
cJSON_free(entries);
if ( entries )
{
cJSON_free(entries);
}
*ptr++ = ']';
*ptr++ = 0;
return out;
@ -843,7 +859,7 @@ static const char *parse_object(cJSON *item, const char *value)
return 0;
}
/* Skip any spacing, get the value. */
/* Skip any spacing, get the value. */
value = skip(parse_value(child, skip(value + 1)));
if (!value)
@ -914,8 +930,8 @@ static char *print_object(cJSON *item, int depth, int fmt)
int i = 0;
int j;
cJSON *child = item->child;
bool fail = false;
int numentries = 0;
int fail = 0;
/* Count the number of entries. */
@ -961,7 +977,7 @@ static char *print_object(cJSON *item, int depth, int fmt)
}
else
{
fail = 1;
fail = true;
}
child = child->next;
@ -976,7 +992,7 @@ static char *print_object(cJSON *item, int depth, int fmt)
if (!out)
{
fail = 1;
fail = true;
}
/* Handle failure */