9 if (parser->
toknext >= num_tokens) {
12 tok = &tokens[parser->
toknext++];
15 #ifdef JSMN_PARENT_LINKS 35 static int jsmn_parse_primitive(
jsmn_parser *parser,
const char *js,
36 size_t len,
jsmntok_t *tokens,
size_t num_tokens) {
42 for (; parser->
pos < len && js[parser->
pos] !=
'\0'; parser->
pos++) {
43 switch (js[parser->
pos]) {
48 case '\t' :
case '\r' :
case '\n' :
case ' ' :
49 case ',' :
case ']' :
case '}' :
52 if (js[parser->
pos] < 32 || js[parser->
pos] >= 127) {
68 token = jsmn_alloc_token(parser, tokens, num_tokens);
74 #ifdef JSMN_PARENT_LINKS 84 static int jsmn_parse_string(
jsmn_parser *parser,
const char *js,
85 size_t len,
jsmntok_t *tokens,
size_t num_tokens) {
88 int start = parser->
pos;
93 for (; parser->
pos < len && js[parser->
pos] !=
'\0'; parser->
pos++) {
94 char c = js[parser->
pos];
101 token = jsmn_alloc_token(parser, tokens, num_tokens);
107 #ifdef JSMN_PARENT_LINKS 114 if (c ==
'\\' && parser->
pos + 1 < len) {
117 switch (js[parser->
pos]) {
119 case '\"':
case '/' :
case '\\' :
case 'b' :
120 case 'f' :
case 'r' :
case 'n' :
case 't' :
125 for(i = 0; i < 4 && parser->
pos < len && js[parser->
pos] !=
'\0'; i++) {
127 if(!((js[parser->
pos] >= 48 && js[parser->
pos] <= 57) ||
128 (js[parser->
pos] >= 65 && js[parser->
pos] <= 70) ||
129 (js[parser->
pos] >= 97 && js[parser->
pos] <= 102))) {
152 jsmntok_t *tokens,
unsigned int num_tokens) {
158 for (; parser->
pos < len && js[parser->
pos] !=
'\0'; parser->
pos++) {
166 if (tokens == NULL) {
169 token = jsmn_alloc_token(parser, tokens, num_tokens);
174 #ifdef JSMN_PARENT_LINKS 186 #ifdef JSMN_PARENT_LINKS 190 token = &tokens[parser->
toknext - 1];
192 if (token->
start != -1 && token->
end == -1) {
193 if (token->
type != type) {
196 token->
end = parser->
pos + 1;
200 if (token->parent == -1) {
203 token = &tokens[token->parent];
206 for (i = parser->
toknext - 1; i >= 0; i--) {
208 if (token->
start != -1 && token->
end == -1) {
209 if (token->
type != type) {
213 token->
end = parser->
pos + 1;
219 for (; i >= 0; i--) {
221 if (token->
start != -1 && token->
end == -1) {
229 r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
232 if (parser->
toksuper != -1 && tokens != NULL)
235 case '\t' :
case '\r' :
case '\n' :
case ' ':
241 if (tokens != NULL && parser->
toksuper != -1 &&
244 #ifdef JSMN_PARENT_LINKS 247 for (i = parser->
toknext - 1; i >= 0; i--) {
249 if (tokens[i].start != -1 && tokens[i].end == -1) {
260 case '-':
case '0':
case '1' :
case '2':
case '3' :
case '4':
261 case '5':
case '6':
case '7' :
case '8':
case '9':
262 case 't':
case 'f':
case 'n' :
264 if (tokens != NULL && parser->
toksuper != -1) {
275 r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
278 if (parser->
toksuper != -1 && tokens != NULL)
290 if (tokens != NULL) {
291 for (i = parser->
toknext - 1; i >= 0; i--) {
293 if (tokens[i].start != -1 && tokens[i].end == -1) {
jsmntype_t
JSON type identifier.
int jsmn_parse(jsmn_parser *parser, const char *js, size_t len, jsmntok_t *tokens, unsigned int num_tokens)
Parse JSON string and fill tokens.
void jsmn_init(jsmn_parser *parser)
Creates a new parser based over a given buffer with an array of tokens available. ...