32 #include "jsonparse.h" 39 push(
struct jsonparse_state *state,
char c)
41 if(state->depth < JSONPARSE_MAX_DEPTH) {
42 state->stack[state->depth] = c;
52 modify(
struct jsonparse_state *state,
char c)
54 if(state->depth > 0) {
55 state->stack[state->depth - 1] = c;
63 pop(
struct jsonparse_state *state)
65 if(state->depth == 0) {
69 state->vtype = state->stack[state->depth];
77 atomic(
struct jsonparse_state *state,
char type)
83 state->vstart = state->pos;
84 if(type == JSON_TYPE_STRING || type == JSON_TYPE_PAIR_NAME) {
85 while((c = state->json[state->pos++]) && c !=
'"') {
91 state->error = JSON_ERROR_SYNTAX;
92 return JSON_TYPE_ERROR;
94 state->vlen = state->pos - state->vstart - 1;
95 }
else if(type == JSON_TYPE_NUMBER) {
97 c = state->json[state->pos];
98 if((c < '0' || c >
'9') && c !=
'.') {
106 state->vlen = state->pos - state->vstart;
107 }
else if(type == JSON_TYPE_NULL || type == JSON_TYPE_TRUE || type == JSON_TYPE_FALSE) {
110 case JSON_TYPE_NULL: str =
"null";
break;
111 case JSON_TYPE_TRUE: str =
"true";
break;
112 case JSON_TYPE_FALSE: str =
"false";
break;
113 default: str =
"";
break;
116 while ((c = state->json[state->pos]) && c !=
' ' && c !=
',' && c !=
']' && c !=
'}') {
120 state->vlen = state->pos - state->vstart;
122 len = state->vlen > len ? state->vlen : len;
124 if (strncmp(str, &state->json[state->vstart], len) != 0) {
125 state->error = JSON_ERROR_SYNTAX;
126 return JSON_TYPE_ERROR;
135 skip_ws(
struct jsonparse_state *state)
139 while(state->pos < state->len &&
140 ((c = state->json[state->pos]) ==
' ' || c ==
'\n')) {
146 is_atomic(
struct jsonparse_state *state)
148 char v = state->vtype;
149 return v ==
'N' || v ==
'"' || v ==
'0' || v ==
'n' || v ==
't' || v ==
'f';
153 jsonparse_setup(
struct jsonparse_state *state,
const char *json,
int len)
165 jsonparse_next(
struct jsonparse_state *state)
173 c = state->json[state->pos];
174 s = jsonparse_get_type(state);
180 if((s == 0 && v == 0) || s ==
'[' || s ==
':') {
185 state->error = JSON_ERROR_UNEXPECTED_OBJECT;
186 return JSON_TYPE_ERROR;
188 if((s ==
':' && v !=
',' && v != 0 ) || (s ==
'{' && v == 0)) {
193 state->error = JSON_ERROR_UNEXPECTED_END_OF_OBJECT;
194 return JSON_TYPE_ERROR;
196 if(s ==
'[' && v !=
',') {
201 state->error = JSON_ERROR_UNEXPECTED_END_OF_ARRAY;
202 return JSON_TYPE_ERROR;
204 if(s ==
'{' && v ==
'N') {
205 ret = modify(state,
':');
208 return jsonparse_next(state);
211 state->error = JSON_ERROR_SYNTAX;
212 return JSON_TYPE_ERROR;
214 if(s ==
':' && v != 0) {
215 ret = modify(state,
'{');
220 }
else if(s ==
'[') {
224 state->error = JSON_ERROR_SYNTAX;
225 return JSON_TYPE_ERROR;
227 if((s == 0 && v == 0) || s ==
'{' || s ==
'[' || s ==
':') {
228 return atomic(state, c = (s ==
'{' ? JSON_TYPE_PAIR_NAME : c));
230 state->error = JSON_ERROR_UNEXPECTED_STRING;
231 return JSON_TYPE_ERROR;
235 if((s == 0 && v == 0) || s ==
'[' || s ==
':') {
240 state->error = JSON_ERROR_UNEXPECTED_ARRAY;
241 return JSON_TYPE_ERROR;
243 if(v == 0 || state->depth > 0) {
244 state->error = JSON_ERROR_SYNTAX;
246 return JSON_TYPE_ERROR;
248 if(s == 0 || s ==
':' || s ==
'[') {
249 if (v != 0 && v !=
',') {
250 state->error = JSON_ERROR_SYNTAX;
251 return JSON_TYPE_ERROR;
253 if(c ==
'-' || (c <= '9' && c >=
'0')) {
254 return atomic(state, JSON_TYPE_NUMBER);
255 }
else if(c ==
'n') {
256 return atomic(state, JSON_TYPE_NULL);
257 }
else if(c ==
't') {
258 return atomic(state, JSON_TYPE_TRUE);
259 }
else if(c ==
'f') {
260 return atomic(state, JSON_TYPE_FALSE);
262 state->error = JSON_ERROR_SYNTAX;
263 return JSON_TYPE_ERROR;
265 }
else if(s ==
'{') {
266 state->error = JSON_ERROR_SYNTAX;
267 return JSON_TYPE_ERROR;
278 jsonparse_copy_value(
struct jsonparse_state *state,
char *str,
int size)
283 if(!is_atomic(state)) {
286 for(i = 0, o = 0; i < state->vlen && o < size - 1; i++) {
287 c = state->json[state->vstart + i];
290 switch(state->json[state->vstart + i]) {
291 case '"': str[o++] =
'"';
break;
292 case '\\': str[o++] =
'\\';
break;
293 case '/': str[o++] =
'/';
break;
294 case 'b': str[o++] =
'\b';
break;
295 case 'f': str[o++] =
'\f';
break;
296 case 'n': str[o++] =
'\n';
break;
297 case 'r': str[o++] =
'\r';
break;
298 case 't': str[o++] =
'\t';
break;
309 jsonparse_get_value_as_int(
struct jsonparse_state *state)
311 if(state->vtype != JSON_TYPE_NUMBER) {
314 return atoi(&state->json[state->vstart]);
318 jsonparse_get_value_as_long(
struct jsonparse_state *state)
320 if(state->vtype != JSON_TYPE_NUMBER) {
323 return atol(&state->json[state->vstart]);
329 jsonparse_strcmp_value(
struct jsonparse_state *state,
const char *str)
331 if(!is_atomic(state)) {
334 return strncmp(str, &state->json[state->vstart], state->vlen);
338 jsonparse_get_len(
struct jsonparse_state *state)
344 jsonparse_get_type(
struct jsonparse_state *state)
346 if(state->depth == 0) {
349 return state->stack[state->depth - 1];
353 jsonparse_has_next(
struct jsonparse_state *state)
355 return state->pos < state->len;