external/the-forge/Common_3/ThirdParty/OpenSource/cgltf/cgltf.h
static int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
	       jsmntok_t *tokens, size_t num_tokens) {
	int r;
	int i;
	jsmntok_t *token;
	int count = parser->toknext;

	for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
		char c;
		jsmntype_t type;

		c = js[parser->pos];
		switch (c) {
		case '{': case '[':
			count++;
			if (tokens == NULL) {
				break;
			}
			token = jsmn_alloc_token(parser, tokens, num_tokens);
			if (token == NULL)
				return JSMN_ERROR_NOMEM;
			if (parser->toksuper != -1) {
				tokens[parser->toksuper].size++;
#ifdef JSMN_PARENT_LINKS
				token->parent = parser->toksuper;
#endif
			}
			token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY);
			token->start = parser->pos;
			parser->toksuper = parser->toknext - 1;
			break;
		case '}': case ']':
			if (tokens == NULL)
				break;
			type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY);
#ifdef JSMN_PARENT_LINKS
			if (parser->toknext < 1) {
				return JSMN_ERROR_INVAL;
			}
			token = &tokens[parser->toknext - 1];
			for (;;) {
				if (token->start != -1 && token->end == -1) {
					if (token->type != type) {
						return JSMN_ERROR_INVAL;
					}
					token->end = parser->pos + 1;
					parser->toksuper = token->parent;
					break;
				}
				if (token->parent == -1) {
					if(token->type != type || parser->toksuper == -1) {
						return JSMN_ERROR_INVAL;
					}
					break;
				}
				token = &tokens[token->parent];
			}
#else
			for (i = parser->toknext - 1; i >= 0; i--) {
				token = &tokens[i];
				if (token->start != -1 && token->end == -1) {
					if (token->type != type) {
						return JSMN_ERROR_INVAL;
					}
					parser->toksuper = -1;
					token->end = parser->pos + 1;
					break;
				}
			}
			/* Error if unmatched closing bracket */
			if (i == -1) return JSMN_ERROR_INVAL;
			for (; i >= 0; i--) {
				token = &tokens[i];
				if (token->start != -1 && token->end == -1) {
					parser->toksuper = i;
					break;
				}
			}
#endif
			break;
		case '\"':
			r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
			if (r < 0) return r;
			count++;
			if (parser->toksuper != -1 && tokens != NULL)
				tokens[parser->toksuper].size++;
			break;
		case '\t' : case '\r' : case '\n' : case ' ':
			break;
		case ':':
			parser->toksuper = parser->toknext - 1;
			break;
		case ',':
			if (tokens != NULL && parser->toksuper != -1 &&
					tokens[parser->toksuper].type != JSMN_ARRAY &&
					tokens[parser->toksuper].type != JSMN_OBJECT) {
#ifdef JSMN_PARENT_LINKS
				parser->toksuper = tokens[parser->toksuper].parent;
#else
				for (i = parser->toknext - 1; i >= 0; i--) {
					if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) {
						if (tokens[i].start != -1 && tokens[i].end == -1) {
							parser->toksuper = i;
							break;
						}
					}
				}
#endif
			}
			break;
#ifdef JSMN_STRICT
			/* In strict mode primitives are: numbers and booleans */
		case '-': case '0': case '1' : case '2': case '3' : case '4':
		case '5': case '6': case '7' : case '8': case '9':
		case 't': case 'f': case 'n' :
			/* And they must not be keys of the object */
			if (tokens != NULL && parser->toksuper != -1) {
				jsmntok_t *t = &tokens[parser->toksuper];
				if (t->type == JSMN_OBJECT ||
						(t->type == JSMN_STRING && t->size != 0)) {
					return JSMN_ERROR_INVAL;
				}
			}
#else
			/* In non-strict mode every unquoted value is a primitive */
		default:
#endif
			r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
			if (r < 0) return r;
			count++;
			if (parser->toksuper != -1 && tokens != NULL)
				tokens[parser->toksuper].size++;
			break;

#ifdef JSMN_STRICT
			/* Unexpected char in strict mode */
		default:
			return JSMN_ERROR_INVAL;
#endif
		}
	}

	if (tokens != NULL) {
		for (i = parser->toknext - 1; i >= 0; i--) {
			/* Unmatched opened object or array */
			if (tokens[i].start != -1 && tokens[i].end == -1) {
				return JSMN_ERROR_PART;
			}
		}
	}

	return count;
}
/**
 * Parse JSON string and fill tokens.
 */
