31 if (parser->
toknext >= num_tokens) {
34 tok = &tokens[parser->
toknext++];
37 #ifdef JSMN_PARENT_LINKS
64 for (; parser->
pos < len && js[parser->
pos] !=
'\0'; parser->
pos++) {
65 switch (js[parser->
pos]) {
70 case '\t' :
case '\r' :
case '\n' :
case ' ' :
71 case ',' :
case ']' :
case '}' :
74 if (js[parser->
pos] < 32 || js[parser->
pos] >= 127) {
96 #ifdef JSMN_PARENT_LINKS
110 int start = parser->
pos;
115 for (; parser->
pos < len && js[parser->
pos] !=
'\0'; parser->
pos++) {
116 char c = js[parser->
pos];
120 if (tokens == NULL) {
129 #ifdef JSMN_PARENT_LINKS
136 if (c ==
'\\' && parser->
pos + 1 < len) {
139 switch (js[parser->
pos]) {
141 case '\"':
case '/' :
case '\\' :
case 'b' :
142 case 'f' :
case 'r' :
case 'n' :
case 't' :
147 for(i = 0; i < 4 && parser->
pos < len && js[parser->
pos] !=
'\0'; i++) {
149 if(!((js[parser->
pos] >= 48 && js[parser->
pos] <= 57) ||
150 (js[parser->
pos] >= 65 && js[parser->
pos] <= 70) ||
151 (js[parser->
pos] >= 97 && js[parser->
pos] <= 102))) {
180 for (; parser->
pos < len && js[parser->
pos] !=
'\0'; parser->
pos++) {
188 if (tokens == NULL) {
196 #ifdef JSMN_PARENT_LINKS
208 #ifdef JSMN_PARENT_LINKS
212 token = &tokens[parser->
toknext - 1];
214 if (token->
start != -1 && token->
end == -1) {
215 if (token->
type != type) {
218 token->
end = parser->
pos + 1;
222 if (token->parent == -1) {
228 token = &tokens[token->parent];
231 for (i = parser->
toknext - 1; i >= 0; i--) {
233 if (token->
start != -1 && token->
end == -1) {
234 if (token->
type != type) {
238 token->
end = parser->
pos + 1;
244 for (; i >= 0; i--) {
246 if (token->
start != -1 && token->
end == -1) {
257 if (parser->
toksuper != -1 && tokens != NULL)
260 case '\t' :
case '\r' :
case '\n' :
case ' ':
266 if (tokens != NULL && parser->
toksuper != -1 &&
269 #ifdef JSMN_PARENT_LINKS
272 for (i = parser->
toknext - 1; i >= 0; i--) {
274 if (tokens[i].start != -1 && tokens[i].end == -1) {
285 case '-':
case '0':
case '1' :
case '2':
case '3' :
case '4':
286 case '5':
case '6':
case '7' :
case '8':
case '9':
287 case 't':
case 'f':
case 'n' :
289 if (tokens != NULL && parser->
toksuper != -1) {
303 if (parser->
toksuper != -1 && tokens != NULL)
315 if (tokens != NULL) {
316 for (i = parser->
toknext - 1; i >= 0; i--) {
318 if (tokens[i].start != -1 && tokens[i].end == -1) {
static jsmntok_t * jsmn_alloc_token(jsmn_parser *parser, jsmntok_t *tokens, size_t num_tokens)
Allocates a fresh unused token from the token pull.
jsmntype_t
JSON type identifier.
static int jsmn_parse_string(jsmn_parser *parser, const char *js, size_t len, jsmntok_t *tokens, size_t num_tokens)
Fills next token with JSON string.
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.
static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, size_t len, jsmntok_t *tokens, size_t num_tokens)
Fills next available token with JSON primitive.
void jsmn_init(jsmn_parser *parser)
Creates a new parser based over a given buffer with an array of tokens available. ...
static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, int start, int end)
Fills token type and boundaries.
static const char tokens[256]