summaryrefslogtreecommitdiff
path: root/jsmn.c
diff options
context:
space:
mode:
authorSerge A. Zaitsev <zaitsev.serge@gmail.com>2014-02-21 00:11:52 +0200
committerSerge A. Zaitsev <zaitsev.serge@gmail.com>2014-02-21 00:11:52 +0200
commitf0ae25f873ca13cf798a7381d9ea4c5d51db3a79 (patch)
tree6c2ed60358f8dca0faa12c51bb35b09f335ed337 /jsmn.c
parent809c7c6db1fd8691db78900b952f94150e7d98c9 (diff)
added way to specify json string length, added test for non-strict mode
Diffstat (limited to 'jsmn.c')
-rw-r--r--jsmn.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/jsmn.c b/jsmn.c
index e0644f57d..563813965 100644
--- a/jsmn.c
+++ b/jsmn.c
@@ -35,13 +35,13 @@ static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type,
* Fills next available token with JSON primitive.
*/
static jsmnerr_t jsmn_parse_primitive(jsmn_parser *parser, const char *js,
- jsmntok_t *tokens, size_t num_tokens) {
+ size_t len, jsmntok_t *tokens, size_t num_tokens) {
jsmntok_t *token;
int start;
start = parser->pos;
- for (; js[parser->pos] != '\0'; parser->pos++) {
+ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
switch (js[parser->pos]) {
#ifndef JSMN_STRICT
/* In strict mode primitive must be followed by "," or "}" or "]" */
@@ -84,7 +84,7 @@ found:
* Filsl next token with JSON string.
*/
static jsmnerr_t jsmn_parse_string(jsmn_parser *parser, const char *js,
- jsmntok_t *tokens, size_t num_tokens) {
+ size_t len, jsmntok_t *tokens, size_t num_tokens) {
jsmntok_t *token;
int start = parser->pos;
@@ -92,7 +92,7 @@ static jsmnerr_t jsmn_parse_string(jsmn_parser *parser, const char *js,
parser->pos++;
/* Skip starting quote */
- for (; js[parser->pos] != '\0'; parser->pos++) {
+ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
char c = js[parser->pos];
/* Quote: end of string */
@@ -150,22 +150,22 @@ static jsmnerr_t jsmn_parse_string(jsmn_parser *parser, const char *js,
/**
* Parse JSON string and fill tokens.
*/
-jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, jsmntok_t *tokens,
- unsigned int num_tokens) {
+jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
+ jsmntok_t *tokens, unsigned int num_tokens) {
jsmnerr_t r;
int i;
jsmntok_t *token;
int count = 0;
- for (; js[parser->pos] != '\0'; parser->pos++) {
+ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
char c;
jsmntype_t type;
c = js[parser->pos];
switch (c) {
case '{': case '[':
+ count++;
if (tokens == NULL) {
- count++;
break;
}
token = jsmn_alloc_token(parser, tokens, num_tokens);
@@ -228,7 +228,7 @@ jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, jsmntok_t *tokens,
#endif
break;
case '\"':
- r = jsmn_parse_string(parser, js, tokens, num_tokens);
+ r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
if (r < 0) return r;
count++;
if (parser->toksuper != -1 && tokens != NULL)
@@ -245,7 +245,7 @@ jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, jsmntok_t *tokens,
/* In non-strict mode every unquoted value is a primitive */
default:
#endif
- r = jsmn_parse_primitive(parser, js, tokens, num_tokens);
+ r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
if (r < 0) return r;
count++;
if (parser->toksuper != -1 && tokens != NULL)