Parse JSON string and fill tokens.
Parse JSON string and fill tokens .
static int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
	       jsmntok_t *tokens, size_t num_tokens) {
	int r;
	int i;
	jsmntok_t *token;
	int count = parser->toknext;
	for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
		char c;
		jsmntype_t type;
		c = js[parser->pos];
		switch (c) {
		case '{': case '[':
			count++;
			if (tokens == NULL) {
				break;
			}
			token = jsmn_alloc_token(parser, tokens, num_tokens);
			if (token == NULL)
				return JSMN_ERROR_NOMEM;
			if (parser->toksuper != -1) {
				tokens[parser->toksuper].size++;
#ifdef JSMN_PARENT_LINKS
				token->parent = parser->toksuper;
#endif
			}
			token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY);
			token->start = parser->pos;
			parser->toksuper = parser->toknext - 1;
			break;
		case '}': case ']':
			if (tokens == NULL)
				break;
			type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY);
#ifdef JSMN_PARENT_LINKS
			if (parser->toknext < 1) {
				return JSMN_ERROR_INVAL;
			}
			token = &tokens[parser->toknext - 1];
			for (;;) {
				if (token->start != -1 && token->end == -1) {
					if (token->type != type) {
						return JSMN_ERROR_INVAL;
					}
					token->end = parser->pos + 1;
					parser->toksuper = token->parent;
					break;
				}
				if (token->parent == -1) {
					if(token->type != type || parser->toksuper == -1) {
						return JSMN_ERROR_INVAL;
					}
					break;
				}
				token = &tokens[token->parent];
			}
#else
			for (i = parser->toknext - 1; i >= 0; i--) {
				token = &tokens[i];
				if (token->start != -1 && token->end == -1) {
					if (token->type != type) {
						return JSMN_ERROR_INVAL;
					}
					parser->toksuper = -1;
					token->end = parser->pos + 1;
					break;
				}
			}
			if (i == -1) return JSMN_ERROR_INVAL;
			for (; i >= 0; i--) {
				token = &tokens[i];
				if (token->start != -1 && token->end == -1) {
					parser->toksuper = i;
					break;
				}
			}
#endif
			break;
		case '\"':
			r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
			if (r < 0) return r;
			count++;
			if (parser->toksuper != -1 && tokens != NULL)
				tokens[parser->toksuper].size++;
			break;
		case '\t' : case '\r' : case '\n' : case ' ':
			break;
		case ':':
			parser->toksuper = parser->toknext - 1;
			break;
		case ',':
			if (tokens != NULL && parser->toksuper != -1 &&
					tokens[parser->toksuper].type != JSMN_ARRAY &&
					tokens[parser->toksuper].type != JSMN_OBJECT) {
#ifdef JSMN_PARENT_LINKS
				parser->toksuper = tokens[parser->toksuper].parent;
#else
				for (i = parser->toknext - 1; i >= 0; i--) {
					if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) {
						if (tokens[i].start != -1 && tokens[i].end == -1) {
							parser->toksuper = i;
							break;
						}
					}
				}
#endif
			}
			break;
#ifdef JSMN_STRICT
		case '-': case '0': case '1' : case '2': case '3' : case '4':
		case '5': case '6': case '7' : case '8': case '9':
		case 't': case 'f': case 'n' :
			if (tokens != NULL && parser->toksuper != -1) {
				jsmntok_t *t = &tokens[parser->toksuper];
				if (t->type == JSMN_OBJECT ||
						(t->type == JSMN_STRING && t->size != 0)) {
					return JSMN_ERROR_INVAL;
				}
			}
#else
		default:
#endif
			r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
			if (r < 0) return r;
			count++;
			if (parser->toksuper != -1 && tokens != NULL)
				tokens[parser->toksuper].size++;
			break;
#ifdef JSMN_STRICT
		default:
			return JSMN_ERROR_INVAL;
