All objects renamed using jsmn prefix to keep consistency and not be mixed with other json libraries. Demo is now called just demo.

master
Serge A. Zaitsev 15 years ago
parent 4e29ee705f
commit c955364a95

@ -1,17 +1,22 @@
CFLAGS=-Wall -std=c89 -g -O2 CFLAGS=-Wall -std=c89 -g -O2
OBJS=jsmn.o demo.o all: libjsmn.a
all: jsmn_demo demo: libjsmn.a demo.o
$(CC) $(LDFLAGS) demo.o -L. -ljsmn -o $@
jsmn_demo: $(OBJS) libjsmn.a: jsmn.o
$(CC) $(LDFLAGS) $(OBJS) -o $@ ar rc $@ $^
%.o: %.c jsmn.h %.o: %.c jsmn.h
$(CC) -c $(CFLAGS) $< -o $@ $(CC) -c $(CFLAGS) $< -o $@
test: all demo
sh test.sh
clean: clean:
rm -f $(OBJS) rm -f jsmn.o demo.o
rm -f jsmn_demo rm -f libjsmn.a
rm -f demo
.PHONY: clean all .PHONY: all clean test demo

@ -11,7 +11,7 @@
#include "jsmn.h" #include "jsmn.h"
static void jsmn_dump_obj(jsontok_t *obj, const char *js) { static void jsmn_dump_obj(jsmntok_t *obj, const char *js) {
size_t len; size_t len;
char *s; char *s;
@ -25,10 +25,10 @@ static void jsmn_dump_obj(jsontok_t *obj, const char *js) {
({ ({
char c; char c;
switch (obj->type) { switch (obj->type) {
case JSON_PRIMITIVE: c = '.'; break; case JSMN_PRIMITIVE: c = '.'; break;
case JSON_STRING: c = 's'; break; case JSMN_STRING: c = 's'; break;
case JSON_ARRAY: c = 'A'; break; case JSMN_ARRAY: c = 'A'; break;
case JSON_OBJECT: c = 'O'; break; case JSMN_OBJECT: c = 'O'; break;
default: c = '?'; default: c = '?';
}; c; }; c;
})); }));
@ -57,7 +57,7 @@ int main(int argc, char *argv[]) {
jsmn_parser parser; jsmn_parser parser;
char *js = NULL; char *js = NULL;
jsontok_t *tokens; jsmntok_t *tokens;
int block_size = 1024; int block_size = 1024;
int num_tokens = 100; int num_tokens = 100;
@ -96,7 +96,7 @@ int main(int argc, char *argv[]) {
} }
} }
tokens = malloc(num_tokens * sizeof(jsontok_t)); tokens = malloc(num_tokens * sizeof(jsmntok_t));
if (tokens == NULL) { if (tokens == NULL) {
fprintf(stderr, "Cannot allocate anough memory\n"); fprintf(stderr, "Cannot allocate anough memory\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);

@ -2,9 +2,9 @@
#include "jsmn.h" #include "jsmn.h"
static jsontok_t *jsmn_get_token(jsmn_parser *parser) { static jsmntok_t *jsmn_get_token(jsmn_parser *parser) {
unsigned int i; unsigned int i;
jsontok_t *tokens = parser->tokens; jsmntok_t *tokens = parser->tokens;
for (i = parser->curtoken; i<parser->num_tokens; i++) { for (i = parser->curtoken; i<parser->num_tokens; i++) {
if (tokens[i].start == -1 && tokens[i].end == -1) { if (tokens[i].start == -1 && tokens[i].end == -1) {
parser->curtoken = i; parser->curtoken = i;
@ -14,14 +14,14 @@ static jsontok_t *jsmn_get_token(jsmn_parser *parser) {
return NULL; return NULL;
} }
static void jsmn_fill_token(jsontok_t *token, jsontype_t type, int start, int end) { static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, int start, int end) {
token->type = type; token->type = type;
token->start = start; token->start = start;
token->end = end; token->end = end;
} }
void jsmn_init_parser(jsmn_parser *parser, const char *js, void jsmn_init_parser(jsmn_parser *parser, const char *js,
jsontok_t *tokens, unsigned int num_tokens) { jsmntok_t *tokens, unsigned int num_tokens) {
unsigned int i; unsigned int i;
parser->js = js; parser->js = js;
@ -31,13 +31,13 @@ void jsmn_init_parser(jsmn_parser *parser, const char *js,
parser->curtoken = 0; parser->curtoken = 0;
for (i = 0; i < parser->num_tokens; i++) { for (i = 0; i < parser->num_tokens; i++) {
jsmn_fill_token(&parser->tokens[i], JSON_PRIMITIVE, -1, -1); jsmn_fill_token(&parser->tokens[i], JSMN_PRIMITIVE, -1, -1);
} }
} }
static int jsmn_parse_primitive(jsmn_parser *parser) { static int jsmn_parse_primitive(jsmn_parser *parser) {
const char *js; const char *js;
jsontok_t *token; jsmntok_t *token;
int start; int start;
start = parser->pos; start = parser->pos;
@ -51,7 +51,7 @@ static int jsmn_parse_primitive(jsmn_parser *parser) {
token = jsmn_get_token(parser); token = jsmn_get_token(parser);
if (token == NULL) if (token == NULL)
return JSMN_ERROR_NOMEM; return JSMN_ERROR_NOMEM;
jsmn_fill_token(token, JSON_PRIMITIVE, start, parser->pos); jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos);
parser->pos--; parser->pos--;
return JSMN_SUCCESS; return JSMN_SUCCESS;
} }
@ -66,7 +66,7 @@ static int jsmn_parse_primitive(jsmn_parser *parser) {
static int jsmn_parse_string(jsmn_parser *parser) { static int jsmn_parse_string(jsmn_parser *parser) {
const char *js; const char *js;
jsontok_t *token; jsmntok_t *token;
int start = parser->pos; int start = parser->pos;
@ -83,7 +83,7 @@ static int jsmn_parse_string(jsmn_parser *parser) {
token = jsmn_get_token(parser); token = jsmn_get_token(parser);
if (token == NULL) if (token == NULL)
return JSMN_ERROR_NOMEM; return JSMN_ERROR_NOMEM;
jsmn_fill_token(token, JSON_PRIMITIVE, start+1, parser->pos); jsmn_fill_token(token, JSMN_PRIMITIVE, start+1, parser->pos);
return JSMN_SUCCESS; return JSMN_SUCCESS;
} }
@ -114,8 +114,8 @@ jsmnerr_t jsmn_parse(jsmn_parser *parser) {
int r; int r;
unsigned int i; unsigned int i;
const char *js; const char *js;
jsontype_t type; jsmntype_t type;
jsontok_t *token; jsmntok_t *token;
js = parser->js; js = parser->js;
@ -127,11 +127,11 @@ jsmnerr_t jsmn_parse(jsmn_parser *parser) {
token = jsmn_get_token(parser); token = jsmn_get_token(parser);
if (token == NULL) if (token == NULL)
return JSMN_ERROR_NOMEM; return JSMN_ERROR_NOMEM;
token->type = (c == '{' ? JSON_OBJECT : JSON_ARRAY); token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY);
token->start = parser->pos; token->start = parser->pos;
break; break;
case '}': case ']': case '}': case ']':
type = (c == '}' ? JSON_OBJECT : JSON_ARRAY); type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY);
for (i = parser->curtoken; i >= 0; i--) { for (i = parser->curtoken; i >= 0; i--) {
token = &parser->tokens[i]; token = &parser->tokens[i];
if (token->start != -1 && token->end == -1) { if (token->start != -1 && token->end == -1) {

@ -9,11 +9,11 @@
* o Other primitive: number, boolean (true/false) or null * o Other primitive: number, boolean (true/false) or null
*/ */
typedef enum { typedef enum {
JSON_PRIMITIVE = 0, JSMN_PRIMITIVE = 0,
JSON_OBJECT = 1, JSMN_OBJECT = 1,
JSON_ARRAY = 2, JSMN_ARRAY = 2,
JSON_STRING = 3 JSMN_STRING = 3
} jsontype_t; } jsmntype_t;
typedef enum { typedef enum {
JSMN_ERROR_NOMEM = -1, JSMN_ERROR_NOMEM = -1,
@ -29,10 +29,10 @@ typedef enum {
* @param end end position in JSON data string * @param end end position in JSON data string
*/ */
typedef struct { typedef struct {
jsontype_t type; jsmntype_t type;
int start; int start;
int end; int end;
} jsontok_t; } jsmntok_t;
/** /**
* JSON parser. Contains an array of token blocks available. Also stores * JSON parser. Contains an array of token blocks available. Also stores
@ -43,14 +43,14 @@ typedef struct {
unsigned int pos; unsigned int pos;
unsigned int num_tokens; unsigned int num_tokens;
int curtoken; int curtoken;
jsontok_t *tokens; jsmntok_t *tokens;
} jsmn_parser; } jsmn_parser;
/** /**
* Create JSON parser over an array of tokens * Create JSON parser over an array of tokens
*/ */
void jsmn_init_parser(jsmn_parser *parser, const char *js, void jsmn_init_parser(jsmn_parser *parser, const char *js,
jsontok_t *tokens, unsigned int num_tokens); jsmntok_t *tokens, unsigned int num_tokens);
/** /**
* Run JSON parser. It parses a JSON data string into and array of tokens, each describing * Run JSON parser. It parses a JSON data string into and array of tokens, each describing

@ -21,7 +21,7 @@ PASSED=0
FAILED=0 FAILED=0
function expect() { function expect() {
ret=$(./jsmn_demo -t 10 -b 256 - | grep -A 1 "$1" | tail -n 1 | cut -c 15-) ret=$(./demo -t 10 -b 256 - | grep -A 1 "$1" | tail -n 1 | cut -c 15-)
if [ "x$ret" = "x$2" ]; then if [ "x$ret" = "x$2" ]; then
PASSED=$(($PASSED+1)) PASSED=$(($PASSED+1))
else else

Loading…
Cancel
Save