5 #ifndef SPA_UTILS_JSON_H
6 #define SPA_UTILS_JSON_H
25 #define SPA_API_JSON SPA_API_IMPL
27 #define SPA_API_JSON static inline
45 #define SPA_JSON_ERROR_FLAG 0x100
50 #define SPA_JSON_INIT(data,size) ((struct spa_json) { (data), (data)+(size), NULL, 0, 0 })
56 #define SPA_JSON_ENTER(iter) ((struct spa_json) { (iter)->cur, (iter)->end, (iter), (iter)->state & 0xff0, 0 })
63 #define SPA_JSON_SAVE(iter) ((struct spa_json) { (iter)->cur, (iter)->end, NULL, (iter)->state, 0 })
70 #define SPA_JSON_START(iter,p) ((struct spa_json) { (p), (iter)->end, NULL, 0, 0 })
81 int utf8_remain = 0, err = 0;
83 __NONE, __STRUCT, __BARE, __STRING, __UTF8, __ESC, __COMMENT,
85 __PREV_ARRAY_FLAG = 0x20,
90 __ERROR_INVALID_ARRAY_SEPARATOR,
91 __ERROR_EXPECTED_OBJECT_KEY,
92 __ERROR_EXPECTED_OBJECT_VALUE,
93 __ERROR_TOO_DEEP_NESTING,
94 __ERROR_EXPECTED_ARRAY_CLOSE,
95 __ERROR_EXPECTED_OBJECT_CLOSE,
96 __ERROR_MISMATCHED_BRACKET,
97 __ERROR_ESCAPE_NOT_ALLOWED,
98 __ERROR_CHARACTERS_NOT_ALLOWED,
99 __ERROR_INVALID_ESCAPE,
100 __ERROR_INVALID_STATE,
101 __ERROR_UNFINISHED_STRING,
103 uint64_t array_stack[8] = {0};
110 for (; iter->
cur < iter->
end; iter->
cur++) {
111 unsigned char cur = (
unsigned char)*iter->
cur;
114 #define
_SPA_ERROR(reason) { err = __ERROR_ ## reason;
goto error; }
116 flag = iter->
state & __FLAGS;
117 switch (iter->
state & ~__FLAGS) {
119 flag &= ~(__KEY_FLAG | __PREV_ARRAY_FLAG);
120 iter->
state = __STRUCT | flag;
125 case '\0':
case '\t':
case ' ':
case '\r':
case '\n':
case ',':
128 if (flag & __ARRAY_FLAG)
130 if (!(flag & __KEY_FLAG))
132 iter->
state |= __SUB_FLAG;
135 iter->
state = __COMMENT | flag;
138 if (flag & __KEY_FLAG)
140 if (!(flag & __ARRAY_FLAG))
143 iter->
state = __STRING | flag;
146 if (!(flag & __ARRAY_FLAG)) {
151 if ((iter->
state & __SUB_FLAG) && !(flag & __KEY_FLAG))
155 iter->
state = __STRUCT | __SUB_FLAG | flag;
162 if (iter->
depth == 0) {
165 uint64_t mask = 1ULL << ((iter->
depth-1) & 0x3f);
173 if (++iter->
depth > 1)
178 if ((flag & __ARRAY_FLAG) &&
cur !=
']')
180 if (!(flag & __ARRAY_FLAG) &&
cur !=
'}')
182 if (flag & __KEY_FLAG) {
186 iter->
state = __STRUCT | __SUB_FLAG | flag;
187 if (iter->
depth == 0) {
195 if (iter->
depth == 0) {
198 uint64_t mask = 1ULL << ((iter->
depth-1) & 0x3f);
211 if (!(
cur >= 32 &&
cur <= 126))
213 if (flag & __KEY_FLAG)
215 if (!(flag & __ARRAY_FLAG))
218 iter->
state = __BARE | flag;
224 case '\t':
case ' ':
case '\r':
case '\n':
225 case '"':
case '#':
case '{':
case '[':
226 case ':':
case ',':
case '=':
case ']':
case '}':
227 iter->
state = __STRUCT | flag;
230 return iter->
cur - *value;
236 if (
cur >= 32 &&
cur <= 126)
243 iter->
state = __ESC | flag;
246 iter->
state = __STRUCT | flag;
249 return ++iter->
cur - *value;
258 iter->
state = __UTF8 | flag;
261 if (
cur >= 32 &&
cur <= 127)
268 if (--utf8_remain == 0)
269 iter->
state = __STRING | flag;
277 case '"':
case '\\':
case '/':
case 'b':
case 'f':
278 case 'n':
case 'r':
case 't':
case 'u':
279 iter->
state = __STRING | flag;
287 case '\n':
case '\r':
288 iter->
state = __STRUCT | flag;
302 switch (iter->
state & ~__FLAGS) {
303 case __STRING:
case __UTF8:
case __ESC:
313 if ((iter->
state & __SUB_FLAG) && (iter->
state & __KEY_FLAG)) {
318 if ((iter->
state & ~__FLAGS) != __STRUCT) {
319 iter->
state = __STRUCT | (iter->
state & __FLAGS);
320 return iter->
cur - *value;
345 static const char *reasons[] = {
347 "Invalid array separator",
348 "Expected object key",
349 "Expected object value",
351 "Expected array close bracket",
352 "Expected object close brace",
353 "Mismatched bracket",
354 "Escape not allowed",
355 "Character not allowed",
359 "Expected key separator",
366 int linepos = 1, colpos = 1, code;
369 for (l = p = start; p && p != iter->
cur; ++p) {
383 loc->
reason = code == 0 ? strerror(errno) : reasons[code];