Revert last patch. Simpler fix for empty arrays/objects is to handle them explicitly and then bail.

Saves plenty of unnecessary state-tracking.


git-svn-id: http://svn.code.sf.net/p/cjson/code@45 e3330c51-1366-4df0-8b21-3ccf24e3d50e
This commit is contained in:
Dave Gamble 2013-02-05 17:27:59 +00:00
parent 3ddf3a5911
commit 8aa084918f

24
cJSON.c
View File

@ -327,15 +327,20 @@ 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=0; char **entries;
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;
if (numentries) /* Explicitly handle numentries==0 */
if (!numentries)
{ {
out=(char*)cJSON_malloc(3);
if (out) strcpy(out,"[]");
return out;
}
/* Allocate an array to hold the values for each */ /* Allocate an array to hold the values for each */
entries=(char**)cJSON_malloc(numentries*sizeof(char*)); entries=(char**)cJSON_malloc(numentries*sizeof(char*));
if (!entries) return 0; if (!entries) return 0;
@ -349,7 +354,6 @@ static char *print_array(cJSON *item,int depth,int fmt)
if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1; if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1;
child=child->next; 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 */
if (!fail) out=(char*)cJSON_malloc(len); if (!fail) out=(char*)cJSON_malloc(len);
@ -360,7 +364,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]);
if (entries) cJSON_free(entries); cJSON_free(entries);
return 0; return 0;
} }
@ -373,7 +377,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]);
} }
if (entries) cJSON_free(entries); cJSON_free(entries);
*ptr++=']';*ptr++=0; *ptr++=']';*ptr++=0;
return out; return out;
} }
@ -423,6 +427,16 @@ static char *print_object(cJSON *item,int depth,int fmt)
int numentries=0,fail=0; int numentries=0,fail=0;
/* Count the number of entries. */ /* Count the number of entries. */
while (child) numentries++,child=child->next; while (child) numentries++,child=child->next;
/* Explicitly handle empty object case */
if (!numentries)
{
out=cJSON_malloc(fmt?depth+3:3);
if (!out) return 0;
ptr=out;*ptr++='{';
if (fmt) {*ptr++='\n';for (i=0;i<depth-1;i++) *ptr++='\t';}
*ptr++='}';*ptr++=0;
return out;
}
/* Allocate space for the names and the objects */ /* Allocate space for the names and the objects */
entries=(char**)cJSON_malloc(numentries*sizeof(char*)); entries=(char**)cJSON_malloc(numentries*sizeof(char*));
if (!entries) return 0; if (!entries) return 0;