Ribera-Iot / Json
Committer:
Amod Amatya amodamatya@gmail.com
Date:
Thu May 25 15:14:50 2017 +0545
Revision:
0:c1cd8e6ecdc9
ini

Who changed what in which revision?

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