Skip to content

Commit a503ee8

Browse files
committedDec 8, 2010
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
1 parent 5644272 commit a503ee8

File tree

4 files changed

+34
-5
lines changed

4 files changed

+34
-5
lines changed
 

‎bits.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#define hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x) & 7) + 9)
2424
#define error_ptr(error) ((void*)error)
25-
#define is_error(ptr) ((unsigned long)ptr > (unsigned long)-4000L)
25+
#define error_description(error) (json_tokener_errors[error])
26+
#define is_error(ptr) (ptr == NULL)
2627

2728
#endif

‎json_tokener.c

+17-1
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,27 @@ struct json_object* json_tokener_parse(const char *str)
115115
tok = json_tokener_new();
116116
obj = json_tokener_parse_ex(tok, str, -1);
117117
if(tok->err != json_tokener_success)
118-
obj = (struct json_object*)error_ptr(-tok->err);
118+
obj = NULL;
119119
json_tokener_free(tok);
120120
return obj;
121121
}
122122

123+
struct json_object* json_tokener_parse_verbose(const char *str, enum json_tokener_error *error)
124+
{
125+
struct json_tokener* tok;
126+
struct json_object* obj;
127+
128+
tok = json_tokener_new();
129+
obj = json_tokener_parse_ex(tok, str, -1);
130+
*error = tok->err;
131+
if(tok->err != json_tokener_success) {
132+
obj = NULL;
133+
}
134+
135+
json_tokener_free(tok);
136+
return obj;
137+
}
138+
123139

124140
#if !HAVE_STRNDUP
125141
/* CAW: compliant version of strndup() */

‎json_tokener.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ struct json_tokener
7676
char *str;
7777
struct printbuf *pb;
7878
int depth, is_double, st_pos, char_offset;
79-
ptrdiff_t err;
79+
enum json_tokener_error err;
8080
unsigned int ucs_char;
8181
char quote_char;
8282
struct json_tokener_srec stack[JSON_TOKENER_MAX_DEPTH];
@@ -88,6 +88,7 @@ extern struct json_tokener* json_tokener_new(void);
8888
extern void json_tokener_free(struct json_tokener *tok);
8989
extern void json_tokener_reset(struct json_tokener *tok);
9090
extern struct json_object* json_tokener_parse(const char *str);
91+
extern struct json_object* json_tokener_parse_verbose(const char *str, enum json_tokener_error *error);
9192
extern struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
9293
const char *str, int len);
9394

‎test1.c

+13-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include <stdlib.h>
33
#include <stddef.h>
44
#include <string.h>
5+
#include <assert.h>
56

67
#include "json.h"
78

@@ -135,11 +136,21 @@ int main(int argc, char **argv)
135136
printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
136137
json_object_put(new_obj);
137138

139+
enum json_tokener_error error = json_tokener_success;
140+
new_obj = json_tokener_parse_verbose("{ foo }", &error);
141+
assert (error == json_tokener_error_parse_object_key_name);
142+
assert (new_obj == NULL);
143+
138144
new_obj = json_tokener_parse("{ foo }");
139-
if(is_error(new_obj)) printf("got error as expected\n");
145+
assert (new_obj == NULL);
146+
147+
// if(is_error(new_obj)) printf("got error as expected\n");
140148

141149
new_obj = json_tokener_parse("foo");
142-
if(is_error(new_obj)) printf("got error as expected\n");
150+
assert (new_obj == NULL);
151+
new_obj = json_tokener_parse_verbose("foo", &error);
152+
assert (new_obj == NULL);
153+
assert (error == json_tokener_error_parse_boolean);
143154

144155
new_obj = json_tokener_parse("{ \"foo");
145156
if(is_error(new_obj)) printf("got error as expected\n");

0 commit comments

Comments
 (0)
Please sign in to comment.