mirror of
https://github.com/DaveGamble/cJSON.git
synced 2023-08-10 21:13:26 +03:00
stable solution for printing arrays - based on patch donated by Jerome Lang.
Resolves issue in case malloc(0)!=0. git-svn-id: http://svn.code.sf.net/p/cjson/code@44 e3330c51-1366-4df0-8b21-3ccf24e3d50e
This commit is contained in:
parent
4678f33b5c
commit
3ddf3a5911
31
cJSON.c
31
cJSON.c
@ -327,25 +327,28 @@ static const char *parse_array(cJSON *item,const char *value)
|
|||||||
/* Render an array to text */
|
/* Render an array to text */
|
||||||
static char *print_array(cJSON *item,int depth,int fmt)
|
static char *print_array(cJSON *item,int depth,int fmt)
|
||||||
{
|
{
|
||||||
char **entries;
|
char **entries=0;
|
||||||
char *out=0,*ptr,*ret;int len=5;
|
char *out=0,*ptr,*ret;int len=5;
|
||||||
cJSON *child=item->child;
|
cJSON *child=item->child;
|
||||||
int numentries=0,i=0,fail=0;
|
int numentries=0,i=0,fail=0;
|
||||||
|
|
||||||
/* How many entries in the array? */
|
/* How many entries in the array? */
|
||||||
while (child) numentries++,child=child->next;
|
while (child) numentries++,child=child->next;
|
||||||
/* Allocate an array to hold the values for each */
|
if (numentries)
|
||||||
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);
|
/* Allocate an array to hold the values for each */
|
||||||
entries[i++]=ret;
|
entries=(char**)cJSON_malloc(numentries*sizeof(char*));
|
||||||
if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1;
|
if (!entries) return 0;
|
||||||
child=child->next;
|
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;
|
||||||
|
child=child->next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we didn't fail, try to malloc the output string */
|
/* If we didn't fail, try to malloc the output string */
|
||||||
@ -357,7 +360,7 @@ static char *print_array(cJSON *item,int depth,int fmt)
|
|||||||
if (fail)
|
if (fail)
|
||||||
{
|
{
|
||||||
for (i=0;i<numentries;i++) if (entries[i]) cJSON_free(entries[i]);
|
for (i=0;i<numentries;i++) if (entries[i]) cJSON_free(entries[i]);
|
||||||
cJSON_free(entries);
|
if (entries) cJSON_free(entries);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,7 +373,7 @@ static char *print_array(cJSON *item,int depth,int fmt)
|
|||||||
if (i!=numentries-1) {*ptr++=',';if(fmt)*ptr++=' ';*ptr=0;}
|
if (i!=numentries-1) {*ptr++=',';if(fmt)*ptr++=' ';*ptr=0;}
|
||||||
cJSON_free(entries[i]);
|
cJSON_free(entries[i]);
|
||||||
}
|
}
|
||||||
cJSON_free(entries);
|
if (entries) cJSON_free(entries);
|
||||||
*ptr++=']';*ptr++=0;
|
*ptr++=']';*ptr++=0;
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user