From 94b782cfaa29f6d052c36592d8c299762c166d15 Mon Sep 17 00:00:00 2001 From: Jose Marcial Vieira Bisneto Date: Thu, 25 Oct 2018 19:00:32 -0300 Subject: [PATCH] Implemented simple json parsing reusing jsmn. --- {repo => include/ipfs/repo}/fsrepo/jsmn.h | 1 + repo/fsrepo/fs_repo.c | 2 +- repo/fsrepo/jsmn.c | 33 ++++++++++++++++++++++- 3 files changed, 34 insertions(+), 2 deletions(-) rename {repo => include/ipfs/repo}/fsrepo/jsmn.h (95%) diff --git a/repo/fsrepo/jsmn.h b/include/ipfs/repo/fsrepo/jsmn.h similarity index 95% rename from repo/fsrepo/jsmn.h rename to include/ipfs/repo/fsrepo/jsmn.h index 5a5200e..f6f3a30 100644 --- a/repo/fsrepo/jsmn.h +++ b/include/ipfs/repo/fsrepo/jsmn.h @@ -69,6 +69,7 @@ void jsmn_init(jsmn_parser *parser); int jsmn_parse(jsmn_parser *parser, const char *js, size_t len, jsmntok_t *tokens, unsigned int num_tokens); +char *jsmn_simple_parser(char *full_json, int json_len, char *key); #ifdef __cplusplus } #endif diff --git a/repo/fsrepo/fs_repo.c b/repo/fsrepo/fs_repo.c index cc80bc6..5371e94 100644 --- a/repo/fsrepo/fs_repo.c +++ b/repo/fsrepo/fs_repo.c @@ -13,7 +13,7 @@ #include "ipfs/repo/fsrepo/fs_repo.h" #include "libp2p/os/utils.h" #include "ipfs/repo/fsrepo/lmdb_datastore.h" -#include "jsmn.h" +#include "ipfs/repo/fsrepo/jsmn.h" #include "multiaddr/multiaddr.h" /** diff --git a/repo/fsrepo/jsmn.c b/repo/fsrepo/jsmn.c index 564d9b6..16f8ba1 100644 --- a/repo/fsrepo/jsmn.c +++ b/repo/fsrepo/jsmn.c @@ -1,4 +1,6 @@ -#include "jsmn.h" +#include "ipfs/repo/fsrepo/jsmn.h" +#include +#include /** * Allocates a fresh unused token from the token pull. @@ -311,3 +313,32 @@ void jsmn_init(jsmn_parser *parser) { parser->toknext = 0; parser->toksuper = -1; } + +char *jsmn_simple_parser(char *full_json, int json_len, char *key) { + int num_tokens = 256, len, i; + if (!full_json || !key) { + return NULL; + } + jsmn_parser parser; + jsmn_init(&parser); + jsmntok_t tokens[num_tokens]; + num_tokens = jsmn_parse(&parser, full_json, json_len, tokens, 256); + if (num_tokens <= 0) { + return NULL; + } + len = strlen(key); + for (i = 0; i < num_tokens; i++) { + jsmntok_t curr_token = tokens[i]; + if (len == (curr_token.end - curr_token.start) && memcmp(full_json + curr_token.start, key, len) == 0) { + curr_token = tokens[i+1]; + len = curr_token.end - curr_token.start; + char *ret = malloc(len + 1); + if (!ret) { + return NULL; + } + strncpy(ret, full_json + curr_token.start, len); + return ret; + } + } + return NULL; +}