From a503ee8217a9912f3c58acae33cf3d1d840dab6c Mon Sep 17 00:00:00 2001 From: Jehiah Czebotar Date: Wed, 8 Dec 2010 03:52:07 +0000 Subject: [patch json-c] add json_tokener_parse_verbose, and return NULL on parser errors git-svn-id: http://svn.metaparadigm.com/svn/json-c/trunk@62 327403b1-1117-474d-bef2-5cb71233fd97 --- bits.h | 3 ++- json_tokener.c | 18 +++++++++++++++++- json_tokener.h | 3 ++- test1.c | 15 +++++++++++++-- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/bits.h b/bits.h index f308da3..c8cbbc8 100644 --- a/bits.h +++ b/bits.h @@ -22,6 +22,7 @@ #define hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x) & 7) + 9) #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 diff --git a/json_tokener.c b/json_tokener.c index da414e7..df106b1 100644 --- a/json_tokener.c +++ b/json_tokener.c @@ -115,11 +115,27 @@ struct json_object* json_tokener_parse(const char *str) tok = json_tokener_new(); obj = json_tokener_parse_ex(tok, str, -1); if(tok->err != json_tokener_success) - obj = (struct json_object*)error_ptr(-tok->err); + obj = NULL; json_tokener_free(tok); 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 /* CAW: compliant version of strndup() */ diff --git a/json_tokener.h b/json_tokener.h index 7d40b40..162a152 100644 --- a/json_tokener.h +++ b/json_tokener.h @@ -76,7 +76,7 @@ struct json_tokener char *str; struct printbuf *pb; int depth, is_double, st_pos, char_offset; - ptrdiff_t err; + enum json_tokener_error err; unsigned int ucs_char; char quote_char; 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_reset(struct json_tokener *tok); 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, const char *str, int len); diff --git a/test1.c b/test1.c index a3cc6d9..ac1b882 100644 --- a/test1.c +++ b/test1.c @@ -2,6 +2,7 @@ #include #include #include +#include #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)); 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 }"); - 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"); - 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"); if(is_error(new_obj)) printf("got error as expected\n"); -- 1.7.6.4