5 #ifndef SPA_UTILS_JSON_H
6 #define SPA_UTILS_JSON_H
37 #define SPA_JSON_ERROR_FLAG 0x100
42 #define SPA_JSON_INIT(data,size) ((struct spa_json) { (data), (data)+(size), 0, 0, 0 })
48 #define SPA_JSON_ENTER(iter) ((struct spa_json) { (iter)->cur, (iter)->end, (iter), (iter)->state & 0xff0, 0 })
55 #define SPA_JSON_SAVE(iter) ((struct spa_json) { (iter)->cur, (iter)->end, NULL, (iter)->state, 0 })
61 int utf8_remain = 0, err = 0;
63 __NONE, __STRUCT, __BARE, __STRING, __UTF8, __ESC, __COMMENT,
65 __PREV_ARRAY_FLAG = 0x20,
70 __ERROR_INVALID_ARRAY_SEPARATOR,
71 __ERROR_EXPECTED_OBJECT_KEY,
72 __ERROR_EXPECTED_OBJECT_VALUE,
73 __ERROR_TOO_DEEP_NESTING,
74 __ERROR_EXPECTED_ARRAY_CLOSE,
75 __ERROR_EXPECTED_OBJECT_CLOSE,
76 __ERROR_MISMATCHED_BRACKET,
77 __ERROR_ESCAPE_NOT_ALLOWED,
78 __ERROR_CHARACTERS_NOT_ALLOWED,
79 __ERROR_INVALID_ESCAPE,
80 __ERROR_INVALID_STATE,
81 __ERROR_UNFINISHED_STRING,
83 uint64_t array_stack[8] = {0};
90 for (; iter->
cur < iter->
end; iter->
cur++) {
91 unsigned char cur = (
unsigned char)*iter->
cur;
94 #define
_SPA_ERROR(reason) { err = __ERROR_ ## reason;
goto error; }
96 flag = iter->
state & __FLAGS;
97 switch (iter->
state & ~__FLAGS) {
99 flag &= ~(__KEY_FLAG | __PREV_ARRAY_FLAG);
100 iter->
state = __STRUCT | flag;
105 case '\0':
case '\t':
case ' ':
case '\r':
case '\n':
case ',':
108 if (flag & __ARRAY_FLAG)
110 if (!(flag & __KEY_FLAG))
112 iter->
state |= __SUB_FLAG;
115 iter->
state = __COMMENT | flag;
118 if (flag & __KEY_FLAG)
120 if (!(flag & __ARRAY_FLAG))
123 iter->
state = __STRING | flag;
126 if (!(flag & __ARRAY_FLAG)) {
131 if ((iter->
state & __SUB_FLAG) && !(flag & __KEY_FLAG))
135 iter->
state = __STRUCT | __SUB_FLAG | flag;
142 if (iter->
depth == 0) {
145 uint64_t mask = 1ULL << ((iter->
depth-1) & 0x3f);
153 if (++iter->
depth > 1)
158 if ((flag & __ARRAY_FLAG) &&
cur !=
']')
160 if (!(flag & __ARRAY_FLAG) &&
cur !=
'}')
162 if (flag & __KEY_FLAG) {
166 iter->
state = __STRUCT | __SUB_FLAG | flag;
167 if (iter->
depth == 0) {
175 if (iter->
depth == 0) {
178 uint64_t mask = 1ULL << ((iter->
depth-1) & 0x3f);
191 if (!(
cur >= 32 &&
cur <= 126))
193 if (flag & __KEY_FLAG)
195 if (!(flag & __ARRAY_FLAG))
198 iter->
state = __BARE | flag;
204 case '\t':
case ' ':
case '\r':
case '\n':
206 case ':':
case ',':
case '=':
case ']':
case '}':
207 iter->
state = __STRUCT | flag;
210 return iter->
cur - *value;
216 if (
cur >= 32 &&
cur <= 126)
223 iter->
state = __ESC | flag;
226 iter->
state = __STRUCT | flag;
229 return ++iter->
cur - *value;
238 iter->
state = __UTF8 | flag;
241 if (
cur >= 32 &&
cur <= 127)
248 if (--utf8_remain == 0)
249 iter->
state = __STRING | flag;
255 case '"':
case '\\':
case '/':
case 'b':
case 'f':
256 case 'n':
case 'r':
case 't':
case 'u':
257 iter->
state = __STRING | flag;
263 case '\n':
case '\r':
264 iter->
state = __STRUCT | flag;
275 switch (iter->
state & ~__FLAGS) {
276 case __STRING:
case __UTF8:
case __ESC:
284 if ((iter->
state & __SUB_FLAG) && (iter->
state & __KEY_FLAG)) {
289 if ((iter->
state & ~__FLAGS) != __STRUCT) {
290 iter->
state = __STRUCT | (iter->
state & __FLAGS);
291 return iter->
cur - *value;
316 static const char *reasons[] = {
318 "Invalid array separator",
319 "Expected object key",
320 "Expected object value",
322 "Expected array close bracket",
323 "Expected object close brace",
324 "Mismatched bracket",
325 "Escape not allowed",
326 "Character not allowed",
330 "Expected key separator",
337 int linepos = 1, colpos = 1, code;
340 for (l = p = start; p && p != iter->
cur; ++p) {
354 loc->
reason = code == 0 ? strerror(errno) : reasons[code];
373 return len > 0 && (*val ==
'{' || *val ==
'[');
390 return sub.
cur + 1 - value;
396 return len > 0 && *val ==
'{';
406 return len > 0 && *val ==
'[';
416 return len == 4 && strncmp(val,
"null", 4) == 0;
426 if (len <= 0 || len >= (
int)
sizeof(buf))
429 for (pos = 0; pos < len; ++pos) {
431 case '+':
case '-':
case '0' ...
'9':
case '.':
case 'e':
case 'E':
break;
436 memcpy(buf, val, len);
440 return len > 0 &&
end == buf + len;
462 else if (val == -INFINITY)
476 if (len <= 0 || len >= (
int)
sizeof(buf))
479 memcpy(buf, val, len);
482 *result = strtol(buf, &
end, 0);
483 return len > 0 &&
end == buf + len;
502 return len == 4 && strncmp(val,
"true", 4) == 0;
507 return len == 5 && strncmp(val,
"false", 5) == 0;
535 return len > 1 && *val ==
'"';
542 for (i = 0; i < num; i++) {
544 if (v >=
'0' && v <=
'9')
546 else if (v >=
'a' && v <=
'f')
548 else if (v >=
'A' && v <=
'F')
552 *res = (*res << 4) | v;
564 memmove(result, val, len);
567 for (p = val+1; p < val + len; p++) {
580 else if (*p ==
'u') {
581 uint8_t prefix[] = { 0, 0xc0, 0xe0, 0xf0 };
582 uint32_t idx, n, v, cp, enc[] = { 0x80, 0x800, 0x10000 };
583 if (val + len - p < 5 ||
590 if (cp >= 0xd800 && cp <= 0xdbff) {
591 if (val + len - p < 7 ||
592 p[1] !=
'\\' || p[2] !=
'u' ||
594 v < 0xdc00 || v > 0xdfff)
597 cp = 0x010000 + (((cp & 0x3ff) << 10) | (v & 0x3ff));
598 }
else if (cp >= 0xdc00 && cp <= 0xdfff)
601 for (idx = 0; idx < 3; idx++)
604 for (n = idx; n > 0; n--, cp >>= 6)
605 result[n] = (cp | 0x80) & 0xbf;
606 *result++ = (cp | prefix[idx]) & 0xff;
610 }
else if (*p ==
'\"') {
637 static const char hex[] = {
"0123456789abcdef" };
638 #define __PUT(c) { if (len < size) *str++ = c; len++; }
662 if (*val > 0 && *val < 0x20) {
665 __PUT(hex[((*val)>>4)&0xf]);
__PUT(hex[(*val)&0xf]);