json lib

Dependents:   grove_stream_jpa_sd2 grove_stream_jpa_sd2 grove_stream_jpa_sd2-2 grove_stream_jpa_sd2-3 ... more

Committer:
38domo
Date:
Mon Aug 31 17:50:53 2020 +0000
Revision:
8:43e1e35bb7ec
Parent:
5:dd98cf00ed9b
jpa json

Who changed what in which revision?

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