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"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
}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]; // key41
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
}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
}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);