| line |
true |
false |
branch |
|
109
|
0 |
18 |
if (path == NULL) croak("Out of memory"); |
|
123
|
0 |
18 |
CLEAR_RESULTS(path); |
|
124
|
18 |
0 |
CLEAR_ITERATOR(path); |
|
|
18 |
0 |
CLEAR_ITERATOR(path); |
|
132
|
0 |
19 |
CLEAR_RESULTS(path); |
|
133
|
1 |
18 |
CLEAR_ITERATOR(path); |
|
|
1 |
0 |
CLEAR_ITERATOR(path); |
|
135
|
0 |
19 |
if (sv_isobject(src) && sv_isa(src, "Sereal::Path::Iterator")) { |
|
|
0 |
0 |
if (sv_isobject(src) && sv_isa(src, "Sereal::Path::Iterator")) { |
|
136
|
0 |
0 |
path->iter = INT2PTR(srl_iterator_ptr, SvIV((SV*) SvRV(src))); |
|
138
|
19 |
0 |
} else if (SvPOK(src)) { |
|
151
|
0 |
60 |
if (!path->iter) croak("No document to traverse"); |
|
156
|
0 |
60 |
CLEAR_RESULTS(path); |
|
169
|
60 |
0 |
AV *results = path->results ? path->results : newAV(); |
|
183
|
0 |
219 |
if (srl_iterator_eof(aTHX_ iter)) return; |
|
184
|
129 |
90 |
if (expr_idx > av_len(path->expr)) { /* scaned entiry expr */ |
|
194
|
36 |
54 |
if ((type & SRL_ITERATOR_INFO_HASH) == SRL_ITERATOR_INFO_HASH) { |
|
197
|
54 |
0 |
} else if ((type & SRL_ITERATOR_INFO_ARRAY) == SRL_ITERATOR_INFO_ARRAY) { |
|
234
|
36 |
0 |
loc_str = SvPV(loc, loc_len); |
|
236
|
8 |
28 |
if (is_all(loc_str, loc_len)) { /* * */ |
|
238
|
5 |
23 |
} else if (is_list(loc_str, loc_len)) { /* [name1,name2] */ |
|
257
|
24 |
8 |
for (idx = 0; idx < length; idx += 2) { |
|
278
|
12 |
5 |
while (next_item_in_list(list, list_len, &item, &item_len)) { |
|
280
|
0 |
12 |
if (item_len == 0) continue; |
|
285
|
12 |
0 |
if (srl_iterator_hash_exists(aTHX_ iter, item, item_len) != SRL_ITER_NOT_FOUND) { |
|
301
|
21 |
2 |
if (srl_iterator_hash_exists(aTHX_ iter, str, str_len) != SRL_ITER_NOT_FOUND) { |
|
319
|
54 |
0 |
loc_str = SvPV(loc, loc_len); |
|
321
|
10 |
44 |
if (is_all(loc_str, loc_len)) { /* * */ |
|
323
|
27 |
17 |
} else if (is_number(loc_str, loc_len)) { /* [10] */ |
|
325
|
12 |
5 |
} else if (is_list(loc_str, loc_len)) { /* [0,1,2] */ |
|
327
|
5 |
0 |
} else if (is_range(loc_str, loc_len, (int*) &range)) { /* [start:stop:step] */ |
|
342
|
37 |
10 |
for (idx = 0; idx < length; ++idx) { |
|
365
|
34 |
12 |
while (next_item_in_list(list, list_len, &item, &item_len)) { |
|
366
|
0 |
34 |
if (item_len == 0) continue; |
|
372
|
34 |
0 |
if (srl_iterator_array_exists(aTHX_ iter, idx) != SRL_ITER_NOT_FOUND) { |
|
393
|
1 |
4 |
start = start < 0 ? SRL_MAX(0, start + (I32) length) : SRL_MIN((I32) length, start); |
|
394
|
0 |
5 |
stop = stop < 0 ? SRL_MAX(0, stop + (I32) length) : SRL_MIN((I32) length, stop); |
|
395
|
5 |
0 |
step = step ? step : 1; |
|
397
|
0 |
5 |
if (step < 0) croak("negative step in not supported"); |
|
402
|
9 |
5 |
for (idx = start; idx < stop; idx += step) { |
|
419
|
22 |
5 |
if (srl_iterator_array_exists(aTHX_ iter, idx) != SRL_ITER_NOT_FOUND) { |
|
435
|
0 |
70 |
if ((IV) expected_depth > depth) { |
|
443
|
0 |
70 |
if (expected_idx < idx) { |
|
454
|
60 |
30 |
return len == 1 ? str[0] == '*' : 0; |
|
|
18 |
42 |
return len == 1 ? str[0] == '*' : 0; |
|
461
|
91 |
28 |
for (i = 0; i < len; ++i) { |
|
462
|
17 |
74 |
if (str[i] == ',') return 1; |
|
479
|
76 |
21 |
for (i = 0, ndel = 0; i < len; ++i) { |
|
480
|
28 |
48 |
if (str[i] == ':') { |
|
481
|
2 |
26 |
if (ndel >= 2) return NULL; |
|
493
|
1 |
0 |
valid = (start_len != 0 || stop_len != 0 || step_len != 0) |
|
|
0 |
1 |
valid = (start_len != 0 || stop_len != 0 || step_len != 0) |
|
494
|
4 |
0 |
&& (start_len == 0 || is_number(str, start_len)) |
|
|
4 |
0 |
&& (start_len == 0 || is_number(str, start_len)) |
|
495
|
4 |
0 |
&& (stop_len == 0 || is_number(str + pos[0] + 1, stop_len)) |
|
|
4 |
0 |
&& (stop_len == 0 || is_number(str + pos[0] + 1, stop_len)) |
|
496
|
1 |
4 |
&& (step_len == 0 || is_number(str + pos[1] + 1, step_len)); |
|
|
3 |
1 |
&& (step_len == 0 || is_number(str + pos[1] + 1, step_len)); |
|
|
2 |
1 |
&& (step_len == 0 || is_number(str + pos[1] + 1, step_len)); |
|
498
|
2 |
3 |
if (!valid) return NULL; |
|
504
|
3 |
0 |
out[0] = start_len == 0 ? 0 : atoi(ptr); /* start */ |
|
505
|
3 |
0 |
out[1] = stop_len == 0 ? 0x7FFFFFFF : atoi(ptr+ pos[0] + 1); /* stop */ |
|
506
|
2 |
1 |
out[2] = step_len == 0 ? 1 : atoi(ptr + pos[1] + 1); /* step */ |
|
516
|
2 |
1 |
valid = (start_len != 0 || stop_len != 0) |
|
517
|
9 |
2 |
&& (start_len == 0 || is_number(str, pos[0])) |
|
|
9 |
0 |
&& (start_len == 0 || is_number(str, pos[0])) |
|
518
|
3 |
9 |
&& (stop_len == 0 || is_number(str + pos[0] + 1, stop_len)); |
|
|
7 |
4 |
&& (stop_len == 0 || is_number(str + pos[0] + 1, stop_len)); |
|
|
6 |
1 |
&& (stop_len == 0 || is_number(str + pos[0] + 1, stop_len)); |
|
520
|
2 |
10 |
if (!valid) return NULL; |
|
525
|
8 |
2 |
out[0] = start_len == 0 ? 0 : atoi(ptr); /* start */ |
|
526
|
6 |
4 |
out[1] = stop_len == 0 ? 0x7FFFFFFF : atoi(ptr+ pos[0] + 1); /* stop */ |
|
540
|
15 |
56 |
if (*str == '-') { |
|
545
|
89 |
52 |
for (i = 0; i < len; ++i) { |
|
546
|
77 |
12 |
if (str[i] < '0' || str[i] > '9') |
|
|
7 |
70 |
if (str[i] < '0' || str[i] > '9') |
|
558
|
46 |
17 |
: list; |
|
562
|
17 |
46 |
if (start_pos - list >= (ptrdiff_t) list_len) return 0; |
|
566
|
85 |
17 |
while (list_len-- && *list != ',') list++; |
|
|
56 |
29 |
while (list_len-- && *list != ',') list++; |