| 408 | } |
| 409 | |
| 410 | static int jl_parse_number(jl_parser_t *parser) { |
| 411 | size_t pos = parser->pos; |
| 412 | if (pos < parser->length && |
| 413 | (parser->text[pos] == '-' || (!parser->strict && parser->text[pos] == '+'))) { |
| 414 | pos++; |
| 415 | } |
| 416 | if (!parser->strict && parser->length - pos >= 8U && |
| 417 | memcmp(parser->text + pos, "Infinity", 8U) == 0) { |
| 418 | parser->pos = pos + 8U; |
| 419 | return 0; |
| 420 | } |
| 421 | if (!parser->strict && parser->length - pos >= 3U && |
| 422 | memcmp(parser->text + pos, "NaN", 3U) == 0) { |
| 423 | parser->pos = pos + 3U; |
| 424 | return 0; |
| 425 | } |
| 426 | if (!parser->strict && parser->length - pos >= 3U && parser->text[pos] == '0' && |
| 427 | (parser->text[pos + 1U] == 'x' || parser->text[pos + 1U] == 'X')) { |
| 428 | pos += 2U; |
| 429 | size_t digits = pos; |
| 430 | while (pos < parser->length && jl_is_hex((unsigned char)parser->text[pos])) { |
| 431 | pos++; |
| 432 | } |
| 433 | if (pos == digits) { |
| 434 | return -1; |
| 435 | } |
| 436 | parser->pos = pos; |
| 437 | return 0; |
| 438 | } |
| 439 | |
| 440 | bool integer_digits = false; |
| 441 | if (pos < parser->length && parser->text[pos] == '0') { |
| 442 | integer_digits = true; |
| 443 | pos++; |
| 444 | if (parser->strict && pos < parser->length && parser->text[pos] >= '0' && |
| 445 | parser->text[pos] <= '9') { |
| 446 | return -1; |
| 447 | } |
| 448 | } else { |
| 449 | while (pos < parser->length && parser->text[pos] >= '0' && parser->text[pos] <= '9') { |
| 450 | pos++; |
| 451 | integer_digits = true; |
| 452 | } |
| 453 | } |
| 454 | if (parser->strict && !integer_digits) { |
| 455 | return -1; |
| 456 | } |
| 457 | |
| 458 | bool fraction_digits = false; |
| 459 | if (pos < parser->length && parser->text[pos] == '.') { |
| 460 | pos++; |
| 461 | while (pos < parser->length && parser->text[pos] >= '0' && parser->text[pos] <= '9') { |
| 462 | pos++; |
| 463 | fraction_digits = true; |
| 464 | } |
| 465 | if (parser->strict && !fraction_digits) { |
| 466 | return -1; |
| 467 | } |
no test coverage detected