Forráskód Böngészése

reformatting: print_object

Max Bruckner 8 éve
szülő
commit
31e53a1297
1 módosított fájl, 271 hozzáadás és 107 törlés
  1. 271 107
      cJSON.c

+ 271 - 107
cJSON.c

@@ -1306,114 +1306,278 @@ static const char *parse_object(cJSON *item, const char *value, const char **ep)
 }
 
 /* Render an object to text. */
-static char *print_object(cJSON *item,int depth,int fmt,printbuffer *p)
+static char *print_object(cJSON *item, int depth, int fmt, printbuffer *p)
 {
-	char **entries=0,**names=0;
-	char *out=0,*ptr,*ret,*str;int len=7,i=0,j;
-	cJSON *child=item->child;
-	int numentries=0,fail=0;
-	size_t tmplen=0;
-	/* Count the number of entries. */
-	while (child) numentries++,child=child->next;
-	/* Explicitly handle empty object case */
-	if (!numentries)
-	{
-		if (p) out=ensure(p,fmt?depth+4:3);
-		else	out=(char*)cJSON_malloc(fmt?depth+4:3);
-		if (!out)	return 0;
-		ptr=out;*ptr++='{';
-		if (fmt) {*ptr++='\n';for (i=0;i<depth;i++) *ptr++='\t';}
-		*ptr++='}';*ptr++=0;
-		return out;
-	}
-	if (p)
-	{
-		/* Compose the output: */
-		i=p->offset;
-		len=fmt?2:1;	ptr=ensure(p,len+1);	if (!ptr) return 0;
-		*ptr++='{';	if (fmt) *ptr++='\n';	*ptr=0;	p->offset+=len;
-		child=item->child;depth++;
-		while (child)
-		{
-			if (fmt)
-			{
-				ptr=ensure(p,depth);	if (!ptr) return 0;
-				for (j=0;j<depth;j++) *ptr++='\t';
-				p->offset+=depth;
-			}
-			print_string_ptr(child->string,p);
-			p->offset=update(p);
-			
-			len=fmt?2:1;
-			ptr=ensure(p,len);	if (!ptr) return 0;
-			*ptr++=':';if (fmt) *ptr++='\t';
-			p->offset+=len;
-			
-			print_value(child,depth,fmt,p);
-			p->offset=update(p);
-
-			len=(fmt?1:0)+(child->next?1:0);
-			ptr=ensure(p,len+1); if (!ptr) return 0;
-			if (child->next) *ptr++=',';
-			if (fmt) *ptr++='\n';*ptr=0;
-			p->offset+=len;
-			child=child->next;
-		}
-		ptr=ensure(p,fmt?(depth+1):2);	 if (!ptr) return 0;
-		if (fmt)	for (i=0;i<depth-1;i++) *ptr++='\t';
-		*ptr++='}';*ptr=0;
-		out=(p->buffer)+i;
-	}
-	else
-	{
-		/* Allocate space for the names and the objects */
-		entries=(char**)cJSON_malloc(numentries*sizeof(char*));
-		if (!entries) return 0;
-		names=(char**)cJSON_malloc(numentries*sizeof(char*));
-		if (!names) {cJSON_free(entries);return 0;}
-		memset(entries,0,sizeof(char*)*numentries);
-		memset(names,0,sizeof(char*)*numentries);
-
-		/* Collect all the results into our arrays: */
-		child=item->child;depth++;if (fmt) len+=depth;
-		while (child && !fail)
-		{
-			names[i]=str=print_string_ptr(child->string,0);
-			entries[i++]=ret=print_value(child,depth,fmt,0);
-			if (str && ret) len+=strlen(ret)+strlen(str)+2+(fmt?2+depth:0); else fail=1;
-			child=child->next;
-		}
-		
-		/* Try to allocate the output string */
-		if (!fail)	out=(char*)cJSON_malloc(len);
-		if (!out) fail=1;
-
-		/* Handle failure */
-		if (fail)
-		{
-			for (i=0;i<numentries;i++) {if (names[i]) cJSON_free(names[i]);if (entries[i]) cJSON_free(entries[i]);}
-			cJSON_free(names);cJSON_free(entries);
-			return 0;
-		}
-		
-		/* Compose the output: */
-		*out='{';ptr=out+1;if (fmt)*ptr++='\n';*ptr=0;
-		for (i=0;i<numentries;i++)
-		{
-			if (fmt) for (j=0;j<depth;j++) *ptr++='\t';
-			tmplen=strlen(names[i]);memcpy(ptr,names[i],tmplen);ptr+=tmplen;
-			*ptr++=':';if (fmt) *ptr++='\t';
-			strcpy(ptr,entries[i]);ptr+=strlen(entries[i]);
-			if (i!=numentries-1) *ptr++=',';
-			if (fmt) *ptr++='\n';*ptr=0;
-			cJSON_free(names[i]);cJSON_free(entries[i]);
-		}
-		
-		cJSON_free(names);cJSON_free(entries);
-		if (fmt) for (i=0;i<depth-1;i++) *ptr++='\t';
-		*ptr++='}';*ptr++=0;
-	}
-	return out;	
+    char **entries = 0;
+    char **names = 0;
+    char *out = 0;
+    char *ptr;
+    char *ret;
+    char *str;
+    int len = 7;
+    int i = 0;
+    int j;
+    cJSON *child = item->child;
+    int numentries = 0;
+    int fail = 0;
+    size_t tmplen = 0;
+
+    /* Count the number of entries. */
+    while (child)
+    {
+        numentries++;
+        child = child->next;
+    }
+
+    /* Explicitly handle empty object case */
+    if (!numentries)
+    {
+        if (p)
+        {
+            out = ensure(p, fmt ? depth + 4 : 3);
+        }
+        else
+        {
+            out = (char*)cJSON_malloc(fmt ? depth + 4 : 3);
+        }
+        if (!out)
+        {
+            return 0;
+        }
+        ptr = out;
+        *ptr++ = '{';
+        if (fmt) {
+            *ptr++ = '\n';
+            for (i = 0; i < depth; i++)
+            {
+                *ptr++ = '\t';
+            }
+        }
+        *ptr++ = '}';
+        *ptr++ = '\0';
+
+        return out;
+    }
+
+    if (p)
+    {
+        /* Compose the output: */
+        i = p->offset;
+        len = fmt ? 2 : 1; /* fmt: {\n */
+        ptr = ensure(p, len + 1);
+        if (!ptr)
+        {
+            return 0;
+        }
+
+        *ptr++ = '{';
+        if (fmt)
+        {
+            *ptr++ = '\n';
+        }
+        *ptr = '\0';
+        p->offset += len;
+
+        child = item->child;
+        depth++;
+        while (child)
+        {
+            if (fmt)
+            {
+                ptr = ensure(p, depth);
+                if (!ptr)
+                {
+                    return 0;
+                }
+                for (j = 0; j < depth; j++)
+                {
+                    *ptr++ = '\t';
+                }
+                p->offset += depth;
+            }
+
+            /* print key */
+            print_string_ptr(child->string, p);
+            p->offset = update(p);
+
+            len = fmt ? 2 : 1;
+            ptr = ensure(p, len);
+            if (!ptr)
+            {
+                return 0;
+            }
+            *ptr++ = ':';
+            if (fmt)
+            {
+                *ptr++ = '\t';
+            }
+            p->offset+=len;
+
+            /* print value */
+            print_value(child, depth, fmt, p);
+            p->offset = update(p);
+
+            /* print comma if not last */
+            len = (fmt ? 1 : 0) + (child->next ? 1 : 0);
+            ptr = ensure(p, len + 1);
+            if (!ptr)
+            {
+                return 0;
+            }
+            if (child->next)
+            {
+                *ptr++ = ',';
+            }
+
+            if (fmt)
+            {
+                *ptr++ = '\n';
+            }
+            *ptr = '\0';
+            p->offset += len;
+
+            child = child->next;
+        }
+
+        ptr = ensure(p, fmt ? (depth + 1) : 2);
+        if (!ptr)
+        {
+            return 0;
+        }
+        if (fmt)
+        {
+            for (i = 0; i < (depth - 1); i++)
+            {
+                *ptr++ = '\t';
+            }
+        }
+        *ptr++ = '}';
+        *ptr = '\0';
+        out = (p->buffer) + i;
+    }
+    else
+    {
+        /* Allocate space for the names and the objects */
+        entries = (char**)cJSON_malloc(numentries * sizeof(char*));
+        if (!entries)
+        {
+            return 0;
+        }
+        names = (char**)cJSON_malloc(numentries * sizeof(char*));
+        if (!names)
+        {
+            cJSON_free(entries);
+            return 0;
+        }
+        memset(entries,0, sizeof(char*) * numentries);
+        memset(names, 0, sizeof(char*) * numentries);
+
+        /* Collect all the results into our arrays: */
+        child = item->child;
+        depth++;
+        if (fmt)
+        {
+            len += depth;
+        }
+        while (child && !fail)
+        {
+            names[i] = str = print_string_ptr(child->string, 0); /* print key */
+            entries[i++] = ret = print_value(child, depth, fmt, 0);
+            if (str && ret)
+            {
+                len += strlen(ret) + strlen(str) + 2 + (fmt ? 2 + depth : 0);
+            }
+            else
+            {
+                fail = 1;
+            }
+            child = child->next;
+        }
+
+        /* Try to allocate the output string */
+        if (!fail)
+        {
+            out = (char*)cJSON_malloc(len);
+        }
+        if (!out)
+        {
+            fail = 1;
+        }
+
+        /* Handle failure */
+        if (fail)
+        {
+            /* free all the printed keys and values */
+            for (i = 0; i < numentries; i++)
+            {
+                if (names[i])
+                {
+                    cJSON_free(names[i]);
+                }
+                if (entries[i])
+                {
+                    cJSON_free(entries[i]);
+                }
+            }
+            cJSON_free(names);
+            cJSON_free(entries);
+            return 0;
+        }
+
+        /* Compose the output: */
+        *out = '{';
+        ptr = out + 1;
+        if (fmt)
+        {
+            *ptr++ = '\n';
+        }
+        *ptr = 0;
+        for (i = 0; i < numentries; i++)
+        {
+            if (fmt)
+            {
+                for (j = 0; j < depth; j++)
+                {
+                    *ptr++='\t';
+                }
+            }
+            tmplen = strlen(names[i]);
+            memcpy(ptr, names[i], tmplen);
+            ptr += tmplen;
+            *ptr++ = ':';
+            if (fmt)
+            {
+                *ptr++ = '\t';
+            }
+            strcpy(ptr, entries[i]);
+            ptr += strlen(entries[i]);
+            if (i != (numentries - 1))
+            {
+                *ptr++ = ',';
+            }
+            if (fmt)
+            {
+                *ptr++ = '\n';
+            }
+            *ptr = 0;
+            cJSON_free(names[i]);
+            cJSON_free(entries[i]);
+        }
+
+        cJSON_free(names);
+        cJSON_free(entries);
+        if (fmt)
+        {
+            for (i = 0; i < (depth - 1); i++)
+            {
+                *ptr++ = '\t';
+            }
+        }
+        *ptr++ = '}';
+        *ptr++ = '\0';
+    }
+
+    return out;
 }
 
 /* Get Array size/item / object item. */