so://phie

HomeGitCV

libjson

A simple JSON parser

git clone git@soophie.de:/srv/git/libjson

diff --git a/libjson.h b/libjson.h

index 1404c01..4c4c421 100644

--- a/libjson.h

+++ b/libjson.h

1@@ -41,6 +41,12 @@ json_ptr_t json_query(json_ptr_t json_ptr, const char *query);

2 #include "libjson.h"

3

4 char *json_str(json_ptr_t json_ptr) {

5+ if (json_ptr.err != JSON_OK) {

6+ return NULL;

7+ }

8+ if (json_ptr.ptr >= json_ptr.len) {

9+ return NULL;

10+ }

11 jsmntok_t token = json_ptr.tokens[json_ptr.ptr];

12 int token_len = token.end - token.start;

13 char *str = malloc(token_len + 1);

14@@ -87,7 +93,7 @@ json_ptr_t json_parse(jsmntok_t tokens[], int tokens_len, const char *str) {

15 void json_seek(json_ptr_t *json_ptr) {

16 jsmntok_t token_root = json_ptr->tokens[json_ptr->ptr];

17 if (token_root.type != JSMN_OBJECT && token_root.type != JSMN_ARRAY) {

18- json_err(*json_ptr, JSON_ERR_INVALID_TYPE);

19+ json_ptr->err = JSON_ERR_INVALID_TYPE;

20 return;

21 }

22 jsmntok_t token;

23@@ -106,6 +112,9 @@ void json_seek(json_ptr_t *json_ptr) {

24 }

25

26 json_ptr_t json_get(json_ptr_t json_ptr, const char *key) {

27+ if (json_ptr.err != JSON_OK) {

28+ return json_err(json_ptr, JSON_ERR_INVALID_MISSING);

29+ }

30 jsmntok_t token_root = json_ptr.tokens[json_ptr.ptr];

31 if (token_root.type != JSMN_OBJECT) {

32 return json_err(json_ptr, JSON_ERR_INVALID_TYPE);

33@@ -113,6 +122,9 @@ json_ptr_t json_get(json_ptr_t json_ptr, const char *key) {

34 jsmntok_t token;

35 int token_len;

36 while (json_ptr.ptr < json_ptr.len) {

37+ if (json_ptr.ptr + 1 >= json_ptr.len) {

38+ return json_err(json_ptr, JSON_ERR_INVALID_MISSING);

39+ }

40 token = json_ptr.tokens[++json_ptr.ptr]; // key

41 token_len = token.end - token.start;

42 char token_key[token_len + 1];

43@@ -134,6 +146,9 @@ json_ptr_t json_get(json_ptr_t json_ptr, const char *key) {

44 }

45

46 json_ptr_t json_at(json_ptr_t json_ptr, int idx) {

47+ if (json_ptr.err != JSON_OK) {

48+ return json_err(json_ptr, JSON_ERR_INVALID_MISSING);

49+ }

50 jsmntok_t token_root = json_ptr.tokens[json_ptr.ptr];

51 if (token_root.type != JSMN_ARRAY) {

52 return json_err(json_ptr, JSON_ERR_INVALID_TYPE);

53@@ -160,6 +175,9 @@ json_ptr_t json_at(json_ptr_t json_ptr, int idx) {

54 }

55

56 json_ptr_t json_query(json_ptr_t json_ptr, const char *query) {

57+ if (json_ptr.err != JSON_OK) {

58+ return json_err(json_ptr, JSON_ERR_INVALID_MISSING);

59+ }

60 jsmntok_t token_root = json_ptr.tokens[json_ptr.ptr];

61 if (token_root.type != JSMN_OBJECT && token_root.type != JSMN_ARRAY) {

62 return json_err(json_ptr, JSON_ERR_INVALID_TYPE);