summaryrefslogtreecommitdiffstats
path: root/json-c-add-json_tokener_parse_verbose-and-return-NULL-on-pa.patch
blob: 5558e9d03ac2fb667c3e84cb4a97d372d8e4b652 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
From a503ee8217a9912f3c58acae33cf3d1d840dab6c Mon Sep 17 00:00:00 2001
From: Jehiah Czebotar <jehiah@gmail.com>
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 <stdlib.h>
 #include <stddef.h>
 #include <string.h>
+#include <assert.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));
   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