git-svn-id: http://svn.metaparadigm.com/svn/json-c/trunk@62 327403b1-1117-474d-bef2-5cb71233fd97tags/json-c-0.10-20120530
| @@ -22,6 +22,7 @@ | |||||
| #define hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x) & 7) + 9) | #define hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x) & 7) + 9) | ||||
| #define error_ptr(error) ((void*)error) | #define error_ptr(error) ((void*)error) | ||||
| #define is_error(ptr) ((unsigned long)ptr > (unsigned long)-4000L) | |||||
| #define error_description(error) (json_tokener_errors[error]) | |||||
| #define is_error(ptr) (ptr == NULL) | |||||
| #endif | #endif | ||||
| @@ -115,11 +115,27 @@ struct json_object* json_tokener_parse(const char *str) | |||||
| tok = json_tokener_new(); | tok = json_tokener_new(); | ||||
| obj = json_tokener_parse_ex(tok, str, -1); | obj = json_tokener_parse_ex(tok, str, -1); | ||||
| if(tok->err != json_tokener_success) | if(tok->err != json_tokener_success) | ||||
| obj = (struct json_object*)error_ptr(-tok->err); | |||||
| obj = NULL; | |||||
| json_tokener_free(tok); | json_tokener_free(tok); | ||||
| return obj; | return obj; | ||||
| } | } | ||||
| struct json_object* json_tokener_parse_verbose(const char *str, enum json_tokener_error *error) | |||||
| { | |||||
| struct json_tokener* tok; | |||||
| struct json_object* obj; | |||||
| tok = json_tokener_new(); | |||||
| obj = json_tokener_parse_ex(tok, str, -1); | |||||
| *error = tok->err; | |||||
| if(tok->err != json_tokener_success) { | |||||
| obj = NULL; | |||||
| } | |||||
| json_tokener_free(tok); | |||||
| return obj; | |||||
| } | |||||
| #if !HAVE_STRNDUP | #if !HAVE_STRNDUP | ||||
| /* CAW: compliant version of strndup() */ | /* CAW: compliant version of strndup() */ | ||||
| @@ -76,7 +76,7 @@ struct json_tokener | |||||
| char *str; | char *str; | ||||
| struct printbuf *pb; | struct printbuf *pb; | ||||
| int depth, is_double, st_pos, char_offset; | int depth, is_double, st_pos, char_offset; | ||||
| ptrdiff_t err; | |||||
| enum json_tokener_error err; | |||||
| unsigned int ucs_char; | unsigned int ucs_char; | ||||
| char quote_char; | char quote_char; | ||||
| struct json_tokener_srec stack[JSON_TOKENER_MAX_DEPTH]; | struct json_tokener_srec stack[JSON_TOKENER_MAX_DEPTH]; | ||||
| @@ -88,6 +88,7 @@ extern struct json_tokener* json_tokener_new(void); | |||||
| extern void json_tokener_free(struct json_tokener *tok); | extern void json_tokener_free(struct json_tokener *tok); | ||||
| extern void json_tokener_reset(struct json_tokener *tok); | extern void json_tokener_reset(struct json_tokener *tok); | ||||
| extern struct json_object* json_tokener_parse(const char *str); | extern struct json_object* json_tokener_parse(const char *str); | ||||
| extern struct json_object* json_tokener_parse_verbose(const char *str, enum json_tokener_error *error); | |||||
| extern struct json_object* json_tokener_parse_ex(struct json_tokener *tok, | extern struct json_object* json_tokener_parse_ex(struct json_tokener *tok, | ||||
| const char *str, int len); | const char *str, int len); | ||||
| @@ -2,6 +2,7 @@ | |||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <stddef.h> | #include <stddef.h> | ||||
| #include <string.h> | #include <string.h> | ||||
| #include <assert.h> | |||||
| #include "json.h" | #include "json.h" | ||||
| @@ -135,11 +136,21 @@ int main(int argc, char **argv) | |||||
| printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj)); | printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj)); | ||||
| json_object_put(new_obj); | json_object_put(new_obj); | ||||
| enum json_tokener_error error = json_tokener_success; | |||||
| new_obj = json_tokener_parse_verbose("{ foo }", &error); | |||||
| assert (error == json_tokener_error_parse_object_key_name); | |||||
| assert (new_obj == NULL); | |||||
| new_obj = json_tokener_parse("{ foo }"); | new_obj = json_tokener_parse("{ foo }"); | ||||
| if(is_error(new_obj)) printf("got error as expected\n"); | |||||
| assert (new_obj == NULL); | |||||
| // if(is_error(new_obj)) printf("got error as expected\n"); | |||||
| new_obj = json_tokener_parse("foo"); | new_obj = json_tokener_parse("foo"); | ||||
| if(is_error(new_obj)) printf("got error as expected\n"); | |||||
| assert (new_obj == NULL); | |||||
| new_obj = json_tokener_parse_verbose("foo", &error); | |||||
| assert (new_obj == NULL); | |||||
| assert (error == json_tokener_error_parse_boolean); | |||||
| new_obj = json_tokener_parse("{ \"foo"); | new_obj = json_tokener_parse("{ \"foo"); | ||||
| if(is_error(new_obj)) printf("got error as expected\n"); | if(is_error(new_obj)) printf("got error as expected\n"); | ||||