| 261 |
261 |
| 262 // current token type and start index |
262 // current token type and start index |
| 263 CxJsonTokenType ttype = json->uncompleted.tokentype; |
263 CxJsonTokenType ttype = json->uncompleted.tokentype; |
| 264 size_t token_part_start = json->buffer.pos; |
264 size_t token_part_start = json->buffer.pos; |
| 265 |
265 |
| |
266 bool escape_end_of_string = ttype == CX_JSON_TOKEN_STRING |
| |
267 && json->uncompleted.content.ptr[json->uncompleted.content.length-1] == '\\'; |
| |
268 |
| 266 for (size_t i = json->buffer.pos; i < json->buffer.size; i++) { |
269 for (size_t i = json->buffer.pos; i < json->buffer.size; i++) { |
| 267 char c = json->buffer.space[i]; |
270 char c = json->buffer.space[i]; |
| 268 if (ttype != CX_JSON_TOKEN_STRING) { |
271 if (ttype != CX_JSON_TOKEN_STRING) { |
| 269 // currently non-string token |
272 // currently non-string token |
| 270 CxJsonTokenType ctype = char2ttype(c); // start of new token? |
273 CxJsonTokenType ctype = char2ttype(c); // start of new token? |
| 299 return CX_JSON_NO_ERROR; |
302 return CX_JSON_NO_ERROR; |
| 300 } |
303 } |
| 301 } |
304 } |
| 302 } else { |
305 } else { |
| 303 // currently inside a string |
306 // currently inside a string |
| 304 if (json->tokenizer_escape) { |
307 if (escape_end_of_string) { |
| 305 json->tokenizer_escape = false; |
308 escape_end_of_string = false; |
| 306 } else { |
309 } else { |
| 307 if (c == '"') { |
310 if (c == '"') { |
| 308 *result = token_create(json, true, token_part_start, i + 1); |
311 *result = token_create(json, true, token_part_start, i + 1); |
| 309 if (result->tokentype == CX_JSON_NO_TOKEN) { |
312 if (result->tokentype == CX_JSON_NO_TOKEN) { |
| 310 return CX_JSON_BUFFER_ALLOC_FAILED; // LCOV_EXCL_LINE |
313 return CX_JSON_BUFFER_ALLOC_FAILED; // LCOV_EXCL_LINE |
| 311 } |
314 } |
| 312 json->buffer.pos = i + 1; |
315 json->buffer.pos = i + 1; |
| 313 return CX_JSON_NO_ERROR; |
316 return CX_JSON_NO_ERROR; |
| 314 } else if (c == '\\') { |
317 } else if (c == '\\') { |
| 315 json->tokenizer_escape = true; |
318 escape_end_of_string = true; |
| 316 } |
319 } |
| 317 } |
320 } |
| 318 } |
321 } |
| 319 } |
322 } |
| 320 |
323 |