123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #include <stdio.h>
- #include "config.h"
- #include "json_inttypes.h"
- #include "json_object.h"
- #include "json_visit.h"
- #include "linkhash.h"
- static int _json_c_visit(json_object *jso, json_object *parent_jso,
- const char *jso_key, size_t *jso_index,
- json_c_visit_userfunc *userfunc, void *userarg);
- int json_c_visit(json_object *jso, int future_flags,
- json_c_visit_userfunc *userfunc, void *userarg)
- {
- int ret = _json_c_visit(jso, NULL, NULL, NULL, userfunc, userarg);
- switch(ret)
- {
- case JSON_C_VISIT_RETURN_CONTINUE:
- case JSON_C_VISIT_RETURN_SKIP:
- case JSON_C_VISIT_RETURN_POP:
- case JSON_C_VISIT_RETURN_STOP:
- return 0;
- default:
- return JSON_C_VISIT_RETURN_ERROR;
- }
- }
- static int _json_c_visit(json_object *jso, json_object *parent_jso,
- const char *jso_key, size_t *jso_index,
- json_c_visit_userfunc *userfunc, void *userarg)
- {
- int userret = userfunc(jso, 0, parent_jso, jso_key, jso_index, userarg);
- switch(userret)
- {
- case JSON_C_VISIT_RETURN_CONTINUE:
- break;
- case JSON_C_VISIT_RETURN_SKIP:
- case JSON_C_VISIT_RETURN_POP:
- case JSON_C_VISIT_RETURN_STOP:
- case JSON_C_VISIT_RETURN_ERROR:
- return userret;
- default:
- fprintf(stderr, "ERROR: invalid return value from json_c_visit userfunc: %d\n", userret);
- return JSON_C_VISIT_RETURN_ERROR;
- }
- switch(json_object_get_type(jso))
- {
- case json_type_null:
- case json_type_boolean:
- case json_type_double:
- case json_type_int:
- case json_type_string:
-
- return JSON_C_VISIT_RETURN_CONTINUE;
- case json_type_object:
- {
- json_object_object_foreach(jso, key, child)
- {
- userret = _json_c_visit(child, jso, key, NULL, userfunc, userarg);
- if (userret == JSON_C_VISIT_RETURN_POP)
- break;
- if (userret == JSON_C_VISIT_RETURN_STOP ||
- userret == JSON_C_VISIT_RETURN_ERROR)
- return userret;
- if (userret != JSON_C_VISIT_RETURN_CONTINUE &&
- userret != JSON_C_VISIT_RETURN_SKIP)
- {
- fprintf(stderr, "INTERNAL ERROR: _json_c_visit returned %d\n", userret);
- return JSON_C_VISIT_RETURN_ERROR;
- }
- }
- break;
- }
- case json_type_array:
- {
- size_t array_len = json_object_array_length(jso);
- size_t ii;
- for (ii = 0; ii < array_len; ii++)
- {
- json_object *child = json_object_array_get_idx(jso, ii);
- userret = _json_c_visit(child, jso, NULL, &ii, userfunc, userarg);
- if (userret == JSON_C_VISIT_RETURN_POP)
- break;
- if (userret == JSON_C_VISIT_RETURN_STOP ||
- userret == JSON_C_VISIT_RETURN_ERROR)
- return userret;
- if (userret != JSON_C_VISIT_RETURN_CONTINUE &&
- userret != JSON_C_VISIT_RETURN_SKIP)
- {
- fprintf(stderr, "INTERNAL ERROR: _json_c_visit returned %d\n", userret);
- return JSON_C_VISIT_RETURN_ERROR;
- }
- }
- break;
- }
- default:
- fprintf(stderr, "INTERNAL ERROR: _json_c_visit found object of unknown type: %d\n", json_object_get_type(jso));
- return JSON_C_VISIT_RETURN_ERROR;
- }
-
-
-
- userret = userfunc(jso, JSON_C_VISIT_SECOND, parent_jso, jso_key, jso_index, userarg);
- switch(userret)
- {
- case JSON_C_VISIT_RETURN_SKIP:
- case JSON_C_VISIT_RETURN_POP:
-
-
-
- case JSON_C_VISIT_RETURN_CONTINUE:
- return JSON_C_VISIT_RETURN_CONTINUE;
- case JSON_C_VISIT_RETURN_STOP:
- case JSON_C_VISIT_RETURN_ERROR:
- return userret;
- default:
- fprintf(stderr, "ERROR: invalid return value from json_c_visit userfunc: %d\n", userret);
- return JSON_C_VISIT_RETURN_ERROR;
- }
-
- }
|