|
@@ -865,15 +865,66 @@ cJSON *cJSON_Parse(const char *value)
|
|
|
return cJSON_ParseWithOpts(value, 0, 0);
|
|
|
}
|
|
|
|
|
|
+#define min(a, b) ((a < b) ? a : b)
|
|
|
+
|
|
|
+static unsigned char *print(const cJSON * const item, cjbool format)
|
|
|
+{
|
|
|
+ printbuffer buffer[1];
|
|
|
+ unsigned char *printed = NULL;
|
|
|
+
|
|
|
+ memset(buffer, 0, sizeof(buffer));
|
|
|
+
|
|
|
+ /* create buffer */
|
|
|
+ buffer->buffer = (unsigned char*) cJSON_malloc(256);
|
|
|
+ if (buffer->buffer == NULL)
|
|
|
+ {
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* print the value */
|
|
|
+ if (print_value(item, 0, format, buffer) == NULL)
|
|
|
+ {
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+ buffer->offset = update(buffer); /* update the length of the string */
|
|
|
+
|
|
|
+ /* copy the buffer over to a new one */
|
|
|
+ printed = (unsigned char*) cJSON_malloc(buffer->offset + 1);
|
|
|
+ if (printed == NULL)
|
|
|
+ {
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+ strncpy((char*)printed, (char*)buffer->buffer, min(buffer->length, buffer->offset + 1));
|
|
|
+ printed[buffer->offset] = '\0'; /* just to be sure */
|
|
|
+
|
|
|
+ /* free the buffer */
|
|
|
+ cJSON_free(buffer->buffer);
|
|
|
+
|
|
|
+ return printed;
|
|
|
+
|
|
|
+fail:
|
|
|
+ if (buffer->buffer != NULL)
|
|
|
+ {
|
|
|
+ cJSON_free(buffer->buffer);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (printed != NULL)
|
|
|
+ {
|
|
|
+ cJSON_free(printed);
|
|
|
+ }
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
/* Render a cJSON item/entity/structure to text. */
|
|
|
char *cJSON_Print(const cJSON *item)
|
|
|
{
|
|
|
- return (char*)print_value(item, 0, 1, 0);
|
|
|
+ return (char*)print(item, true);
|
|
|
}
|
|
|
|
|
|
char *cJSON_PrintUnformatted(const cJSON *item)
|
|
|
{
|
|
|
- return (char*)print_value(item, 0, 0, 0);
|
|
|
+ return (char*)print(item, false);
|
|
|
}
|
|
|
|
|
|
char *cJSON_PrintBuffered(const cJSON *item, int prebuffer, cjbool fmt)
|