forked from agorise/c-ipfs
Implemented simple json parsing reusing jsmn.
This commit is contained in:
parent
35b20c9a2e
commit
94b782cfaa
3 changed files with 34 additions and 2 deletions
|
@ -69,6 +69,7 @@ void jsmn_init(jsmn_parser *parser);
|
||||||
int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
|
int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
|
||||||
jsmntok_t *tokens, unsigned int num_tokens);
|
jsmntok_t *tokens, unsigned int num_tokens);
|
||||||
|
|
||||||
|
char *jsmn_simple_parser(char *full_json, int json_len, char *key);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
|
@ -13,7 +13,7 @@
|
||||||
#include "ipfs/repo/fsrepo/fs_repo.h"
|
#include "ipfs/repo/fsrepo/fs_repo.h"
|
||||||
#include "libp2p/os/utils.h"
|
#include "libp2p/os/utils.h"
|
||||||
#include "ipfs/repo/fsrepo/lmdb_datastore.h"
|
#include "ipfs/repo/fsrepo/lmdb_datastore.h"
|
||||||
#include "jsmn.h"
|
#include "ipfs/repo/fsrepo/jsmn.h"
|
||||||
#include "multiaddr/multiaddr.h"
|
#include "multiaddr/multiaddr.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
#include "jsmn.h"
|
#include "ipfs/repo/fsrepo/jsmn.h"
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allocates a fresh unused token from the token pull.
|
* Allocates a fresh unused token from the token pull.
|
||||||
|
@ -311,3 +313,32 @@ void jsmn_init(jsmn_parser *parser) {
|
||||||
parser->toknext = 0;
|
parser->toknext = 0;
|
||||||
parser->toksuper = -1;
|
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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue