Branch Coverage

Separated.xs
Criterion Covered Total %
branch 282 426 66.2


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)