| 867 | } |
| 868 | |
| 869 | static int jl_scan_array(const char *text, size_t length, size_t array_start, |
| 870 | const char *lookup_string, jl_array_t *array) { |
| 871 | memset(array, 0, sizeof(*array)); |
| 872 | array->first_value_start = SIZE_MAX; |
| 873 | array->last_value_end = SIZE_MAX; |
| 874 | array->last_comma_pos = SIZE_MAX; |
| 875 | array->match.comma_pos = SIZE_MAX; |
| 876 | array->match.previous_comma_pos = SIZE_MAX; |
| 877 | |
| 878 | if (array_start >= length || text[array_start] != '[') { |
| 879 | return -1; |
| 880 | } |
| 881 | jl_parser_t parser = { |
| 882 | .text = text, |
| 883 | .length = length, |
| 884 | .pos = array_start + 1U, |
| 885 | .strict = false, |
| 886 | }; |
| 887 | if (jl_skip_trivia(&parser) != 0 || parser.pos >= parser.length) { |
| 888 | return -1; |
| 889 | } |
| 890 | if (text[parser.pos] == ']') { |
| 891 | array->close_pos = parser.pos; |
| 892 | return 0; |
| 893 | } |
| 894 | |
| 895 | size_t previous_comma = SIZE_MAX; |
| 896 | while (parser.pos < parser.length) { |
| 897 | size_t value_start = 0; |
| 898 | size_t value_end = 0; |
| 899 | if (jl_parse_value(&parser, 1U, &value_start, &value_end) != 0) { |
| 900 | return -1; |
| 901 | } |
| 902 | if (array->first_value_start == SIZE_MAX) { |
| 903 | array->first_value_start = value_start; |
| 904 | } |
| 905 | bool is_string = text[value_start] == '"' || text[value_start] == '\''; |
| 906 | bool matches = is_string && jl_key_equals(text, value_start, value_end, lookup_string); |
| 907 | if (matches) { |
| 908 | array->match_count++; |
| 909 | if (array->match_count == 1U) { |
| 910 | array->match.value_start = value_start; |
| 911 | array->match.value_end = value_end; |
| 912 | array->match.previous_comma_pos = previous_comma; |
| 913 | } |
| 914 | } |
| 915 | |
| 916 | array->element_count++; |
| 917 | array->last_value_end = value_end; |
| 918 | if (jl_skip_trivia(&parser) != 0 || parser.pos >= parser.length) { |
| 919 | return -1; |
| 920 | } |
| 921 | if (text[parser.pos] == ']') { |
| 922 | array->close_pos = parser.pos; |
| 923 | return 0; |
| 924 | } |
| 925 | if (text[parser.pos] != ',') { |
| 926 | return -1; |
no test coverage detected