automatic code formatting

modernize
Serge A. Zaitsev 6 years ago
parent b3ebee88e8
commit bcf450dbc7

@ -1,9 +1,9 @@
#include "../jsmn.h"
#include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <unistd.h>
#include "../jsmn.h"
/* Function realloc_it() is a wrapper function for standard realloc() /* Function realloc_it() is a wrapper function for standard realloc()
* with one difference - it frees old memory pointer in case of realloc * with one difference - it frees old memory pointer in case of realloc
@ -40,7 +40,8 @@ static int dump(const char *js, jsmntok_t *t, size_t count, int indent) {
printf("\n"); printf("\n");
j = 0; j = 0;
for (i = 0; i < t->size; i++) { for (i = 0; i < t->size; i++) {
for (k = 0; k < indent; k++) printf(" "); for (k = 0; k < indent; k++)
printf(" ");
j += dump(js, t + 1 + j, count - j, indent + 1); j += dump(js, t + 1 + j, count - j, indent + 1);
printf(": "); printf(": ");
j += dump(js, t + 1 + j, count - j, indent + 1); j += dump(js, t + 1 + j, count - j, indent + 1);
@ -51,7 +52,8 @@ static int dump(const char *js, jsmntok_t *t, size_t count, int indent) {
j = 0; j = 0;
printf("\n"); printf("\n");
for (i = 0; i < t->size; i++) { for (i = 0; i < t->size; i++) {
for (k = 0; k < indent-1; k++) printf(" "); for (k = 0; k < indent - 1; k++)
printf(" ");
printf(" - "); printf(" - ");
j += dump(js, t + 1 + j, count - j, indent + 1); j += dump(js, t + 1 + j, count - j, indent + 1);
printf("\n"); printf("\n");

@ -1,7 +1,7 @@
#include "../jsmn.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "../jsmn.h"
/* /*
* A small example of jsmn parsing when JSON structure is known and number of * A small example of jsmn parsing when JSON structure is known and number of
@ -27,7 +27,8 @@ int main() {
jsmntok_t t[128]; /* We expect no more than 128 tokens */ jsmntok_t t[128]; /* We expect no more than 128 tokens */
jsmn_init(&p); jsmn_init(&p);
r = jsmn_parse(&p, JSON_STRING, strlen(JSON_STRING), t, sizeof(t)/sizeof(t[0])); r = jsmn_parse(&p, JSON_STRING, strlen(JSON_STRING), t,
sizeof(t) / sizeof(t[0]));
if (r < 0) { if (r < 0) {
printf("Failed to parse JSON: %d\n", r); printf("Failed to parse JSON: %d\n", r);
return 1; return 1;

@ -3,8 +3,8 @@
/** /**
* Allocates a fresh unused token from the token pool. * Allocates a fresh unused token from the token pool.
*/ */
static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, jsmntok_t *tokens,
jsmntok_t *tokens, size_t num_tokens) { size_t num_tokens) {
jsmntok_t *tok; jsmntok_t *tok;
if (parser->toknext >= num_tokens) { if (parser->toknext >= num_tokens) {
return NULL; return NULL;
@ -21,8 +21,8 @@ static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser,
/** /**
* Fills token type and boundaries. * Fills token type and boundaries.
*/ */
static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, int start,
int start, int end) { int end) {
token->type = type; token->type = type;
token->start = start; token->start = start;
token->end = end; token->end = end;
@ -32,8 +32,8 @@ static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type,
/** /**
* Fills next available token with JSON primitive. * Fills next available token with JSON primitive.
*/ */
static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, size_t len,
size_t len, jsmntok_t *tokens, size_t num_tokens) { jsmntok_t *tokens, size_t num_tokens) {
jsmntok_t *token; jsmntok_t *token;
int start; int start;
@ -45,8 +45,13 @@ static int jsmn_parse_primitive(jsmn_parser *parser, const char *js,
/* In strict mode primitive must be followed by "," or "}" or "]" */ /* In strict mode primitive must be followed by "," or "}" or "]" */
case ':': case ':':
#endif #endif
case '\t' : case '\r' : case '\n' : case ' ' : case '\t':
case ',' : case ']' : case '}' : case '\r':
case '\n':
case ' ':
case ',':
case ']':
case '}':
goto found; goto found;
} }
if (js[parser->pos] < 32 || js[parser->pos] >= 127) { if (js[parser->pos] < 32 || js[parser->pos] >= 127) {
@ -81,8 +86,8 @@ found:
/** /**
* Fills next token with JSON string. * Fills next token with JSON string.
*/ */
static int jsmn_parse_string(jsmn_parser *parser, const char *js, static int jsmn_parse_string(jsmn_parser *parser, const char *js, size_t len,
size_t len, jsmntok_t *tokens, size_t num_tokens) { jsmntok_t *tokens, size_t num_tokens) {
jsmntok_t *token; jsmntok_t *token;
int start = parser->pos; int start = parser->pos;
@ -116,13 +121,20 @@ static int jsmn_parse_string(jsmn_parser *parser, const char *js,
parser->pos++; parser->pos++;
switch (js[parser->pos]) { switch (js[parser->pos]) {
/* Allowed escaped symbols */ /* Allowed escaped symbols */
case '\"': case '/' : case '\\' : case 'b' : case '\"':
case 'f' : case 'r' : case 'n' : case 't' : case '/':
case '\\':
case 'b':
case 'f':
case 'r':
case 'n':
case 't':
break; break;
/* Allows escaped symbol \uXXXX */ /* Allows escaped symbol \uXXXX */
case 'u': case 'u':
parser->pos++; parser->pos++;
for(i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; i++) { for (i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0';
i++) {
/* If it isn't a hex character we have an error */ /* If it isn't a hex character we have an error */
if (!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ if (!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */
(js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */
@ -161,7 +173,8 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
c = js[parser->pos]; c = js[parser->pos];
switch (c) { switch (c) {
case '{': case '[': case '{':
case '[':
count++; count++;
if (tokens == NULL) { if (tokens == NULL) {
break; break;
@ -179,7 +192,8 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
token->start = parser->pos; token->start = parser->pos;
parser->toksuper = parser->toknext - 1; parser->toksuper = parser->toknext - 1;
break; break;
case '}': case ']': case '}':
case ']':
if (tokens == NULL) if (tokens == NULL)
break; break;
type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY);
@ -218,7 +232,8 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
} }
} }
/* Error if unmatched closing bracket */ /* Error if unmatched closing bracket */
if (i == -1) return JSMN_ERROR_INVAL; if (i == -1)
return JSMN_ERROR_INVAL;
for (; i >= 0; i--) { for (; i >= 0; i--) {
token = &tokens[i]; token = &tokens[i];
if (token->start != -1 && token->end == -1) { if (token->start != -1 && token->end == -1) {
@ -230,12 +245,16 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
break; break;
case '\"': case '\"':
r = jsmn_parse_string(parser, js, len, tokens, num_tokens); r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
if (r < 0) return r; if (r < 0)
return r;
count++; count++;
if (parser->toksuper != -1 && tokens != NULL) if (parser->toksuper != -1 && tokens != NULL)
tokens[parser->toksuper].size++; tokens[parser->toksuper].size++;
break; break;
case '\t' : case '\r' : case '\n' : case ' ': case '\t':
case '\r':
case '\n':
case ' ':
break; break;
case ':': case ':':
parser->toksuper = parser->toknext - 1; parser->toksuper = parser->toknext - 1;
@ -260,9 +279,20 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
break; break;
#ifdef JSMN_STRICT #ifdef JSMN_STRICT
/* In strict mode primitives are: numbers and booleans */ /* In strict mode primitives are: numbers and booleans */
case '-': case '0': case '1' : case '2': case '3' : case '4': case '-':
case '5': case '6': case '7' : case '8': case '9': case '0':
case 't': case 'f': case 'n' : case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 't':
case 'f':
case 'n':
/* And they must not be keys of the object */ /* And they must not be keys of the object */
if (tokens != NULL && parser->toksuper != -1) { if (tokens != NULL && parser->toksuper != -1) {
jsmntok_t *t = &tokens[parser->toksuper]; jsmntok_t *t = &tokens[parser->toksuper];
@ -276,7 +306,8 @@ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
default: default:
#endif #endif
r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens); r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
if (r < 0) return r; if (r < 0)
return r;
count++; count++;
if (parser->toksuper != -1 && tokens != NULL) if (parser->toksuper != -1 && tokens != NULL)
tokens[parser->toksuper].size++; tokens[parser->toksuper].size++;
@ -311,4 +342,3 @@ void jsmn_init(jsmn_parser *parser) {
parser->toknext = 0; parser->toknext = 0;
parser->toksuper = -1; parser->toksuper = -1;
} }

@ -63,7 +63,8 @@ typedef struct {
void jsmn_init(jsmn_parser *parser); void jsmn_init(jsmn_parser *parser);
/** /**
* 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
* a single JSON object. * a single JSON object.
*/ */
int jsmn_parse(jsmn_parser *parser, const char *js, size_t len, int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,

@ -11,7 +11,11 @@ static int test_failed = 0;
#define done() return 0 #define done() return 0
/* Check single condition */ /* Check single condition */
#define check(cond) do { if (!(cond)) fail(); } while (0) #define check(cond) \
do { \
if (!(cond)) \
fail(); \
} while (0)
/* Test runner */ /* Test runner */
static void test(int (*func)(void), const char *name) { static void test(int (*func)(void), const char *name) {

@ -1,51 +1,33 @@
#include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdarg.h>
#include "test.h" #include "test.h"
#include "testutil.h" #include "testutil.h"
int test_empty(void) { int test_empty(void) {
check(parse("{}", 1, 1, check(parse("{}", 1, 1, JSMN_OBJECT, 0, 2, 0));
JSMN_OBJECT, 0, 2, 0)); check(parse("[]", 1, 1, JSMN_ARRAY, 0, 2, 0));
check(parse("[]", 1, 1, check(parse("[{},{}]", 3, 3, JSMN_ARRAY, 0, 7, 2, JSMN_OBJECT, 1, 3, 0,
JSMN_ARRAY, 0, 2, 0));
check(parse("[{},{}]", 3, 3,
JSMN_ARRAY, 0, 7, 2,
JSMN_OBJECT, 1, 3, 0,
JSMN_OBJECT, 4, 6, 0)); JSMN_OBJECT, 4, 6, 0));
return 0; return 0;
} }
int test_object(void) { int test_object(void) {
check(parse("{\"a\":0}", 3, 3, check(parse("{\"a\":0}", 3, 3, JSMN_OBJECT, 0, 7, 1, JSMN_STRING, "a", 1,
JSMN_OBJECT, 0, 7, 1,
JSMN_STRING, "a", 1,
JSMN_PRIMITIVE, "0")); JSMN_PRIMITIVE, "0"));
check(parse("{\"a\":[]}", 3, 3, check(parse("{\"a\":[]}", 3, 3, JSMN_OBJECT, 0, 8, 1, JSMN_STRING, "a", 1,
JSMN_OBJECT, 0, 8, 1,
JSMN_STRING, "a", 1,
JSMN_ARRAY, 5, 7, 0)); JSMN_ARRAY, 5, 7, 0));
check(parse("{\"a\":{},\"b\":{}}", 5, 5, check(parse("{\"a\":{},\"b\":{}}", 5, 5, JSMN_OBJECT, -1, -1, 2, JSMN_STRING,
JSMN_OBJECT, -1, -1, 2, "a", 1, JSMN_OBJECT, -1, -1, 0, JSMN_STRING, "b", 1, JSMN_OBJECT,
JSMN_STRING, "a", 1, -1, -1, 0));
JSMN_OBJECT, -1, -1, 0,
JSMN_STRING, "b", 1,
JSMN_OBJECT, -1, -1, 0));
check(parse("{\n \"Day\": 26,\n \"Month\": 9,\n \"Year\": 12\n }", 7, 7, check(parse("{\n \"Day\": 26,\n \"Month\": 9,\n \"Year\": 12\n }", 7, 7,
JSMN_OBJECT, -1, -1, 3, JSMN_OBJECT, -1, -1, 3, JSMN_STRING, "Day", 1, JSMN_PRIMITIVE,
JSMN_STRING, "Day", 1, "26", JSMN_STRING, "Month", 1, JSMN_PRIMITIVE, "9", JSMN_STRING,
JSMN_PRIMITIVE, "26", "Year", 1, JSMN_PRIMITIVE, "12"));
JSMN_STRING, "Month", 1, check(parse("{\"a\": 0, \"b\": \"c\"}", 5, 5, JSMN_OBJECT, -1, -1, 2,
JSMN_PRIMITIVE, "9", JSMN_STRING, "a", 1, JSMN_PRIMITIVE, "0", JSMN_STRING, "b", 1,
JSMN_STRING, "Year", 1,
JSMN_PRIMITIVE, "12"));
check(parse("{\"a\": 0, \"b\": \"c\"}", 5, 5,
JSMN_OBJECT, -1, -1, 2,
JSMN_STRING, "a", 1,
JSMN_PRIMITIVE, "0",
JSMN_STRING, "b", 1,
JSMN_STRING, "c", 0)); JSMN_STRING, "c", 0));
#ifdef JSMN_STRICT #ifdef JSMN_STRICT
@ -69,9 +51,7 @@ int test_array(void) {
/* FIXME */ /* FIXME */
/*check(parse("[10}", JSMN_ERROR_INVAL, 3));*/ /*check(parse("[10}", JSMN_ERROR_INVAL, 3));*/
/*check(parse("[1,,3]", JSMN_ERROR_INVAL, 3)*/ /*check(parse("[1,,3]", JSMN_ERROR_INVAL, 3)*/
check(parse("[10]", 2, 2, check(parse("[10]", 2, 2, JSMN_ARRAY, -1, -1, 1, JSMN_PRIMITIVE, "10"));
JSMN_ARRAY, -1, -1, 1,
JSMN_PRIMITIVE, "10"));
check(parse("{\"a\": 1]", JSMN_ERROR_INVAL, 3)); check(parse("{\"a\": 1]", JSMN_ERROR_INVAL, 3));
/* FIXME */ /* FIXME */
/*check(parse("[\"a\": 1]", JSMN_ERROR_INVAL, 3));*/ /*check(parse("[\"a\": 1]", JSMN_ERROR_INVAL, 3));*/
@ -79,59 +59,36 @@ int test_array(void) {
} }
int test_primitive(void) { int test_primitive(void) {
check(parse("{\"boolVar\" : true }", 3, 3, check(parse("{\"boolVar\" : true }", 3, 3, JSMN_OBJECT, -1, -1, 1,
JSMN_OBJECT, -1, -1, 1, JSMN_STRING, "boolVar", 1, JSMN_PRIMITIVE, "true"));
JSMN_STRING, "boolVar", 1, check(parse("{\"boolVar\" : false }", 3, 3, JSMN_OBJECT, -1, -1, 1,
JSMN_PRIMITIVE, "true")); JSMN_STRING, "boolVar", 1, JSMN_PRIMITIVE, "false"));
check(parse("{\"boolVar\" : false }", 3, 3, check(parse("{\"nullVar\" : null }", 3, 3, JSMN_OBJECT, -1, -1, 1,
JSMN_OBJECT, -1, -1, 1, JSMN_STRING, "nullVar", 1, JSMN_PRIMITIVE, "null"));
JSMN_STRING, "boolVar", 1, check(parse("{\"intVar\" : 12}", 3, 3, JSMN_OBJECT, -1, -1, 1, JSMN_STRING,
JSMN_PRIMITIVE, "false")); "intVar", 1, JSMN_PRIMITIVE, "12"));
check(parse("{\"nullVar\" : null }", 3, 3, check(parse("{\"floatVar\" : 12.345}", 3, 3, JSMN_OBJECT, -1, -1, 1,
JSMN_OBJECT, -1, -1, 1, JSMN_STRING, "floatVar", 1, JSMN_PRIMITIVE, "12.345"));
JSMN_STRING, "nullVar", 1,
JSMN_PRIMITIVE, "null"));
check(parse("{\"intVar\" : 12}", 3, 3,
JSMN_OBJECT, -1, -1, 1,
JSMN_STRING, "intVar", 1,
JSMN_PRIMITIVE, "12"));
check(parse("{\"floatVar\" : 12.345}", 3, 3,
JSMN_OBJECT, -1, -1, 1,
JSMN_STRING, "floatVar", 1,
JSMN_PRIMITIVE, "12.345"));
return 0; return 0;
} }
int test_string(void) { int test_string(void) {
check(parse("{\"strVar\" : \"hello world\"}", 3, 3, check(parse("{\"strVar\" : \"hello world\"}", 3, 3, JSMN_OBJECT, -1, -1, 1,
JSMN_OBJECT, -1, -1, 1, JSMN_STRING, "strVar", 1, JSMN_STRING, "hello world", 0));
JSMN_STRING, "strVar", 1,
JSMN_STRING, "hello world", 0));
check(parse("{\"strVar\" : \"escapes: \\/\\r\\n\\t\\b\\f\\\"\\\\\"}", 3, 3, check(parse("{\"strVar\" : \"escapes: \\/\\r\\n\\t\\b\\f\\\"\\\\\"}", 3, 3,
JSMN_OBJECT, -1, -1, 1, JSMN_OBJECT, -1, -1, 1, JSMN_STRING, "strVar", 1, JSMN_STRING,
JSMN_STRING, "strVar", 1, "escapes: \\/\\r\\n\\t\\b\\f\\\"\\\\", 0));
JSMN_STRING, "escapes: \\/\\r\\n\\t\\b\\f\\\"\\\\", 0)); check(parse("{\"strVar\": \"\"}", 3, 3, JSMN_OBJECT, -1, -1, 1, JSMN_STRING,
check(parse("{\"strVar\": \"\"}", 3, 3, "strVar", 1, JSMN_STRING, "", 0));
JSMN_OBJECT, -1, -1, 1, check(parse("{\"a\":\"\\uAbcD\"}", 3, 3, JSMN_OBJECT, -1, -1, 1, JSMN_STRING,
JSMN_STRING, "strVar", 1, "a", 1, JSMN_STRING, "\\uAbcD", 0));
JSMN_STRING, "", 0)); check(parse("{\"a\":\"str\\u0000\"}", 3, 3, JSMN_OBJECT, -1, -1, 1,
check(parse("{\"a\":\"\\uAbcD\"}", 3, 3, JSMN_STRING, "a", 1, JSMN_STRING, "str\\u0000", 0));
JSMN_OBJECT, -1, -1, 1, check(parse("{\"a\":\"\\uFFFFstr\"}", 3, 3, JSMN_OBJECT, -1, -1, 1,
JSMN_STRING, "a", 1, JSMN_STRING, "a", 1, JSMN_STRING, "\\uFFFFstr", 0));
JSMN_STRING, "\\uAbcD", 0)); check(parse("{\"a\":[\"\\u0280\"]}", 4, 4, JSMN_OBJECT, -1, -1, 1,
check(parse("{\"a\":\"str\\u0000\"}", 3, 3, JSMN_STRING, "a", 1, JSMN_ARRAY, -1, -1, 1, JSMN_STRING,
JSMN_OBJECT, -1, -1, 1, "\\u0280", 0));
JSMN_STRING, "a", 1,
JSMN_STRING, "str\\u0000", 0));
check(parse("{\"a\":\"\\uFFFFstr\"}", 3, 3,
JSMN_OBJECT, -1, -1, 1,
JSMN_STRING, "a", 1,
JSMN_STRING, "\\uFFFFstr", 0));
check(parse("{\"a\":[\"\\u0280\"]}", 4, 4,
JSMN_OBJECT, -1, -1, 1,
JSMN_STRING, "a", 1,
JSMN_ARRAY, -1, -1, 1,
JSMN_STRING, "\\u0280", 0));
check(parse("{\"a\":\"str\\uFFGFstr\"}", JSMN_ERROR_INVAL, 3)); check(parse("{\"a\":\"str\\uFFGFstr\"}", JSMN_ERROR_INVAL, 3));
check(parse("{\"a\":\"str\\u@FfF\"}", JSMN_ERROR_INVAL, 3)); check(parse("{\"a\":\"str\\u@FfF\"}", JSMN_ERROR_INVAL, 3));
@ -151,12 +108,9 @@ int test_partial_string(void) {
r = jsmn_parse(&p, js, i, tok, sizeof(tok) / sizeof(tok[0])); r = jsmn_parse(&p, js, i, tok, sizeof(tok) / sizeof(tok[0]));
if (i == strlen(js)) { if (i == strlen(js)) {
check(r == 5); check(r == 5);
check(tokeq(js, tok, 5, check(tokeq(js, tok, 5, JSMN_OBJECT, -1, -1, 2, JSMN_STRING, "x", 1,
JSMN_OBJECT, -1, -1, 2, JSMN_STRING, "va\\\\ue", 0, JSMN_STRING, "y", 1, JSMN_STRING,
JSMN_STRING, "x", 1, "value y", 0));
JSMN_STRING, "va\\\\ue", 0,
JSMN_STRING, "y", 1,
JSMN_STRING, "value y", 0));
} else { } else {
check(r == JSMN_ERROR_PART); check(r == JSMN_ERROR_PART);
} }
@ -177,13 +131,9 @@ int test_partial_array(void) {
r = jsmn_parse(&p, js, i, tok, sizeof(tok) / sizeof(tok[0])); r = jsmn_parse(&p, js, i, tok, sizeof(tok) / sizeof(tok[0]));
if (i == strlen(js)) { if (i == strlen(js)) {
check(r == 6); check(r == 6);
check(tokeq(js, tok, 6, check(tokeq(js, tok, 6, JSMN_ARRAY, -1, -1, 3, JSMN_PRIMITIVE, "1",
JSMN_ARRAY, -1, -1, 3, JSMN_PRIMITIVE, "true", JSMN_ARRAY, -1, -1, 2, JSMN_PRIMITIVE,
JSMN_PRIMITIVE, "1", "123", JSMN_STRING, "hello", 0));
JSMN_PRIMITIVE, "true",
JSMN_ARRAY, -1, -1, 2,
JSMN_PRIMITIVE, "123",
JSMN_STRING, "hello", 0));
} else { } else {
check(r == JSMN_ERROR_PART); check(r == JSMN_ERROR_PART);
} }
@ -212,13 +162,9 @@ int test_array_nomem(void) {
r = jsmn_parse(&p, js, strlen(js), toklarge, 10); r = jsmn_parse(&p, js, strlen(js), toklarge, 10);
check(r >= 0); check(r >= 0);
check(tokeq(js, toklarge, 4, check(tokeq(js, toklarge, 4, JSMN_ARRAY, -1, -1, 3, JSMN_PRIMITIVE, "1",
JSMN_ARRAY, -1, -1, 3, JSMN_PRIMITIVE, "true", JSMN_ARRAY, -1, -1, 2, JSMN_PRIMITIVE,
JSMN_PRIMITIVE, "1", "123", JSMN_STRING, "hello", 0));
JSMN_PRIMITIVE, "true",
JSMN_ARRAY, -1, -1, 2,
JSMN_PRIMITIVE, "123",
JSMN_STRING, "hello", 0));
} }
return 0; return 0;
} }
@ -235,11 +181,8 @@ int test_unquoted_keys(void) {
r = jsmn_parse(&p, js, strlen(js), tok, 10); r = jsmn_parse(&p, js, strlen(js), tok, 10);
check(r >= 0); check(r >= 0);
check(tokeq(js, tok, 4, check(tokeq(js, tok, 4, JSMN_PRIMITIVE, "key1", JSMN_STRING, "value", 0,
JSMN_PRIMITIVE, "key1", JSMN_PRIMITIVE, "key2", JSMN_PRIMITIVE, "123"));
JSMN_STRING, "value", 0,
JSMN_PRIMITIVE, "key2",
JSMN_PRIMITIVE, "123"));
#endif #endif
return 0; return 0;
} }
@ -250,13 +193,16 @@ int test_issue_22(void) {
jsmntok_t tokens[128]; jsmntok_t tokens[128];
const char *js; const char *js;
js = "{ \"height\":10, \"layers\":[ { \"data\":[6,6], \"height\":10, " js =
"{ \"height\":10, \"layers\":[ { \"data\":[6,6], \"height\":10, "
"\"name\":\"Calque de Tile 1\", \"opacity\":1, \"type\":\"tilelayer\", " "\"name\":\"Calque de Tile 1\", \"opacity\":1, \"type\":\"tilelayer\", "
"\"visible\":true, \"width\":10, \"x\":0, \"y\":0 }], " "\"visible\":true, \"width\":10, \"x\":0, \"y\":0 }], "
"\"orientation\":\"orthogonal\", \"properties\": { }, \"tileheight\":32, " "\"orientation\":\"orthogonal\", \"properties\": { }, \"tileheight\":32, "
"\"tilesets\":[ { \"firstgid\":1, \"image\":\"..\\/images\\/tiles.png\", " "\"tilesets\":[ { \"firstgid\":1, \"image\":\"..\\/images\\/tiles.png\", "
"\"imageheight\":64, \"imagewidth\":160, \"margin\":0, \"name\":\"Tiles\", " "\"imageheight\":64, \"imagewidth\":160, \"margin\":0, "
"\"properties\":{}, \"spacing\":0, \"tileheight\":32, \"tilewidth\":32 }], " "\"name\":\"Tiles\", "
"\"properties\":{}, \"spacing\":0, \"tileheight\":32, \"tilewidth\":32 "
"}], "
"\"tilewidth\":32, \"version\":1, \"width\":10 }"; "\"tilewidth\":32, \"version\":1, \"width\":10 }";
jsmn_init(&p); jsmn_init(&p);
r = jsmn_parse(&p, js, strlen(js), tokens, 128); r = jsmn_parse(&p, js, strlen(js), tokens, 128);
@ -282,9 +228,7 @@ int test_input_length(void) {
jsmn_init(&p); jsmn_init(&p);
r = jsmn_parse(&p, js, 8, tokens, 10); r = jsmn_parse(&p, js, 8, tokens, 10);
check(r == 3); check(r == 3);
check(tokeq(js, tokens, 3, check(tokeq(js, tokens, 3, JSMN_OBJECT, -1, -1, 1, JSMN_STRING, "a", 1,
JSMN_OBJECT, -1, -1, 1,
JSMN_STRING, "a", 1,
JSMN_PRIMITIVE, "0")); JSMN_PRIMITIVE, "0"));
return 0; return 0;
} }
@ -336,30 +280,20 @@ int test_count(void) {
return 0; return 0;
} }
int test_nonstrict(void) { int test_nonstrict(void) {
#ifndef JSMN_STRICT #ifndef JSMN_STRICT
const char *js; const char *js;
js = "a: 0garbage"; js = "a: 0garbage";
check(parse(js, 2, 2, check(parse(js, 2, 2, JSMN_PRIMITIVE, "a", JSMN_PRIMITIVE, "0garbage"));
JSMN_PRIMITIVE, "a",
JSMN_PRIMITIVE, "0garbage"));
js = "Day : 26\nMonth : Sep\n\nYear: 12"; js = "Day : 26\nMonth : Sep\n\nYear: 12";
check(parse(js, 6, 6, check(parse(js, 6, 6, JSMN_PRIMITIVE, "Day", JSMN_PRIMITIVE, "26",
JSMN_PRIMITIVE, "Day", JSMN_PRIMITIVE, "Month", JSMN_PRIMITIVE, "Sep", JSMN_PRIMITIVE,
JSMN_PRIMITIVE, "26", "Year", JSMN_PRIMITIVE, "12"));
JSMN_PRIMITIVE, "Month",
JSMN_PRIMITIVE, "Sep",
JSMN_PRIMITIVE, "Year",
JSMN_PRIMITIVE, "12"));
// nested {s don't cause a parse error. // nested {s don't cause a parse error.
js = "\"key {1\": 1234"; js = "\"key {1\": 1234";
check(parse(js, 2, 2, check(parse(js, 2, 2, JSMN_STRING, "key {1", 1, JSMN_PRIMITIVE, "1234"));
JSMN_STRING, "key {1", 1,
JSMN_PRIMITIVE, "1234"));
#endif #endif
return 0; return 0;
@ -376,9 +310,7 @@ int test_unmatched_brackets(void) {
js = "\"key 1\"}: 1234"; js = "\"key 1\"}: 1234";
check(parse(js, JSMN_ERROR_INVAL, 3)); check(parse(js, JSMN_ERROR_INVAL, 3));
js = "{\"key {1\": 1234}"; js = "{\"key {1\": 1234}";
check(parse(js, 3, 3, check(parse(js, 3, 3, JSMN_OBJECT, 0, 16, 1, JSMN_STRING, "key {1", 1,
JSMN_OBJECT, 0, 16, 1,
JSMN_STRING, "key {1", 1,
JSMN_PRIMITIVE, "1234")); JSMN_PRIMITIVE, "1234"));
js = "{{\"key 1\": 1234}"; js = "{{\"key 1\": 1234}";
check(parse(js, JSMN_ERROR_PART, 4)); check(parse(js, JSMN_ERROR_PART, 4));

Loading…
Cancel
Save