32 #include "jsonparse.h" 38 push(
struct jsonparse_state *state,
char c)
40 state->stack[state->depth] = c;
43 return state->depth < JSONPARSE_MAX_DEPTH;
47 modify(
struct jsonparse_state *state,
char c)
49 if(state->depth > 0) {
50 state->stack[state->depth - 1] = c;
55 pop(
struct jsonparse_state *state)
57 if(state->depth == 0) {
58 return JSON_TYPE_ERROR;
61 state->vtype = state->stack[state->depth];
62 return state->stack[state->depth];
69 atomic(
struct jsonparse_state *state,
char type)
75 state->vstart = state->pos;
76 if(type == JSON_TYPE_STRING || type == JSON_TYPE_PAIR_NAME) {
77 while((c = state->json[state->pos++]) && c !=
'"') {
83 state->error = JSON_ERROR_SYNTAX;
84 return JSON_TYPE_ERROR;
86 state->vlen = state->pos - state->vstart - 1;
87 }
else if(type == JSON_TYPE_NUMBER) {
89 c = state->json[state->pos];
90 if((c < '0' || c >
'9') && c !=
'.') {
98 state->vlen = state->pos - state->vstart;
99 }
else if(type == JSON_TYPE_NULL || type == JSON_TYPE_TRUE || type == JSON_TYPE_FALSE) {
102 case JSON_TYPE_NULL: str =
"null";
break;
103 case JSON_TYPE_TRUE: str =
"true";
break;
104 case JSON_TYPE_FALSE: str =
"false";
break;
105 default: str =
"";
break;
108 while ((c = state->json[state->pos]) && c !=
' ' && c !=
',' && c !=
']' && c !=
'}') {
112 state->vlen = state->pos - state->vstart;
114 len = state->vlen > len ? state->vlen : len;
116 if (strncmp(str, &state->json[state->vstart], len) != 0) {
117 state->error = JSON_ERROR_SYNTAX;
118 return JSON_TYPE_ERROR;
127 skip_ws(
struct jsonparse_state *state)
131 while(state->pos < state->len &&
132 ((c = state->json[state->pos]) ==
' ' || c ==
'\n')) {
138 is_atomic(
struct jsonparse_state *state)
140 char v = state->vtype;
141 if(v ==
'N' || v ==
'"' || v ==
'0' || v ==
'n' || v ==
't' || v ==
'f') {
149 jsonparse_setup(
struct jsonparse_state *state,
const char *json,
int len)
161 jsonparse_next(
struct jsonparse_state *state)
168 c = state->json[state->pos];
169 s = jsonparse_get_type(state);
175 if((s == 0 && v == 0) || s ==
'[' || s ==
':') {
178 state->error = JSON_ERROR_UNEXPECTED_OBJECT;
179 return JSON_TYPE_ERROR;
183 if((s ==
':' && v !=
',' && v != 0 ) || (s ==
'{' && v == 0)) {
186 state->error = JSON_ERROR_UNEXPECTED_END_OF_OBJECT;
187 return JSON_TYPE_ERROR;
191 if(s ==
'[' && v !=
',') {
194 state->error = JSON_ERROR_UNEXPECTED_END_OF_ARRAY;
195 return JSON_TYPE_ERROR;
199 if(s ==
'{' && v ==
'N') {
203 state->error = JSON_ERROR_SYNTAX;
204 return JSON_TYPE_ERROR;
206 return jsonparse_next(state);
208 if(s ==
':' && v != 0) {
211 }
else if(s ==
'[') {
214 state->error = JSON_ERROR_SYNTAX;
215 return JSON_TYPE_ERROR;
219 if((s == 0 && v == 0) || s ==
'{' || s ==
'[' || s ==
':') {
220 return atomic(state, c = (s ==
'{' ? JSON_TYPE_PAIR_NAME : c));
222 state->error = JSON_ERROR_UNEXPECTED_STRING;
223 return JSON_TYPE_ERROR;
227 if((s == 0 && v == 0) || s ==
'[' || s ==
':') {
230 state->error = JSON_ERROR_UNEXPECTED_ARRAY;
231 return JSON_TYPE_ERROR;
235 if(v == 0 || state->depth > 0) {
236 state->error = JSON_ERROR_SYNTAX;
238 return JSON_TYPE_ERROR;
240 if(s == 0 || s ==
':' || s ==
'[') {
241 if (v != 0 && v !=
',') {
242 state->error = JSON_ERROR_SYNTAX;
243 return JSON_TYPE_ERROR;
245 if(c ==
'-' || (c <= '9' && c >=
'0')) {
246 return atomic(state, JSON_TYPE_NUMBER);
247 }
else if(c ==
'n') {
248 return atomic(state, JSON_TYPE_NULL);
249 }
else if(c ==
't') {
250 return atomic(state, JSON_TYPE_TRUE);
251 }
else if(c ==
'f') {
252 return atomic(state, JSON_TYPE_FALSE);
254 state->error = JSON_ERROR_SYNTAX;
255 return JSON_TYPE_ERROR;
257 }
else if(s ==
'{') {
258 state->error = JSON_ERROR_SYNTAX;
259 return JSON_TYPE_ERROR;
270 jsonparse_copy_value(
struct jsonparse_state *state,
char *str,
int size)
275 if(!is_atomic(state)) {
278 for(i = 0, o = 0; i < state->vlen && o < size - 1; i++) {
279 c = state->json[state->vstart + i];
282 switch(state->json[state->vstart + i]) {
283 case '"': str[o++] =
'"';
break;
284 case '\\': str[o++] =
'\\';
break;
285 case '/': str[o++] =
'/';
break;
286 case 'b': str[o++] =
'\b';
break;
287 case 'f': str[o++] =
'\f';
break;
288 case 'n': str[o++] =
'\n';
break;
289 case 'r': str[o++] =
'\r';
break;
290 case 't': str[o++] =
'\t';
break;
301 jsonparse_get_value_as_int(
struct jsonparse_state *state)
303 if(state->vtype != JSON_TYPE_NUMBER) {
306 return atoi(&state->json[state->vstart]);
310 jsonparse_get_value_as_long(
struct jsonparse_state *state)
312 if(state->vtype != JSON_TYPE_NUMBER) {
315 return atol(&state->json[state->vstart]);
321 jsonparse_strcmp_value(
struct jsonparse_state *state,
const char *str)
323 if(!is_atomic(state)) {
326 return strncmp(str, &state->json[state->vstart], state->vlen);
330 jsonparse_get_len(
struct jsonparse_state *state)
336 jsonparse_get_type(
struct jsonparse_state *state)
338 if(state->depth == 0) {
341 return state->stack[state->depth - 1];
345 jsonparse_has_next(
struct jsonparse_state *state)
347 return state->pos < state->len;