annotate jansson/src/dump.c @ 57:82b832e1875d

vera: import 1.3.0, closes #728
author David Demelier <markand@malikania.fr>
date Tue, 21 Nov 2017 12:19:28 +0100
parents 0047655db1aa
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * Copyright (c) 2009-2014 Petri Lehtinen <petri@digip.org>
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Jansson is free software; you can redistribute it and/or modify
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 * it under the terms of the MIT license. See LICENSE for details.
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 */
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
7
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 #ifndef _GNU_SOURCE
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 #define _GNU_SOURCE
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 #endif
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
11
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 #include <stdio.h>
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 #include <stdlib.h>
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 #include <string.h>
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 #include <assert.h>
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
16
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 #include "jansson.h"
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
18 #include "jansson_private.h"
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include "strbuffer.h"
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include "utf.h"
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #define MAX_INTEGER_STR_LENGTH 100
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #define MAX_REAL_STR_LENGTH 100
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #define FLAGS_TO_INDENT(f) ((f) & 0x1F)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #define FLAGS_TO_PRECISION(f) (((f) >> 11) & 0x1F)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 struct object_key {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 size_t serial;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 const char *key;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 };
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 static int dump_to_strbuffer(const char *buffer, size_t size, void *data)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 return strbuffer_append_bytes((strbuffer_t *)data, buffer, size);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 static int dump_to_file(const char *buffer, size_t size, void *data)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 FILE *dest = (FILE *)data;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 if(fwrite(buffer, size, 1, dest) != 1)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 return 0;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
45
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 /* 32 spaces (the maximum indentation size) */
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 static const char whitespace[] = " ";
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 static int dump_indent(size_t flags, int depth, int space, json_dump_callback_t dump, void *data)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 if(FLAGS_TO_INDENT(flags) > 0)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 int i, ws_count = FLAGS_TO_INDENT(flags);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 if(dump("\n", 1, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
57
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 for(i = 0; i < depth; i++)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 if(dump(whitespace, ws_count, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 else if(space && !(flags & JSON_COMPACT))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 return dump(" ", 1, data);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 return 0;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 static int dump_string(const char *str, size_t len, json_dump_callback_t dump, void *data, size_t flags)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 const char *pos, *end, *lim;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 int32_t codepoint;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
75
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 if(dump("\"", 1, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
78
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 end = pos = str;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 lim = str + len;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 while(1)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 const char *text;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 char seq[13];
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 int length;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
86
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 while(end < lim)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 end = utf8_iterate(pos, lim - pos, &codepoint);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 if(!end)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
92
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 /* mandatory escape or control char */
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 if(codepoint == '\\' || codepoint == '"' || codepoint < 0x20)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 break;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 /* slash */
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 if((flags & JSON_ESCAPE_SLASH) && codepoint == '/')
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 break;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
100
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 /* non-ASCII */
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 if((flags & JSON_ENSURE_ASCII) && codepoint > 0x7F)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 break;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 pos = end;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
107
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 if(pos != str) {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 if(dump(str, pos - str, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 if(end == pos)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 break;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 /* handle \, /, ", and control codes */
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 length = 2;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 switch(codepoint)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 case '\\': text = "\\\\"; break;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 case '\"': text = "\\\""; break;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 case '\b': text = "\\b"; break;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 case '\f': text = "\\f"; break;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 case '\n': text = "\\n"; break;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 case '\r': text = "\\r"; break;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 case '\t': text = "\\t"; break;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 case '/': text = "\\/"; break;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 default:
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 /* codepoint is in BMP */
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 if(codepoint < 0x10000)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 sprintf(seq, "\\u%04X", codepoint);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 length = 6;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 /* not in BMP -> construct a UTF-16 surrogate pair */
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 else
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 int32_t first, last;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
141
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 codepoint -= 0x10000;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 first = 0xD800 | ((codepoint & 0xffc00) >> 10);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 last = 0xDC00 | (codepoint & 0x003ff);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
145
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 sprintf(seq, "\\u%04X\\u%04X", first, last);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 length = 12;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
149
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 text = seq;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 break;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
154
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 if(dump(text, length, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
157
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 str = pos = end;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
160
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 return dump("\"", 1, data);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
163
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 static int object_key_compare_keys(const void *key1, const void *key2)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 return strcmp(((const struct object_key *)key1)->key,
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 ((const struct object_key *)key2)->key);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
169
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 static int object_key_compare_serials(const void *key1, const void *key2)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 size_t a = ((const struct object_key *)key1)->serial;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 size_t b = ((const struct object_key *)key2)->serial;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
174
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 return a < b ? -1 : a == b ? 0 : 1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
177
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 static int do_dump(const json_t *json, size_t flags, int depth,
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 json_dump_callback_t dump, void *data)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 if(!json)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
183
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 switch(json_typeof(json)) {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 case JSON_NULL:
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 return dump("null", 4, data);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
187
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 case JSON_TRUE:
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 return dump("true", 4, data);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
190
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 case JSON_FALSE:
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 return dump("false", 5, data);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
193
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 case JSON_INTEGER:
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 char buffer[MAX_INTEGER_STR_LENGTH];
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 int size;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 size = snprintf(buffer, MAX_INTEGER_STR_LENGTH,
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 "%" JSON_INTEGER_FORMAT,
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 json_integer_value(json));
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 if(size < 0 || size >= MAX_INTEGER_STR_LENGTH)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
204
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 return dump(buffer, size, data);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
207
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 case JSON_REAL:
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 char buffer[MAX_REAL_STR_LENGTH];
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 int size;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 double value = json_real_value(json);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
213
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 size = jsonp_dtostr(buffer, MAX_REAL_STR_LENGTH, value,
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 FLAGS_TO_PRECISION(flags));
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 if(size < 0)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
218
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 return dump(buffer, size, data);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
221
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 case JSON_STRING:
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 return dump_string(json_string_value(json), json_string_length(json), dump, data, flags);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
224
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 case JSON_ARRAY:
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 int i;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 int n;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 json_array_t *array;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
230
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 /* detect circular references */
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 array = json_to_array(json);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 if(array->visited)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 goto array_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 array->visited = 1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
236
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 n = json_array_size(json);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
238
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 if(dump("[", 1, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 goto array_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 if(n == 0) {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 array->visited = 0;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 return dump("]", 1, data);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 if(dump_indent(flags, depth + 1, 0, dump, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 goto array_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
247
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 for(i = 0; i < n; ++i) {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 if(do_dump(json_array_get(json, i), flags, depth + 1,
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 dump, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 goto array_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
252
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 if(i < n - 1)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 if(dump(",", 1, data) ||
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 dump_indent(flags, depth + 1, 1, dump, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 goto array_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 else
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 if(dump_indent(flags, depth, 0, dump, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 goto array_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
265
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 array->visited = 0;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 return dump("]", 1, data);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
268
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 array_error:
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 array->visited = 0;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
273
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 case JSON_OBJECT:
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 json_object_t *object;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 void *iter;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 const char *separator;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 int separator_length;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
280
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 if(flags & JSON_COMPACT) {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 separator = ":";
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 separator_length = 1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 else {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 separator = ": ";
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 separator_length = 2;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
289
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 /* detect circular references */
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 object = json_to_object(json);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 if(object->visited)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 goto object_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 object->visited = 1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
295
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 iter = json_object_iter((json_t *)json);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
297
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 if(dump("{", 1, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 goto object_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 if(!iter) {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 object->visited = 0;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 return dump("}", 1, data);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 if(dump_indent(flags, depth + 1, 0, dump, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 goto object_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
306
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 if(flags & JSON_SORT_KEYS || flags & JSON_PRESERVE_ORDER)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 struct object_key *keys;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 size_t size, i;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 int (*cmp_func)(const void *, const void *);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
312
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 size = json_object_size(json);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 keys = jsonp_malloc(size * sizeof(struct object_key));
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 if(!keys)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 goto object_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
317
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 i = 0;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 while(iter)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
320 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 keys[i].serial = hashtable_iter_serial(iter);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
322 keys[i].key = json_object_iter_key(iter);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 iter = json_object_iter_next((json_t *)json, iter);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 i++;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 assert(i == size);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
327
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 if(flags & JSON_SORT_KEYS)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
329 cmp_func = object_key_compare_keys;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 else
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 cmp_func = object_key_compare_serials;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
332
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 qsort(keys, size, sizeof(struct object_key), cmp_func);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
334
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
335 for(i = 0; i < size; i++)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
336 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
337 const char *key;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
338 json_t *value;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
339
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
340 key = keys[i].key;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
341 value = json_object_get(json, key);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 assert(value);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
343
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
344 dump_string(key, strlen(key), dump, data, flags);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 if(dump(separator, separator_length, data) ||
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 do_dump(value, flags, depth + 1, dump, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
347 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
348 jsonp_free(keys);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
349 goto object_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
351
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 if(i < size - 1)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
354 if(dump(",", 1, data) ||
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
355 dump_indent(flags, depth + 1, 1, dump, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
356 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
357 jsonp_free(keys);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
358 goto object_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
361 else
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
362 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 if(dump_indent(flags, depth, 0, dump, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
364 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
365 jsonp_free(keys);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 goto object_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
367 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
368 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
369 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
370
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 jsonp_free(keys);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
372 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 else
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 /* Don't sort keys */
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
376
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 while(iter)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
378 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 void *next = json_object_iter_next((json_t *)json, iter);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
380 const char *key = json_object_iter_key(iter);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
381
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
382 dump_string(key, strlen(key), dump, data, flags);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
383 if(dump(separator, separator_length, data) ||
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
384 do_dump(json_object_iter_value(iter), flags, depth + 1,
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
385 dump, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
386 goto object_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
387
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
388 if(next)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
390 if(dump(",", 1, data) ||
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 dump_indent(flags, depth + 1, 1, dump, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
392 goto object_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
393 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
394 else
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
395 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
396 if(dump_indent(flags, depth, 0, dump, data))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
397 goto object_error;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
398 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
399
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
400 iter = next;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
401 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
402 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
403
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
404 object->visited = 0;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
405 return dump("}", 1, data);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
406
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
407 object_error:
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
408 object->visited = 0;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
409 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
410 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
411
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
412 default:
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
413 /* not reached */
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
414 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
415 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
416 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
417
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
418 char *json_dumps(const json_t *json, size_t flags)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
419 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
420 strbuffer_t strbuff;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
421 char *result;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
422
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
423 if(strbuffer_init(&strbuff))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
424 return NULL;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
425
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
426 if(json_dump_callback(json, dump_to_strbuffer, (void *)&strbuff, flags))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
427 result = NULL;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
428 else
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
429 result = jsonp_strdup(strbuffer_value(&strbuff));
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
430
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
431 strbuffer_close(&strbuff);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
432 return result;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
433 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
434
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
435 int json_dumpf(const json_t *json, FILE *output, size_t flags)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
436 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
437 return json_dump_callback(json, dump_to_file, (void *)output, flags);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
438 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
439
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
440 int json_dump_file(const json_t *json, const char *path, size_t flags)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
441 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
442 int result;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
443
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
444 FILE *output = fopen(path, "w");
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
445 if(!output)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
446 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
447
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
448 result = json_dumpf(json, output, flags);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
449
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
450 fclose(output);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
451 return result;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
452 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
453
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
454 int json_dump_callback(const json_t *json, json_dump_callback_t callback, void *data, size_t flags)
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
455 {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
456 if(!(flags & JSON_ENCODE_ANY)) {
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
457 if(!json_is_array(json) && !json_is_object(json))
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
458 return -1;
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
459 }
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
460
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
461 return do_dump(json, flags, 0, callback, data);
0047655db1aa jansson: import 2.7
David Demelier <markand@malikania.fr>
parents:
diff changeset
462 }