Library for Yodiwo's Plegma API

Committer:
mitsarionas
Date:
Mon Sep 28 08:53:12 2015 +0000
Revision:
8:710e7fa99666
Parent:
6:4596aaa1a824
fix: c linkage

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mitsarionas 0:384a04dc912e 1 #include <stdlib.h>
mitsarionas 6:4596aaa1a824 2 #include <stdbool.h>
mitsarionas 0:384a04dc912e 3
mitsarionas 0:384a04dc912e 4 #include "jsmn.h"
mitsarionas 0:384a04dc912e 5
mitsarionas 3:96b08b5f998f 6 int strcpy_escaped(char *dest, char *src)
mitsarionas 3:96b08b5f998f 7 {
mitsarionas 6:4596aaa1a824 8 if (dest == NULL || src == NULL)
mitsarionas 6:4596aaa1a824 9 return 0;
mitsarionas 3:96b08b5f998f 10 char *scur = src;
mitsarionas 3:96b08b5f998f 11 char *dcur = dest;
mitsarionas 3:96b08b5f998f 12 while(*scur != '\0') {
mitsarionas 3:96b08b5f998f 13 if (*scur == '\"' || *scur == '\\') {
mitsarionas 3:96b08b5f998f 14 *(dcur++) = '\\';
mitsarionas 3:96b08b5f998f 15 }
mitsarionas 3:96b08b5f998f 16 *(dcur++) = *(scur++);
mitsarionas 3:96b08b5f998f 17 }
mitsarionas 3:96b08b5f998f 18 *dcur = '\0';
mitsarionas 3:96b08b5f998f 19 return dcur - dest;
mitsarionas 3:96b08b5f998f 20 }
mitsarionas 3:96b08b5f998f 21
mitsarionas 3:96b08b5f998f 22 int memcpy_unescaped(void *dest, void *src, int n_source)
mitsarionas 3:96b08b5f998f 23 {
mitsarionas 3:96b08b5f998f 24 char *s = src;
mitsarionas 3:96b08b5f998f 25 char *d = dest;
mitsarionas 3:96b08b5f998f 26 int i;
mitsarionas 3:96b08b5f998f 27 int j = 0;
mitsarionas 3:96b08b5f998f 28 for(i = 0; i < n_source; i++, j++) {
mitsarionas 3:96b08b5f998f 29 if (s[i] == '\\' && i != n_source - 1)
mitsarionas 3:96b08b5f998f 30 i++;
mitsarionas 3:96b08b5f998f 31 d[j] = s[i];
mitsarionas 3:96b08b5f998f 32 }
mitsarionas 3:96b08b5f998f 33 return j - 1;
mitsarionas 3:96b08b5f998f 34 }
mitsarionas 3:96b08b5f998f 35
mitsarionas 3:96b08b5f998f 36 int count_escaped(char *buf, int len)
mitsarionas 3:96b08b5f998f 37 {
mitsarionas 3:96b08b5f998f 38 int cnt = 0;
mitsarionas 3:96b08b5f998f 39 int i = 0;
mitsarionas 3:96b08b5f998f 40 while(i < len - 1) {
mitsarionas 3:96b08b5f998f 41 if (buf[i] == '\\') {
mitsarionas 3:96b08b5f998f 42 cnt++;
mitsarionas 3:96b08b5f998f 43 i++;
mitsarionas 3:96b08b5f998f 44 }
mitsarionas 3:96b08b5f998f 45 i++;
mitsarionas 3:96b08b5f998f 46 }
mitsarionas 3:96b08b5f998f 47 return cnt;
mitsarionas 3:96b08b5f998f 48 }
mitsarionas 3:96b08b5f998f 49
mitsarionas 0:384a04dc912e 50 /**
mitsarionas 0:384a04dc912e 51 * Allocates a fresh unused token from the token pull.
mitsarionas 0:384a04dc912e 52 */
mitsarionas 0:384a04dc912e 53 static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser,
mitsarionas 0:384a04dc912e 54 jsmntok_t *tokens, size_t num_tokens) {
mitsarionas 0:384a04dc912e 55 jsmntok_t *tok;
mitsarionas 0:384a04dc912e 56 if (parser->toknext >= num_tokens) {
mitsarionas 0:384a04dc912e 57 return NULL;
mitsarionas 0:384a04dc912e 58 }
mitsarionas 0:384a04dc912e 59 tok = &tokens[parser->toknext++];
mitsarionas 0:384a04dc912e 60 tok->start = tok->end = -1;
mitsarionas 0:384a04dc912e 61 tok->size = 0;
mitsarionas 0:384a04dc912e 62 #ifdef JSMN_PARENT_LINKS
mitsarionas 0:384a04dc912e 63 tok->parent = -1;
mitsarionas 0:384a04dc912e 64 #endif
mitsarionas 0:384a04dc912e 65 return tok;
mitsarionas 0:384a04dc912e 66 }
mitsarionas 0:384a04dc912e 67
mitsarionas 0:384a04dc912e 68 /**
mitsarionas 0:384a04dc912e 69 * Fills token type and boundaries.
mitsarionas 0:384a04dc912e 70 */
mitsarionas 0:384a04dc912e 71 static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type,
mitsarionas 0:384a04dc912e 72 int start, int end) {
mitsarionas 0:384a04dc912e 73 token->type = type;
mitsarionas 0:384a04dc912e 74 token->start = start;
mitsarionas 0:384a04dc912e 75 token->end = end;
mitsarionas 0:384a04dc912e 76 token->size = 0;
mitsarionas 0:384a04dc912e 77 }
mitsarionas 0:384a04dc912e 78
mitsarionas 0:384a04dc912e 79 /**
mitsarionas 0:384a04dc912e 80 * Fills next available token with JSON primitive.
mitsarionas 0:384a04dc912e 81 */
mitsarionas 0:384a04dc912e 82 static jsmnerr_t jsmn_parse_primitive(jsmn_parser *parser, const char *js,
mitsarionas 0:384a04dc912e 83 size_t len, jsmntok_t *tokens, size_t num_tokens) {
mitsarionas 0:384a04dc912e 84 jsmntok_t *token;
mitsarionas 0:384a04dc912e 85 int start;
mitsarionas 0:384a04dc912e 86
mitsarionas 0:384a04dc912e 87 start = parser->pos;
mitsarionas 0:384a04dc912e 88
mitsarionas 0:384a04dc912e 89 for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
mitsarionas 0:384a04dc912e 90 switch (js[parser->pos]) {
mitsarionas 0:384a04dc912e 91 #ifndef JSMN_STRICT
mitsarionas 0:384a04dc912e 92 /* In strict mode primitive must be followed by "," or "}" or "]" */
mitsarionas 0:384a04dc912e 93 case ':':
mitsarionas 0:384a04dc912e 94 #endif
mitsarionas 0:384a04dc912e 95 case '\t' : case '\r' : case '\n' : case ' ' :
mitsarionas 0:384a04dc912e 96 case ',' : case ']' : case '}' :
mitsarionas 0:384a04dc912e 97 goto found;
mitsarionas 0:384a04dc912e 98 }
mitsarionas 0:384a04dc912e 99 if (js[parser->pos] < 32 || js[parser->pos] >= 127) {
mitsarionas 0:384a04dc912e 100 parser->pos = start;
mitsarionas 0:384a04dc912e 101 return JSMN_ERROR_INVAL;
mitsarionas 0:384a04dc912e 102 }
mitsarionas 0:384a04dc912e 103 }
mitsarionas 0:384a04dc912e 104 #ifdef JSMN_STRICT
mitsarionas 0:384a04dc912e 105 /* In strict mode primitive must be followed by a comma/object/array */
mitsarionas 0:384a04dc912e 106 parser->pos = start;
mitsarionas 0:384a04dc912e 107 return JSMN_ERROR_PART;
mitsarionas 0:384a04dc912e 108 #endif
mitsarionas 0:384a04dc912e 109
mitsarionas 0:384a04dc912e 110 found:
mitsarionas 0:384a04dc912e 111 if (tokens == NULL) {
mitsarionas 0:384a04dc912e 112 parser->pos--;
mitsarionas 0:384a04dc912e 113 return 0;
mitsarionas 0:384a04dc912e 114 }
mitsarionas 0:384a04dc912e 115 token = jsmn_alloc_token(parser, tokens, num_tokens);
mitsarionas 0:384a04dc912e 116 if (token == NULL) {
mitsarionas 0:384a04dc912e 117 parser->pos = start;
mitsarionas 0:384a04dc912e 118 return JSMN_ERROR_NOMEM;
mitsarionas 0:384a04dc912e 119 }
mitsarionas 0:384a04dc912e 120 jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos);
mitsarionas 0:384a04dc912e 121 #ifdef JSMN_PARENT_LINKS
mitsarionas 0:384a04dc912e 122 token->parent = parser->toksuper;
mitsarionas 0:384a04dc912e 123 #endif
mitsarionas 0:384a04dc912e 124 parser->pos--;
mitsarionas 0:384a04dc912e 125 return 0;
mitsarionas 0:384a04dc912e 126 }
mitsarionas 0:384a04dc912e 127
mitsarionas 0:384a04dc912e 128 /**
mitsarionas 0:384a04dc912e 129 * Filsl next token with JSON string.
mitsarionas 0:384a04dc912e 130 */
mitsarionas 0:384a04dc912e 131 static jsmnerr_t jsmn_parse_string(jsmn_parser *parser, const char *js,
mitsarionas 0:384a04dc912e 132 size_t len, jsmntok_t *tokens, size_t num_tokens) {
mitsarionas 0:384a04dc912e 133 jsmntok_t *token;
mitsarionas 0:384a04dc912e 134
mitsarionas 0:384a04dc912e 135 int start = parser->pos;
mitsarionas 0:384a04dc912e 136
mitsarionas 0:384a04dc912e 137 parser->pos++;
mitsarionas 0:384a04dc912e 138
mitsarionas 0:384a04dc912e 139 /* Skip starting quote */
mitsarionas 0:384a04dc912e 140 for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
mitsarionas 0:384a04dc912e 141 char c = js[parser->pos];
mitsarionas 0:384a04dc912e 142
mitsarionas 0:384a04dc912e 143 /* Quote: end of string */
mitsarionas 0:384a04dc912e 144 if (c == '\"') {
mitsarionas 0:384a04dc912e 145 if (tokens == NULL) {
mitsarionas 0:384a04dc912e 146 return 0;
mitsarionas 0:384a04dc912e 147 }
mitsarionas 0:384a04dc912e 148 token = jsmn_alloc_token(parser, tokens, num_tokens);
mitsarionas 0:384a04dc912e 149 if (token == NULL) {
mitsarionas 0:384a04dc912e 150 parser->pos = start;
mitsarionas 0:384a04dc912e 151 return JSMN_ERROR_NOMEM;
mitsarionas 0:384a04dc912e 152 }
mitsarionas 0:384a04dc912e 153 jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos);
mitsarionas 0:384a04dc912e 154 #ifdef JSMN_PARENT_LINKS
mitsarionas 0:384a04dc912e 155 token->parent = parser->toksuper;
mitsarionas 0:384a04dc912e 156 #endif
mitsarionas 0:384a04dc912e 157 return 0;
mitsarionas 0:384a04dc912e 158 }
mitsarionas 0:384a04dc912e 159
mitsarionas 0:384a04dc912e 160 /* Backslash: Quoted symbol expected */
mitsarionas 0:384a04dc912e 161 if (c == '\\' && parser->pos + 1 < len) {
mitsarionas 0:384a04dc912e 162 int i;
mitsarionas 0:384a04dc912e 163 parser->pos++;
mitsarionas 0:384a04dc912e 164 switch (js[parser->pos]) {
mitsarionas 0:384a04dc912e 165 /* Allowed escaped symbols */
mitsarionas 0:384a04dc912e 166 case '\"': case '/' : case '\\' : case 'b' :
mitsarionas 0:384a04dc912e 167 case 'f' : case 'r' : case 'n' : case 't' :
mitsarionas 0:384a04dc912e 168 break;
mitsarionas 0:384a04dc912e 169 /* Allows escaped symbol \uXXXX */
mitsarionas 0:384a04dc912e 170 case 'u':
mitsarionas 0:384a04dc912e 171 parser->pos++;
mitsarionas 0:384a04dc912e 172 for(i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; i++) {
mitsarionas 0:384a04dc912e 173 /* If it isn't a hex character we have an error */
mitsarionas 0:384a04dc912e 174 if(!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */
mitsarionas 0:384a04dc912e 175 (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */
mitsarionas 0:384a04dc912e 176 (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */
mitsarionas 0:384a04dc912e 177 parser->pos = start;
mitsarionas 0:384a04dc912e 178 return JSMN_ERROR_INVAL;
mitsarionas 0:384a04dc912e 179 }
mitsarionas 0:384a04dc912e 180 parser->pos++;
mitsarionas 0:384a04dc912e 181 }
mitsarionas 0:384a04dc912e 182 parser->pos--;
mitsarionas 0:384a04dc912e 183 break;
mitsarionas 0:384a04dc912e 184 /* Unexpected symbol */
mitsarionas 0:384a04dc912e 185 default:
mitsarionas 0:384a04dc912e 186 parser->pos = start;
mitsarionas 0:384a04dc912e 187 return JSMN_ERROR_INVAL;
mitsarionas 0:384a04dc912e 188 }
mitsarionas 0:384a04dc912e 189 }
mitsarionas 0:384a04dc912e 190 }
mitsarionas 0:384a04dc912e 191 parser->pos = start;
mitsarionas 0:384a04dc912e 192 return JSMN_ERROR_PART;
mitsarionas 0:384a04dc912e 193 }
mitsarionas 0:384a04dc912e 194
mitsarionas 0:384a04dc912e 195 /**
mitsarionas 0:384a04dc912e 196 * Parse JSON string and fill tokens.
mitsarionas 0:384a04dc912e 197 */
mitsarionas 0:384a04dc912e 198 jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
mitsarionas 0:384a04dc912e 199 jsmntok_t *tokens, unsigned int num_tokens) {
mitsarionas 0:384a04dc912e 200 jsmnerr_t r;
mitsarionas 0:384a04dc912e 201 int i;
mitsarionas 0:384a04dc912e 202 jsmntok_t *token;
mitsarionas 0:384a04dc912e 203 int count = 0;
mitsarionas 0:384a04dc912e 204
mitsarionas 0:384a04dc912e 205 for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
mitsarionas 0:384a04dc912e 206 char c;
mitsarionas 0:384a04dc912e 207 jsmntype_t type;
mitsarionas 0:384a04dc912e 208
mitsarionas 0:384a04dc912e 209 c = js[parser->pos];
mitsarionas 0:384a04dc912e 210 switch (c) {
mitsarionas 0:384a04dc912e 211 case '{': case '[':
mitsarionas 0:384a04dc912e 212 count++;
mitsarionas 0:384a04dc912e 213 if (tokens == NULL) {
mitsarionas 0:384a04dc912e 214 break;
mitsarionas 0:384a04dc912e 215 }
mitsarionas 0:384a04dc912e 216 token = jsmn_alloc_token(parser, tokens, num_tokens);
mitsarionas 0:384a04dc912e 217 if (token == NULL)
mitsarionas 0:384a04dc912e 218 return JSMN_ERROR_NOMEM;
mitsarionas 0:384a04dc912e 219 if (parser->toksuper != -1) {
mitsarionas 0:384a04dc912e 220 tokens[parser->toksuper].size++;
mitsarionas 0:384a04dc912e 221 #ifdef JSMN_PARENT_LINKS
mitsarionas 0:384a04dc912e 222 token->parent = parser->toksuper;
mitsarionas 0:384a04dc912e 223 #endif
mitsarionas 0:384a04dc912e 224 }
mitsarionas 0:384a04dc912e 225 token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY);
mitsarionas 0:384a04dc912e 226 token->start = parser->pos;
mitsarionas 0:384a04dc912e 227 parser->toksuper = parser->toknext - 1;
mitsarionas 0:384a04dc912e 228 break;
mitsarionas 0:384a04dc912e 229 case '}': case ']':
mitsarionas 0:384a04dc912e 230 if (tokens == NULL)
mitsarionas 0:384a04dc912e 231 break;
mitsarionas 0:384a04dc912e 232 type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY);
mitsarionas 0:384a04dc912e 233 #ifdef JSMN_PARENT_LINKS
mitsarionas 0:384a04dc912e 234 if (parser->toknext < 1) {
mitsarionas 0:384a04dc912e 235 return JSMN_ERROR_INVAL;
mitsarionas 0:384a04dc912e 236 }
mitsarionas 0:384a04dc912e 237 token = &tokens[parser->toknext - 1];
mitsarionas 0:384a04dc912e 238 for (;;) {
mitsarionas 0:384a04dc912e 239 if (token->start != -1 && token->end == -1) {
mitsarionas 0:384a04dc912e 240 if (token->type != type) {
mitsarionas 0:384a04dc912e 241 return JSMN_ERROR_INVAL;
mitsarionas 0:384a04dc912e 242 }
mitsarionas 0:384a04dc912e 243 token->end = parser->pos + 1;
mitsarionas 0:384a04dc912e 244 parser->toksuper = token->parent;
mitsarionas 0:384a04dc912e 245 break;
mitsarionas 0:384a04dc912e 246 }
mitsarionas 0:384a04dc912e 247 if (token->parent == -1) {
mitsarionas 0:384a04dc912e 248 break;
mitsarionas 0:384a04dc912e 249 }
mitsarionas 0:384a04dc912e 250 token = &tokens[token->parent];
mitsarionas 0:384a04dc912e 251 }
mitsarionas 0:384a04dc912e 252 #else
mitsarionas 0:384a04dc912e 253 for (i = parser->toknext - 1; i >= 0; i--) {
mitsarionas 0:384a04dc912e 254 token = &tokens[i];
mitsarionas 0:384a04dc912e 255 if (token->start != -1 && token->end == -1) {
mitsarionas 0:384a04dc912e 256 if (token->type != type) {
mitsarionas 0:384a04dc912e 257 return JSMN_ERROR_INVAL;
mitsarionas 0:384a04dc912e 258 }
mitsarionas 0:384a04dc912e 259 parser->toksuper = -1;
mitsarionas 0:384a04dc912e 260 token->end = parser->pos + 1;
mitsarionas 0:384a04dc912e 261 break;
mitsarionas 0:384a04dc912e 262 }
mitsarionas 0:384a04dc912e 263 }
mitsarionas 0:384a04dc912e 264 /* Error if unmatched closing bracket */
mitsarionas 0:384a04dc912e 265 if (i == -1) return JSMN_ERROR_INVAL;
mitsarionas 0:384a04dc912e 266 for (; i >= 0; i--) {
mitsarionas 0:384a04dc912e 267 token = &tokens[i];
mitsarionas 0:384a04dc912e 268 if (token->start != -1 && token->end == -1) {
mitsarionas 0:384a04dc912e 269 parser->toksuper = i;
mitsarionas 0:384a04dc912e 270 break;
mitsarionas 0:384a04dc912e 271 }
mitsarionas 0:384a04dc912e 272 }
mitsarionas 0:384a04dc912e 273 #endif
mitsarionas 0:384a04dc912e 274 break;
mitsarionas 0:384a04dc912e 275 case '\"':
mitsarionas 0:384a04dc912e 276 r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
mitsarionas 0:384a04dc912e 277 if (r < 0) return r;
mitsarionas 0:384a04dc912e 278 count++;
mitsarionas 0:384a04dc912e 279 if (parser->toksuper != -1 && tokens != NULL)
mitsarionas 0:384a04dc912e 280 tokens[parser->toksuper].size++;
mitsarionas 0:384a04dc912e 281 break;
mitsarionas 0:384a04dc912e 282 case '\t' : case '\r' : case '\n' : case ' ':
mitsarionas 0:384a04dc912e 283 break;
mitsarionas 0:384a04dc912e 284 case ':':
mitsarionas 0:384a04dc912e 285 parser->toksuper = parser->toknext - 1;
mitsarionas 0:384a04dc912e 286 break;
mitsarionas 0:384a04dc912e 287 case ',':
mitsarionas 0:384a04dc912e 288 if (tokens != NULL &&
mitsarionas 0:384a04dc912e 289 tokens[parser->toksuper].type != JSMN_ARRAY &&
mitsarionas 0:384a04dc912e 290 tokens[parser->toksuper].type != JSMN_OBJECT) {
mitsarionas 0:384a04dc912e 291 #ifdef JSMN_PARENT_LINKS
mitsarionas 0:384a04dc912e 292 parser->toksuper = tokens[parser->toksuper].parent;
mitsarionas 0:384a04dc912e 293 #else
mitsarionas 0:384a04dc912e 294 for (i = parser->toknext - 1; i >= 0; i--) {
mitsarionas 0:384a04dc912e 295 if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) {
mitsarionas 0:384a04dc912e 296 if (tokens[i].start != -1 && tokens[i].end == -1) {
mitsarionas 0:384a04dc912e 297 parser->toksuper = i;
mitsarionas 0:384a04dc912e 298 break;
mitsarionas 0:384a04dc912e 299 }
mitsarionas 0:384a04dc912e 300 }
mitsarionas 0:384a04dc912e 301 }
mitsarionas 0:384a04dc912e 302 #endif
mitsarionas 0:384a04dc912e 303 }
mitsarionas 0:384a04dc912e 304 break;
mitsarionas 0:384a04dc912e 305 #ifdef JSMN_STRICT
mitsarionas 0:384a04dc912e 306 /* In strict mode primitives are: numbers and booleans */
mitsarionas 0:384a04dc912e 307 case '-': case '0': case '1' : case '2': case '3' : case '4':
mitsarionas 0:384a04dc912e 308 case '5': case '6': case '7' : case '8': case '9':
mitsarionas 0:384a04dc912e 309 case 't': case 'f': case 'n' :
mitsarionas 0:384a04dc912e 310 /* And they must not be keys of the object */
mitsarionas 0:384a04dc912e 311 if (tokens != NULL) {
mitsarionas 0:384a04dc912e 312 jsmntok_t *t = &tokens[parser->toksuper];
mitsarionas 0:384a04dc912e 313 if (t->type == JSMN_OBJECT ||
mitsarionas 0:384a04dc912e 314 (t->type == JSMN_STRING && t->size != 0)) {
mitsarionas 0:384a04dc912e 315 return JSMN_ERROR_INVAL;
mitsarionas 0:384a04dc912e 316 }
mitsarionas 0:384a04dc912e 317 }
mitsarionas 0:384a04dc912e 318 #else
mitsarionas 0:384a04dc912e 319 /* In non-strict mode every unquoted value is a primitive */
mitsarionas 0:384a04dc912e 320 default:
mitsarionas 0:384a04dc912e 321 #endif
mitsarionas 0:384a04dc912e 322 r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
mitsarionas 0:384a04dc912e 323 if (r < 0) return r;
mitsarionas 0:384a04dc912e 324 count++;
mitsarionas 0:384a04dc912e 325 if (parser->toksuper != -1 && tokens != NULL)
mitsarionas 0:384a04dc912e 326 tokens[parser->toksuper].size++;
mitsarionas 0:384a04dc912e 327 break;
mitsarionas 0:384a04dc912e 328
mitsarionas 0:384a04dc912e 329 #ifdef JSMN_STRICT
mitsarionas 0:384a04dc912e 330 /* Unexpected char in strict mode */
mitsarionas 0:384a04dc912e 331 default:
mitsarionas 0:384a04dc912e 332 return JSMN_ERROR_INVAL;
mitsarionas 0:384a04dc912e 333 #endif
mitsarionas 0:384a04dc912e 334 }
mitsarionas 0:384a04dc912e 335 }
mitsarionas 0:384a04dc912e 336
mitsarionas 0:384a04dc912e 337 for (i = parser->toknext - 1; i >= 0; i--) {
mitsarionas 0:384a04dc912e 338 /* Unmatched opened object or array */
mitsarionas 0:384a04dc912e 339 if (tokens[i].start != -1 && tokens[i].end == -1) {
mitsarionas 0:384a04dc912e 340 return JSMN_ERROR_PART;
mitsarionas 0:384a04dc912e 341 }
mitsarionas 0:384a04dc912e 342 }
mitsarionas 0:384a04dc912e 343
mitsarionas 0:384a04dc912e 344 return count;
mitsarionas 0:384a04dc912e 345 }
mitsarionas 0:384a04dc912e 346
mitsarionas 0:384a04dc912e 347 /**
mitsarionas 0:384a04dc912e 348 * Creates a new parser based over a given buffer with an array of tokens
mitsarionas 0:384a04dc912e 349 * available.
mitsarionas 0:384a04dc912e 350 */
mitsarionas 0:384a04dc912e 351 void jsmn_init(jsmn_parser *parser) {
mitsarionas 0:384a04dc912e 352 parser->pos = 0;
mitsarionas 0:384a04dc912e 353 parser->toknext = 0;
mitsarionas 0:384a04dc912e 354 parser->toksuper = -1;
mitsarionas 0:384a04dc912e 355 }
mitsarionas 0:384a04dc912e 356
mitsarionas 6:4596aaa1a824 357