JSON library based on JSMN lib

Dependents:   ATT_WNCInterface_Info WNCInterface_HTTP_example NerfUS-Coord Mbed_Prototype_copy_4_INNO_day_15_6_2017 ... more

C++ JSON wrapper over JSMN lib (https://github.com/zserge/jsmn).

This C++ Class is a set of common tools/procedures as a C++ wrapper over JSMN JSON parser library. It is intended to provide the boiler-plate code, with intentions to reduce code clutter, in more of C++ fashion.

In contrast to original library, Json is intended to work strictly with valid JSON structures. Non-standard JSON structures should result in an error.

This class works explicitly on the indices returned by underlying JSMN library. In the scope of this class, its function parameters, return types, and documentation, the term 'index' will always mean the index of JSMN tokens, parsed by the Json constructor, unless and until explicitly mentioned otherwise.

Committer:
faheem_chaudhary
Date:
Tue Aug 16 22:26:36 2016 +0000
Revision:
7:8aa4d0e98eb0
Parent:
5:dd98cf00ed9b
Added a very basic example in documentation

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