|
@@ -1045,83 +1045,169 @@ static const char *parse_array(cJSON *item,const char *value,const char **ep)
|
|
|
}
|
|
|
|
|
|
/* Render an array to text */
|
|
|
-static char *print_array(cJSON *item,int depth,int fmt,printbuffer *p)
|
|
|
+static char *print_array(cJSON *item, int depth, int fmt, printbuffer *p)
|
|
|
{
|
|
|
- char **entries;
|
|
|
- char *out=0,*ptr,*ret;int len=5;
|
|
|
- cJSON *child=item->child;
|
|
|
- int numentries=0,i=0,fail=0;
|
|
|
- size_t tmplen=0;
|
|
|
-
|
|
|
- /* How many entries in the array? */
|
|
|
- while (child) numentries++,child=child->next;
|
|
|
- /* Explicitly handle numentries==0 */
|
|
|
- if (!numentries)
|
|
|
- {
|
|
|
- if (p) out=ensure(p,3);
|
|
|
- else out=(char*)cJSON_malloc(3);
|
|
|
- if (out) strcpy(out,"[]");
|
|
|
- return out;
|
|
|
- }
|
|
|
+ char **entries;
|
|
|
+ char *out = 0;
|
|
|
+ char *ptr;
|
|
|
+ char *ret;
|
|
|
+ int len = 5;
|
|
|
+ cJSON *child = item->child;
|
|
|
+ int numentries = 0;
|
|
|
+ int i = 0;
|
|
|
+ int fail = 0;
|
|
|
+ size_t tmplen = 0;
|
|
|
|
|
|
- if (p)
|
|
|
- {
|
|
|
- /* Compose the output array. */
|
|
|
- i=p->offset;
|
|
|
- ptr=ensure(p,1);if (!ptr) return 0; *ptr='['; p->offset++;
|
|
|
- child=item->child;
|
|
|
- while (child && !fail)
|
|
|
- {
|
|
|
- print_value(child,depth+1,fmt,p);
|
|
|
- p->offset=update(p);
|
|
|
- if (child->next) {len=fmt?2:1;ptr=ensure(p,len+1);if (!ptr) return 0;*ptr++=',';if(fmt)*ptr++=' ';*ptr=0;p->offset+=len;}
|
|
|
- child=child->next;
|
|
|
- }
|
|
|
- ptr=ensure(p,2);if (!ptr) return 0; *ptr++=']';*ptr=0;
|
|
|
- out=(p->buffer)+i;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- /* 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,0);
|
|
|
- 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 (!fail) out=(char*)cJSON_malloc(len);
|
|
|
- /* If that fails, we fail. */
|
|
|
- if (!out) fail=1;
|
|
|
+ /* How many entries in the array? */
|
|
|
+ while (child)
|
|
|
+ {
|
|
|
+ numentries++;
|
|
|
+ child = child->next;
|
|
|
+ }
|
|
|
|
|
|
- /* Handle failure. */
|
|
|
- if (fail)
|
|
|
- {
|
|
|
- for (i=0;i<numentries;i++) if (entries[i]) cJSON_free(entries[i]);
|
|
|
- cJSON_free(entries);
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- /* Compose the output array. */
|
|
|
- *out='[';
|
|
|
- ptr=out+1;*ptr=0;
|
|
|
- for (i=0;i<numentries;i++)
|
|
|
- {
|
|
|
- tmplen=strlen(entries[i]);memcpy(ptr,entries[i],tmplen);ptr+=tmplen;
|
|
|
- if (i!=numentries-1) {*ptr++=',';if(fmt)*ptr++=' ';*ptr=0;}
|
|
|
- cJSON_free(entries[i]);
|
|
|
- }
|
|
|
- cJSON_free(entries);
|
|
|
- *ptr++=']';*ptr++=0;
|
|
|
- }
|
|
|
- return out;
|
|
|
+ /* Explicitly handle numentries == 0 */
|
|
|
+ if (!numentries)
|
|
|
+ {
|
|
|
+ if (p)
|
|
|
+ {
|
|
|
+ out = ensure(p, 3);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ out = (char*)cJSON_malloc(3);
|
|
|
+ }
|
|
|
+ if (out)
|
|
|
+ {
|
|
|
+ strcpy(out,"[]");
|
|
|
+ }
|
|
|
+
|
|
|
+ return out;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (p)
|
|
|
+ {
|
|
|
+ /* Compose the output array. */
|
|
|
+ /* opening square bracket */
|
|
|
+ i = p->offset;
|
|
|
+ ptr = ensure(p, 1);
|
|
|
+ if (!ptr)
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ *ptr = '[';
|
|
|
+ p->offset++;
|
|
|
+
|
|
|
+ child = item->child;
|
|
|
+ while (child && !fail)
|
|
|
+ {
|
|
|
+ print_value(child, depth + 1, fmt, p);
|
|
|
+ p->offset = update(p);
|
|
|
+ if (child->next)
|
|
|
+ {
|
|
|
+ len = fmt ? 2 : 1;
|
|
|
+ ptr = ensure(p, len + 1);
|
|
|
+ if (!ptr)
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ *ptr++ = ',';
|
|
|
+ if(fmt)
|
|
|
+ {
|
|
|
+ *ptr++ = ' ';
|
|
|
+ }
|
|
|
+ *ptr = 0;
|
|
|
+ p->offset += len;
|
|
|
+ }
|
|
|
+ child = child->next;
|
|
|
+ }
|
|
|
+ ptr = ensure(p, 2);
|
|
|
+ if (!ptr)
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ *ptr++ = ']';
|
|
|
+ *ptr = '\0';
|
|
|
+ out = (p->buffer) + i;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ /* Allocate an array to hold the pointers to all printed values */
|
|
|
+ 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, 0);
|
|
|
+ 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 (!fail)
|
|
|
+ {
|
|
|
+ out = (char*)cJSON_malloc(len);
|
|
|
+ }
|
|
|
+ /* If that fails, we fail. */
|
|
|
+ if (!out)
|
|
|
+ {
|
|
|
+ fail = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Handle failure. */
|
|
|
+ if (fail)
|
|
|
+ {
|
|
|
+ /* free all the entries in the array */
|
|
|
+ for (i = 0; i < numentries; i++)
|
|
|
+ {
|
|
|
+ if (entries[i])
|
|
|
+ {
|
|
|
+ cJSON_free(entries[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ cJSON_free(entries);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Compose the output array. */
|
|
|
+ *out='[';
|
|
|
+ ptr = out + 1;
|
|
|
+ *ptr = '\0';
|
|
|
+ for (i = 0; i < numentries; i++)
|
|
|
+ {
|
|
|
+ tmplen = strlen(entries[i]);
|
|
|
+ memcpy(ptr, entries[i], tmplen);
|
|
|
+ ptr += tmplen;
|
|
|
+ if (i != (numentries - 1))
|
|
|
+ {
|
|
|
+ *ptr++ = ',';
|
|
|
+ if(fmt)
|
|
|
+ {
|
|
|
+ *ptr++ = ' ';
|
|
|
+ }
|
|
|
+ *ptr = 0;
|
|
|
+ }
|
|
|
+ cJSON_free(entries[i]);
|
|
|
+ }
|
|
|
+ cJSON_free(entries);
|
|
|
+ *ptr++ = ']';
|
|
|
+ *ptr++ = '\0';
|
|
|
+ }
|
|
|
+
|
|
|
+ return out;
|
|
|
}
|
|
|
|
|
|
/* Build an object from the text. */
|