浏览代码

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

Dave Gamble 12 年之前
父节点
当前提交
8aa084918f
共有 1 个文件被更改,包括 31 次插入17 次删除
  1. 31 17
      cJSON.c

+ 31 - 17
cJSON.c

@@ -327,28 +327,32 @@ static const char *parse_array(cJSON *item,const char *value)
 /* Render an array to text */
 static char *print_array(cJSON *item,int depth,int fmt)
 {
-	char **entries=0;
+	char **entries;
 	char *out=0,*ptr,*ret;int len=5;
 	cJSON *child=item->child;
 	int numentries=0,i=0,fail=0;
 	
 	/* How many entries in the array? */
 	while (child) numentries++,child=child->next;
-	if (numentries)
+	/* Explicitly handle numentries==0 */
+	if (!numentries)
 	{
-		/* 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;
-			child=child->next;
-		}
+		out=(char*)cJSON_malloc(3);
+		if (out) strcpy(out,"[]");
+		return out;
+	}
+	/* 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;
+		child=child->next;
 	}
 	
 	/* If we didn't fail, try to malloc the output string */
@@ -360,7 +364,7 @@ static char *print_array(cJSON *item,int depth,int fmt)
 	if (fail)
 	{
 		for (i=0;i<numentries;i++) if (entries[i]) cJSON_free(entries[i]);
-		if (entries) cJSON_free(entries);
+		cJSON_free(entries);
 		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;}
 		cJSON_free(entries[i]);
 	}
-	if (entries) cJSON_free(entries);
+	cJSON_free(entries);
 	*ptr++=']';*ptr++=0;
 	return out;	
 }
@@ -423,6 +427,16 @@ static char *print_object(cJSON *item,int depth,int fmt)
 	int numentries=0,fail=0;
 	/* Count the number of entries. */
 	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 */
 	entries=(char**)cJSON_malloc(numentries*sizeof(char*));
 	if (!entries) return 0;