Browse Source

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
tags/json-c-0.10-20120530
Jehiah Czebotar 15 years ago
parent
commit
a503ee8217
4 changed files with 34 additions and 5 deletions
  1. +2
    -1
      bits.h
  2. +17
    -1
      json_tokener.c
  3. +2
    -1
      json_tokener.h
  4. +13
    -2
      test1.c

+ 2
- 1
bits.h View File

@@ -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

+ 17
- 1
json_tokener.c View File

@@ -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() */


+ 2
- 1
json_tokener.h View File

@@ -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);



+ 13
- 2
test1.c View File

@@ -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");


Loading…
Cancel
Save