#endif
		}
	}
	if (tokens != NULL) {
		for (i = parser->toknext - 1; i >= 0; i--) {
			if (tokens[i].start != -1 && tokens[i].end == -1) {
				return JSMN_ERROR_PART;
			}
		}
	}
	return count;
}
static int jsmn_parse ( jsmn_parser * parser , const char * js , size_t len , jsmntok_t * tokens , size_t num_tokens ) { int r ; int i ; jsmntok_t * token ; int count = parser -> toknext ; for ( ; parser -> pos < len && js [ parser -> pos ] != ' \0 ' ; parser -> pos ++ ) { char c ; jsmntype_t type ; c = js [ parser -> pos ] ; switch ( c ) { case ' ' : case ' ' : count ++ ; if ( tokens == NULL ) { break ; } token = jsmn_alloc_token ( parser , tokens , num_tokens ) ; if ( token == NULL ) return JSMN_ERROR_NOMEM ; if ( parser -> toksuper != -1 ) { tokens [ parser -> toksuper ] . size ++ ; #ifdef JSMN_PARENT_LINKS token -> parent = parser -> toksuper ; #endif } token -> type = ( c == ' ' ? JSMN_OBJECT : JSMN_ARRAY ) ; token -> start = parser -> pos ; parser -> toksuper = parser -> toknext - 1 ; break ; case ' ' : case ' ' : if ( tokens == NULL ) break ; type = ( c == ' ' ? JSMN_OBJECT : JSMN_ARRAY ) ; #ifdef JSMN_PARENT_LINKS if ( parser -> toknext < 1 ) { return JSMN_ERROR_INVAL ; } token = & tokens [ parser -> toknext - 1 ] ; for ( ; ; ) { if ( token -> start != -1 && token -> end == -1 ) { if ( token -> type != type ) { return JSMN_ERROR_INVAL ; } token -> end = parser -> pos + 1 ; parser -> toksuper = token -> parent ; break ; } if ( token -> parent == -1 ) { if ( token -> type != type || parser -> toksuper == -1 ) { return JSMN_ERROR_INVAL ; } break ; } token = & tokens [ token -> parent ] ; } #else for ( i = parser -> toknext - 1 ; i >= 0 ; i -- ) { token = & tokens [ i ] ; if ( token -> start != -1 && token -> end == -1 ) { if ( token -> type != type ) { return JSMN_ERROR_INVAL ; } parser -> toksuper = -1 ; token -> end = parser -> pos + 1 ; break ; } } if ( i == -1 ) return JSMN_ERROR_INVAL ; for ( ; i >= 0 ; i -- ) { token = & tokens [ i ] ; if ( token -> start != -1 && token -> end == -1 ) { parser -> toksuper = i ; break ; } } #endif break ; case ' \" ' : r = jsmn_parse_string ( parser , js , len , tokens , num_tokens ) ; if ( r < 0 ) return r ; count ++ ; if ( parser -> toksuper != -1 && tokens != NULL ) tokens [ parser -> toksuper ] . size ++ ; break ; case ' \t ' : case ' \r ' : case ' \n ' : case ' ' : break ; case ' ' : parser -> toksuper = parser -> toknext - 1 ; break ; case ' ' : if ( tokens != NULL && parser -> toksuper != -1 && tokens [ parser -> toksuper ] . type != JSMN_ARRAY && tokens [ parser -> toksuper ] . type != JSMN_OBJECT ) { #ifdef JSMN_PARENT_LINKS parser -> toksuper = tokens [ parser -> toksuper ] . parent ; #else for ( i = parser -> toknext - 1 ; i >= 0 ; i -- ) { if ( tokens [ i ] . type == JSMN_ARRAY || tokens [ i ] . type == JSMN_OBJECT ) { if ( tokens [ i ] . start != -1 && tokens [ i ] . end == -1 ) { parser -> toksuper = i ; break ; } } } #endif } break ; #ifdef JSMN_STRICT case ' ' : case ' ' : case ' ' : case ' ' : case ' ' : case ' ' : case ' ' : case ' ' : case ' ' : case ' ' : case ' ' : case ' ' : case ' ' : case ' ' : if ( tokens != NULL && parser -> toksuper != -1 ) { jsmntok_t * t = & tokens [ parser -> toksuper ] ; if ( t -> type == JSMN_OBJECT || ( t -> type == JSMN_STRING && t -> size != 0 ) ) { return JSMN_ERROR_INVAL ; } } #else default : #endif r = jsmn_parse_primitive ( parser , js , len , tokens , num_tokens ) ; if ( r < 0 ) return r ; count ++ ; if ( parser -> toksuper != -1 && tokens != NULL ) tokens [ parser -> toksuper ] . size ++ ; break ; #ifdef JSMN_STRICT default : return JSMN_ERROR_INVAL ; #endif } } if ( tokens != NULL ) { for ( i = parser -> toknext - 1 ; i >= 0 ; i -- ) { if ( tokens [ i ] . start != -1 && tokens [ i ] . end == -1 ) { return JSMN_ERROR_PART ; } } } return count ; }
Parse JSON string and fill tokens.
Parse JSON string and fill tokens .
/* Error if unmatched closing bracket */ /* In strict mode primitives are: numbers and booleans */ /* And they must not be keys of the object */ /* In non-strict mode every unquoted value is a primitive */ /* Unexpected char in strict mode */ /* Unmatched opened object or array */