| line |
true |
false |
branch |
|
72
|
1460 |
2 |
for (p = VALID_OPT_KEYS; *p; p++) { |
|
73
|
606 |
854 |
if (strlen(*p) == klen && memcmp(*p, key, klen) == 0) return 1; |
|
|
164 |
442 |
if (strlen(*p) == klen && memcmp(*p, key, klen) == 0) return 1; |
|
86
|
0 |
18 |
if (len < 1) croak("File::Raw::Separated: %s must be a non-empty string", what); |
|
95
|
3 |
7 |
if (len == 4 && memcmp(p, "auto", 4) == 0) return SEPARATED_EOL_AUTO; |
|
|
1 |
2 |
if (len == 4 && memcmp(p, "auto", 4) == 0) return SEPARATED_EOL_AUTO; |
|
96
|
5 |
4 |
if (len == 2 && memcmp(p, "lf", 2) == 0) return SEPARATED_EOL_LF; |
|
|
4 |
1 |
if (len == 2 && memcmp(p, "lf", 2) == 0) return SEPARATED_EOL_LF; |
|
97
|
2 |
3 |
if (len == 4 && memcmp(p, "crlf", 4) == 0) return SEPARATED_EOL_CRLF; |
|
|
2 |
0 |
if (len == 4 && memcmp(p, "crlf", 4) == 0) return SEPARATED_EOL_CRLF; |
|
98
|
1 |
2 |
if (len == 2 && memcmp(p, "cr", 2) == 0) return SEPARATED_EOL_CR; |
|
|
1 |
0 |
if (len == 2 && memcmp(p, "cr", 2) == 0) return SEPARATED_EOL_CR; |
|
124
|
96 |
18 |
if (pin == DIALECT_CSV) { separated_options_init_csv(opts); return; } |
|
125
|
16 |
2 |
if (pin == DIALECT_TSV) { separated_options_init_tsv(opts); return; } |
|
126
|
2 |
0 |
if (hv && (slot = hv_fetchs(hv, "dialect", 0)) && *slot && SvOK(*slot)) { |
|
|
0 |
2 |
if (hv && (slot = hv_fetchs(hv, "dialect", 0)) && *slot && SvOK(*slot)) { |
|
|
0 |
0 |
if (hv && (slot = hv_fetchs(hv, "dialect", 0)) && *slot && SvOK(*slot)) { |
|
|
0 |
0 |
if (hv && (slot = hv_fetchs(hv, "dialect", 0)) && *slot && SvOK(*slot)) { |
|
129
|
0 |
0 |
if (dlen == 3 && memcmp(dpv, "csv", 3) == 0) { |
|
|
0 |
0 |
if (dlen == 3 && memcmp(dpv, "csv", 3) == 0) { |
|
133
|
0 |
0 |
if (dlen == 3 && memcmp(dpv, "tsv", 3) == 0) { |
|
|
0 |
0 |
if (dlen == 3 && memcmp(dpv, "tsv", 3) == 0) { |
|
151
|
0 |
0 |
if (!sv || !SvOK(sv)) |
|
|
0 |
0 |
if (!sv || !SvOK(sv)) |
|
154
|
0 |
0 |
if (dlen == 3 && memcmp(dpv, "csv", 3) == 0) return 0; /* csv slot */ |
|
|
0 |
0 |
if (dlen == 3 && memcmp(dpv, "csv", 3) == 0) return 0; /* csv slot */ |
|
155
|
0 |
0 |
if (dlen == 3 && memcmp(dpv, "tsv", 3) == 0) return 1; /* tsv slot */ |
|
|
0 |
0 |
if (dlen == 3 && memcmp(dpv, "tsv", 3) == 0) return 1; /* tsv slot */ |
|
165
|
65 |
129 |
if (!hv) return; |
|
169
|
166 |
125 |
while ((he = hv_iternext(hv))) { |
|
175
|
2 |
164 |
if (!known_opt(key, klen)) { |
|
182
|
7 |
157 |
if (!SvOK(val)) continue; |
|
184
|
22 |
135 |
if (klen == 3 && memcmp(key, "sep", 3) == 0) opts->sep = sv_first_byte(aTHX_ val, "sep"); |
|
|
12 |
10 |
if (klen == 3 && memcmp(key, "sep", 3) == 0) opts->sep = sv_first_byte(aTHX_ val, "sep"); |
|
185
|
3 |
142 |
else if (klen == 5 && memcmp(key, "quote", 5) == 0) opts->quote = sv_first_byte(aTHX_ val, "quote"); |
|
|
3 |
0 |
else if (klen == 5 && memcmp(key, "quote", 5) == 0) opts->quote = sv_first_byte(aTHX_ val, "quote"); |
|
186
|
127 |
15 |
else if (klen == 6 && memcmp(key, "escape",6) == 0) opts->escape= sv_first_byte(aTHX_ val, "escape"); |
|
|
3 |
124 |
else if (klen == 6 && memcmp(key, "escape",6) == 0) opts->escape= sv_first_byte(aTHX_ val, "escape"); |
|
187
|
124 |
15 |
else if (klen == 6 && memcmp(key, "strict",6) == 0) opts->strict= SvTRUE(val) ? 1 : 0; |
|
|
7 |
117 |
else if (klen == 6 && memcmp(key, "strict",6) == 0) opts->strict= SvTRUE(val) ? 1 : 0; |
|
188
|
10 |
122 |
else if (klen == 3 && memcmp(key, "eol", 3) == 0) opts->eol_mode = sv_to_eol(aTHX_ val); |
|
|
10 |
0 |
else if (klen == 3 && memcmp(key, "eol", 3) == 0) opts->eol_mode = sv_to_eol(aTHX_ val); |
|
189
|
2 |
120 |
else if (klen == 4 && memcmp(key, "trim", 4) == 0) opts->trim = SvTRUE(val) ? 1 : 0; |
|
|
2 |
0 |
else if (klen == 4 && memcmp(key, "trim", 4) == 0) opts->trim = SvTRUE(val) ? 1 : 0; |
|
190
|
2 |
118 |
else if (klen == 14 && memcmp(key, "empty_is_undef", 14) == 0) opts->empty_is_undef = SvTRUE(val) ? 1 : 0; |
|
|
2 |
0 |
else if (klen == 14 && memcmp(key, "empty_is_undef", 14) == 0) opts->empty_is_undef = SvTRUE(val) ? 1 : 0; |
|
191
|
117 |
1 |
else if (klen == 6 && memcmp(key, "binary",6) == 0) opts->binary= SvTRUE(val) ? 1 : 0; |
|
|
3 |
114 |
else if (klen == 6 && memcmp(key, "binary",6) == 0) opts->binary= SvTRUE(val) ? 1 : 0; |
|
192
|
114 |
1 |
else if (klen == 6 && memcmp(key, "header",6) == 0) opts->header= SvTRUE(val) ? 1 : 0; |
|
|
37 |
77 |
else if (klen == 6 && memcmp(key, "header",6) == 0) opts->header= SvTRUE(val) ? 1 : 0; |
|
193
|
1 |
77 |
else if (klen == 13 && memcmp(key, "max_field_len", 13) == 0) { |
|
|
1 |
0 |
else if (klen == 13 && memcmp(key, "max_field_len", 13) == 0) { |
|
195
|
0 |
1 |
if (n < 0) croak("File::Raw::Separated: max_field_len must be >= 0"); |
|
230
|
2 |
921387 |
if (is_null) return newSV(0); /* PL_sv_undef would be SVREADONLY */ |
|
231
|
921387 |
0 |
SV *sv = newSVpvn(field ? field : "", len); |
|
232
|
921380 |
7 |
if (!binary) sv_utf8_decode(sv); |
|
253
|
83 |
32 |
for (i = 0; i < n; i++) { |
|
257
|
83 |
0 |
if (!kp || !*kp) continue; |
|
|
0 |
83 |
if (!kp || !*kp) continue; |
|
259
|
2 |
81 |
if (hv_exists(seen, kpv, klen)) { |
|
276
|
2 |
67 |
if (rcount > hcount) { |
|
281
|
168 |
67 |
for (i = 0; i < hcount; i++) { |
|
286
|
168 |
0 |
if (!kp || !*kp) continue; |
|
|
0 |
168 |
if (!kp || !*kp) continue; |
|
288
|
164 |
4 |
if (i < rcount) { |
|
290
|
164 |
0 |
val = (vp && *vp) ? newSVsv(*vp) : newSV(0); |
|
|
164 |
0 |
val = (vp && *vp) ? newSVsv(*vp) : newSV(0); |
|
319
|
65 |
113 |
if (!opts) return NULL; |
|
321
|
37 |
76 |
if (!slot || !*slot || !SvOK(*slot)) return NULL; |
|
|
37 |
0 |
if (!slot || !*slot || !SvOK(*slot)) return NULL; |
|
|
0 |
37 |
if (!slot || !*slot || !SvOK(*slot)) return NULL; |
|
325
|
20 |
17 |
if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV) return NULL; |
|
|
0 |
20 |
if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV) return NULL; |
|
329
|
1 |
19 |
if (n <= 0) |
|
336
|
50 |
18 |
for (i = 0; i < n; i++) { |
|
338
|
50 |
0 |
if (!kp || !*kp || !SvOK(*kp)) { |
|
|
50 |
0 |
if (!kp || !*kp || !SvOK(*kp)) { |
|
|
1 |
49 |
if (!kp || !*kp || !SvOK(*kp)) { |
|
359
|
858 |
2 |
SV *sv = make_field_sv(aTHX_ field, is_null ? 0 : (STRLEN)len, is_null, |
|
362
|
403 |
457 |
if (eor) { |
|
363
|
65 |
338 |
if (c->header_mode && !c->headers) { |
|
|
11 |
54 |
if (c->header_mode && !c->headers) { |
|
369
|
54 |
338 |
} else if (c->header_mode) { |
|
389
|
920529 |
0 |
SV *sv = make_field_sv(aTHX_ field, is_null ? 0 : (STRLEN)len, is_null, |
|
392
|
110214 |
810315 |
if (eor) { |
|
394
|
20 |
110194 |
if (c->header_mode && !c->headers) { |
|
|
5 |
15 |
if (c->header_mode && !c->headers) { |
|
404
|
15 |
110194 |
if (c->header_mode) { |
|
414
|
0 |
110209 |
PUSHMARK(SP); |
|
415
|
0 |
110209 |
XPUSHs(rowref); |
|
425
|
110209 |
0 |
SV *errsv = ERRSV; |
|
426
|
3 |
110206 |
if (SvTRUE(errsv)) { |
|
428
|
0 |
3 |
FREETMPS; LEAVE; |
|
433
|
0 |
110206 |
FREETMPS; LEAVE; |
|
465
|
118 |
30 |
ctx.header_mode = opts->header || (explicit_headers != NULL); |
|
|
0 |
118 |
ctx.header_mode = opts->header || (explicit_headers != NULL); |
|
470
|
10 |
138 |
if (as_callback) { |
|
483
|
8 |
137 |
if (rc < 0) { |
|
485
|
1 |
7 |
if (as_callback) { |
|
491
|
0 |
8 |
if (ctx.headers) SvREFCNT_dec((SV *)ctx.headers); |
|
492
|
1 |
7 |
if (ctx.die_msg) { |
|
505
|
9 |
128 |
if (as_callback) { |
|
507
|
3 |
6 |
if (ctx.headers) SvREFCNT_dec((SV *)ctx.headers); |
|
514
|
23 |
105 |
if (ctx.headers) SvREFCNT_dec((SV *)ctx.headers); |
|
534
|
17 |
2 |
ctx.header_mode = opts->header || (explicit_headers != NULL); |
|
|
0 |
17 |
ctx.header_mode = opts->header || (explicit_headers != NULL); |
|
541
|
0 |
19 |
if (!parser) { |
|
547
|
1 |
18 |
if (fd < 0) { |
|
562
|
343 |
16 |
while ((n = PerlLIO_read(fd, buf, sizeof buf)) > 0) { |
|
564
|
2 |
341 |
if (parse_err != SEPARATED_OK) break; |
|
566
|
0 |
18 |
if (n < 0) read_errno = errno; |
|
571
|
16 |
2 |
if (parse_err == SEPARATED_OK && read_errno == 0) { |
|
|
16 |
0 |
if (parse_err == SEPARATED_OK && read_errno == 0) { |
|
579
|
2 |
16 |
? separated_offset(parser) : 0; |
|
585
|
2 |
16 |
if (ctx.headers) SvREFCNT_dec((SV *)ctx.headers); |
|
590
|
1 |
17 |
if (die_msg) { |
|
597
|
0 |
17 |
if (read_errno) { |
|
601
|
1 |
16 |
if (parse_err != SEPARATED_OK) { |
|
640
|
59 |
0 |
if (ctx->plugin_state) |
|
652
|
59 |
0 |
if (ctx->options) decode_opts(aTHX_ ctx->options, &local); |
|
654
|
0 |
57 |
if (!ctx->data) return &PL_sv_undef; |
|
690
|
13 |
0 |
if (ctx->plugin_state) |
|
694
|
13 |
0 |
if (ctx->options) decode_opts(aTHX_ ctx->options, &o); |
|
696
|
12 |
0 |
if (!ctx->data || !SvROK(ctx->data) || |
|
|
11 |
1 |
if (!ctx->data || !SvROK(ctx->data) || |
|
697
|
0 |
11 |
SvTYPE(SvRV(ctx->data)) != SVt_PVAV) |
|
723
|
25 |
10 |
for (i = 0; i < nrows; i++) { |
|
728
|
25 |
0 |
if (!rowp || !*rowp || !SvROK(*rowp) || |
|
|
25 |
0 |
if (!rowp || !*rowp || !SvROK(*rowp) || |
|
|
24 |
1 |
if (!rowp || !*rowp || !SvROK(*rowp) || |
|
729
|
0 |
24 |
SvTYPE(SvRV(*rowp)) != SVt_PVAV) { |
|
736
|
43 |
24 |
for (j = 0; j < nfields; j++) { |
|
742
|
19 |
24 |
if (j > 0) { SEP_BUF_ENSURE(1); buf[buf_len++] = (char)o.sep; } |
|
|
0 |
19 |
if (j > 0) { SEP_BUF_ENSURE(1); buf[buf_len++] = (char)o.sep; } |
|
|
0 |
0 |
if (j > 0) { SEP_BUF_ENSURE(1); buf[buf_len++] = (char)o.sep; } |
|
744
|
43 |
0 |
if (!fieldp || !*fieldp || !SvOK(*fieldp)) continue; |
|
|
43 |
0 |
if (!fieldp || !*fieldp || !SvOK(*fieldp)) continue; |
|
|
1 |
42 |
if (!fieldp || !*fieldp || !SvOK(*fieldp)) continue; |
|
751
|
36 |
6 |
if (o.quote >= 0) { |
|
753
|
55 |
32 |
for (k = 0; k < flen; k++) { |
|
755
|
54 |
1 |
if (c == (char)o.sep || c == (char)o.quote || |
|
|
52 |
2 |
if (c == (char)o.sep || c == (char)o.quote || |
|
|
51 |
1 |
if (c == (char)o.sep || c == (char)o.quote || |
|
756
|
0 |
51 |
c == '\n' || c == '\r') { |
|
763
|
4 |
38 |
if (needs_quote) { |
|
766
|
0 |
4 |
SEP_BUF_ENSURE(flen * 2 + 2); |
|
|
0 |
0 |
SEP_BUF_ENSURE(flen * 2 + 2); |
|
768
|
44 |
4 |
for (k = 0; k < flen; k++) { |
|
770
|
3 |
41 |
if (c == (char)o.quote) { |
|
771
|
0 |
3 |
if (o.escape >= 0) |
|
780
|
0 |
38 |
SEP_BUF_ENSURE(flen); |
|
|
0 |
0 |
SEP_BUF_ENSURE(flen); |
|
786
|
0 |
24 |
SEP_BUF_ENSURE(eol_len); |
|
|
0 |
0 |
SEP_BUF_ENSURE(eol_len); |
|
821
|
8 |
0 |
if (!st || st->destroyed) return; |
|
|
0 |
8 |
if (!st || st->destroyed) return; |
|
823
|
8 |
0 |
if (st->parser) { separated_free(st->parser); st->parser = NULL; } |
|
824
|
8 |
0 |
if (st->disp.row_av) { SvREFCNT_dec((SV *)st->disp.row_av); st->disp.row_av = NULL; } |
|
825
|
2 |
6 |
if (st->disp.headers) { SvREFCNT_dec((SV *)st->disp.headers); st->disp.headers = NULL; } |
|
826
|
1 |
7 |
if (st->disp.die_msg) { SvREFCNT_dec(st->disp.die_msg); st->disp.die_msg = NULL; } |
|
837
|
8 |
9 |
if (!st) { |
|
845
|
8 |
0 |
if (ctx->plugin_state) |
|
849
|
8 |
0 |
if (ctx->options) decode_opts(aTHX_ ctx->options, &st->opts); |
|
857
|
6 |
2 |
st->disp.header_mode = st->opts.header || (xhdr != NULL); |
|
|
0 |
6 |
st->disp.header_mode = st->opts.header || (xhdr != NULL); |
|
863
|
0 |
8 |
if (!st->parser) { |
|
871
|
10 |
7 |
if (chunk && len > 0) { |
|
|
10 |
0 |
if (chunk && len > 0) { |
|
873
|
1 |
9 |
if (rc != SEPARATED_OK) { |
|
877
|
1 |
0 |
if (die_msg) { |
|
893
|
7 |
9 |
if (eof) { |
|
895
|
0 |
7 |
if (rc != SEPARATED_OK) { |
|
899
|
0 |
0 |
if (die_msg) { |
|
938
|
50 |
65 |
if (!opts || !SvOK(opts)) return NULL; |
|
|
0 |
50 |
if (!opts || !SvOK(opts)) return NULL; |
|
939
|
49 |
1 |
if (!SvROK(opts) || SvTYPE(SvRV(opts)) != SVt_PVHV) |
|
|
0 |
49 |
if (!SvROK(opts) || SvTYPE(SvRV(opts)) != SVt_PVHV) |
|
973
|
10 |
1 |
if (!SvROK(code) || SvTYPE(SvRV(code)) != SVt_PVCV) |
|
|
0 |
10 |
if (!SvROK(code) || SvTYPE(SvRV(code)) != SVt_PVCV) |
|
995
|
0 |
21 |
if (!SvOK(path)) croak("%s: path must be defined", fn); |
|
996
|
20 |
1 |
if (!SvROK(code) || SvTYPE(SvRV(code)) != SVt_PVCV) |
|
|
0 |
20 |
if (!SvROK(code) || SvTYPE(SvRV(code)) != SVt_PVCV) |
|
1061
|
351 |
39 |
for (i = 0; g_import_funcs[i].name; i++) { |
|
1067
|
351 |
0 |
if (!cv || !CvISXSUB(cv)) |
|
|
0 |
351 |
if (!cv || !CvISXSUB(cv)) |
|
1085
|
243 |
27 |
for (i = lo; i < hi; i++) install_one(aTHX_ pkg, &g_import_funcs[i]); |
|
1092
|
39 |
0 |
const char *pkg = CopSTASHPV(PL_curcop); |
|
|
39 |
0 |
const char *pkg = CopSTASHPV(PL_curcop); |
|
|
39 |
0 |
const char *pkg = CopSTASHPV(PL_curcop); |
|
|
0 |
39 |
const char *pkg = CopSTASHPV(PL_curcop); |
|
|
0 |
0 |
const char *pkg = CopSTASHPV(PL_curcop); |
|
|
39 |
0 |
const char *pkg = CopSTASHPV(PL_curcop); |
|
|
0 |
39 |
const char *pkg = CopSTASHPV(PL_curcop); |
|
1099
|
12 |
27 |
if (items <= 1) XSRETURN_EMPTY; |
|
1101
|
27 |
27 |
for (i = 1; i < items; i++) { |
|
1105
|
27 |
0 |
if (len > 0 && arg[0] == ':') { |
|
|
0 |
27 |
if (len > 0 && arg[0] == ':') { |
|
1106
|
0 |
0 |
if (len == 4 && memcmp(arg, ":all", 4) == 0) { |
|
|
0 |
0 |
if (len == 4 && memcmp(arg, ":all", 4) == 0) { |
|
1110
|
0 |
0 |
if (len == 8 && memcmp(arg, ":unified", 8) == 0) { |
|
|
0 |
0 |
if (len == 8 && memcmp(arg, ":unified", 8) == 0) { |
|
1114
|
0 |
0 |
if (len == 4 && memcmp(arg, ":csv", 4) == 0) { |
|
|
0 |
0 |
if (len == 4 && memcmp(arg, ":csv", 4) == 0) { |
|
1118
|
0 |
0 |
if (len == 4 && memcmp(arg, ":tsv", 4) == 0) { |
|
|
0 |
0 |
if (len == 4 && memcmp(arg, ":tsv", 4) == 0) { |
|
1128
|
27 |
0 |
if (len == 6 && memcmp(arg, "import", 6) == 0) { |
|
|
27 |
0 |
if (len == 6 && memcmp(arg, "import", 6) == 0) { |
|
1134
|
0 |
0 |
for (j = 0; g_import_funcs[j].name; j++) { |
|
1135
|
0 |
0 |
if (strlen(g_import_funcs[j].name) == len |
|
1136
|
0 |
0 |
&& memcmp(arg, g_import_funcs[j].name, len) == 0) { |
|
1142
|
0 |
0 |
if (!matched) |
|
1173
|
0 |
39 |
if (file_register_plugin(aTHX_ &csv_plugin) <= 0) |
|
1182
|
0 |
39 |
if (file_register_plugin(aTHX_ &tsv_plugin) <= 0) |