|  | @@ -1045,83 +1045,169 @@ static const char *parse_array(cJSON *item,const char *value,const char **ep)
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  /* Render an array to text */
 |  |  /* 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. */
 |  |  /* Build an object from the text. */
 |