Branch Coverage

XS.xs
Criterion Covered Total %
branch 1264 2200 57.4


line true false branch
24 1 11073 if (val < 0) { neg = 1; uval = -(unsigned long)val; } else { uval = (unsigned long)val; }
25 30796 11074 do { tmp[len++] = '0' + (uval % 10); uval /= 10; } while (uval);
26 1 11073 if (neg) tmp[len++] = '-';
27 41871 11074 for (int i = 0; i < len; i++) buf[i] = tmp[len - 1 - i];
35 3 1003 if (val < 0) { neg = 1; uval = -(unsigned long)val; } else { uval = (unsigned long)val; }
36 1939 1006 do { digits[dlen++] = '0' + (uval % 10); uval /= 10; } while (uval);
38 3 1003 if (neg) buf[pos++] = '-';
39 2945 1006 for (int i = dlen - 1; i >= 0; i--) {
41 1939 1006 if (i > 0 && i % 3 == 0) buf[pos++] = ',';
16 1923 if (i > 0 && i % 3 == 0) buf[pos++] = ',';
53 0 4 if (html_tables_inited) return;
70 128 4 for (int i = 0; i < 0x20; i++) json_special[i] = 1;
77 41 11 while (i < slen) {
80 238 4 while (run < slen && !html_special[(unsigned char)src[run]]) run++;
201 37 while (run < slen && !html_special[(unsigned char)src[run]]) run++;
81 31 10 if (run > i) {
86 4 37 if (i >= slen) break;
102 4 1 while (i < slen) {
104 17 0 while (run < slen && !html_br_special[(unsigned char)src[run]]) run++;
13 4 while (run < slen && !html_br_special[(unsigned char)src[run]]) run++;
105 3 1 if (run > i) {
110 0 4 if (i >= slen) break;
127 19 1 for (STRLEN i = 0; i < slen; i++) {
129 16 3 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
16 0 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
16 3 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
0 16 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
1 2 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
130 1 0 (c >= '0' && c <= '9') || c == '-' || c == '_' || c == '.' || c == '~')
3 0 (c >= '0' && c <= '9') || c == '-' || c == '_' || c == '.' || c == '~')
3 0 (c >= '0' && c <= '9') || c == '-' || c == '_' || c == '.' || c == '~')
3 0 (c >= '0' && c <= '9') || c == '-' || c == '_' || c == '.' || c == '~')
0 3 (c >= '0' && c <= '9') || c == '-' || c == '_' || c == '.' || c == '~')
140 27 3 for (STRLEN i = 0; i < slen; i++) {
151 2 20 if (c < 0x20) {
162 3 1 for (STRLEN i = 0; i < slen; i++) {
175 4 10 for (i = 0; i + 2 < slen; i += 3) {
181 9 1 if (i < slen) {
183 6 3 if (i + 1 < slen) {
188 2 1 if (pad) *out++ = '=';
190 6 3 if (pad) *out++ = '=';
252 12 194 if (t->header) free(t->header);
253 12 194 if (t->footer) free(t->footer);
254 30 176 if (t->sep) free(t->sep);
255 195 11 if (t->render_buf) free(t->render_buf);
256 1 205 if (t->skip_if_key) free(t->skip_if_key);
257 1 205 if (t->skip_unless_key) free(t->skip_unless_key);
258 268 206 for (int i = 0; i < t->nops; i++) {
259 48 220 if (t->ops[i].static_data) free(t->ops[i].static_data);
260 19 249 if (t->ops[i].key) free(t->ops[i].key);
261 220 48 if (t->ops[i].chain) {
262 237 220 for (int j = 0; j < t->ops[i].chain_len; j++) {
264 40 197 if (x->param_str) free(x->param_str);
265 17 220 if (x->param_str2) free(x->param_str2);
266 5 232 if (x->map_keys) {
267 13 5 for (int k = 0; k < x->map_count; k++) { free(x->map_keys[k]); free(x->map_vals[k]); }
274 206 0 if (t->ops) free(t->ops);
282 66 169 int tlen = colon ? (int)(colon - s) : len;
283 66 169 const char *param = colon ? colon + 1 : NULL;
284 66 169 int plen = colon ? len - tlen - 1 : 0;
286 78 157 if (tlen == 3 && memcmp(s, "int", 3) == 0) x.type = XF_INT;
29 49 if (tlen == 3 && memcmp(s, "int", 3) == 0) x.type = XF_INT;
287 16 190 else if (tlen == 9 && memcmp(s, "int_comma", 9) == 0) x.type = XF_INT_COMMA;
7 9 else if (tlen == 9 && memcmp(s, "int_comma", 9) == 0) x.type = XF_INT_COMMA;
288 14 185 else if (tlen == 5 && memcmp(s, "float", 5) == 0) { x.type = XF_FLOAT; x.param_int = 2; }
4 10 else if (tlen == 5 && memcmp(s, "float", 5) == 0) { x.type = XF_FLOAT; x.param_int = 2; }
289 57 138 else if (tlen == 4 && memcmp(s, "html", 4) == 0) x.type = XF_HTML;
20 37 else if (tlen == 4 && memcmp(s, "html", 4) == 0) x.type = XF_HTML;
290 24 151 else if (tlen == 7 && memcmp(s, "html_br", 7) == 0) x.type = XF_HTML_BR;
2 22 else if (tlen == 7 && memcmp(s, "html_br", 7) == 0) x.type = XF_HTML_BR;
291 49 124 else if (tlen == 3 && memcmp(s, "raw", 3) == 0) x.type = XF_RAW;
32 17 else if (tlen == 3 && memcmp(s, "raw", 3) == 0) x.type = XF_RAW;
292 17 124 else if (tlen == 3 && memcmp(s, "url", 3) == 0) x.type = XF_URL;
2 15 else if (tlen == 3 && memcmp(s, "url", 3) == 0) x.type = XF_URL;
293 37 102 else if (tlen == 4 && memcmp(s, "json", 4) == 0) x.type = XF_JSON;
5 32 else if (tlen == 4 && memcmp(s, "json", 4) == 0) x.type = XF_JSON;
294 32 102 else if (tlen == 4 && memcmp(s, "trim", 4) == 0) x.type = XF_TRIM;
11 21 else if (tlen == 4 && memcmp(s, "trim", 4) == 0) x.type = XF_TRIM;
295 18 105 else if (tlen == 2 && memcmp(s, "uc", 2) == 0) x.type = XF_UC;
8 10 else if (tlen == 2 && memcmp(s, "uc", 2) == 0) x.type = XF_UC;
296 10 105 else if (tlen == 2 && memcmp(s, "lc", 2) == 0) x.type = XF_LC;
6 4 else if (tlen == 2 && memcmp(s, "lc", 2) == 0) x.type = XF_LC;
297 15 94 else if (tlen == 3 && memcmp(s, "pad", 3) == 0) x.type = XF_PAD;
4 11 else if (tlen == 3 && memcmp(s, "pad", 3) == 0) x.type = XF_PAD;
298 21 84 else if (tlen == 4 && memcmp(s, "rpad", 4) == 0) x.type = XF_RPAD;
1 20 else if (tlen == 4 && memcmp(s, "rpad", 4) == 0) x.type = XF_RPAD;
299 10 94 else if (tlen == 5 && memcmp(s, "trunc", 5) == 0) x.type = XF_TRUNC;
3 7 else if (tlen == 5 && memcmp(s, "trunc", 5) == 0) x.type = XF_TRUNC;
300 22 79 else if (tlen == 7 && memcmp(s, "default", 7) == 0) x.type = XF_DEFAULT;
5 17 else if (tlen == 7 && memcmp(s, "default", 7) == 0) x.type = XF_DEFAULT;
301 11 85 else if (tlen == 3 && memcmp(s, "hex", 3) == 0) x.type = XF_HEX;
2 9 else if (tlen == 3 && memcmp(s, "hex", 3) == 0) x.type = XF_HEX;
302 9 85 else if (tlen == 9 && memcmp(s, "base64url", 9) == 0) x.type = XF_BASE64URL;
4 5 else if (tlen == 9 && memcmp(s, "base64url", 9) == 0) x.type = XF_BASE64URL;
303 18 72 else if (tlen == 6 && memcmp(s, "base64", 6) == 0) x.type = XF_BASE64;
4 14 else if (tlen == 6 && memcmp(s, "base64", 6) == 0) x.type = XF_BASE64;
304 7 79 else if (tlen == 5 && memcmp(s, "count", 5) == 0) x.type = XF_COUNT;
6 1 else if (tlen == 5 && memcmp(s, "count", 5) == 0) x.type = XF_COUNT;
305 20 60 else if (tlen == 4 && memcmp(s, "bool", 4) == 0) x.type = XF_BOOL;
7 13 else if (tlen == 4 && memcmp(s, "bool", 4) == 0) x.type = XF_BOOL;
306 13 60 else if (tlen == 4 && memcmp(s, "date", 4) == 0) x.type = XF_DATE;
2 11 else if (tlen == 4 && memcmp(s, "date", 4) == 0) x.type = XF_DATE;
307 17 54 else if (tlen == 7 && memcmp(s, "sprintf", 7) == 0) x.type = XF_SPRINTF;
6 11 else if (tlen == 7 && memcmp(s, "sprintf", 7) == 0) x.type = XF_SPRINTF;
308 11 54 else if (tlen == 7 && memcmp(s, "replace", 7) == 0) x.type = XF_REPLACE;
5 6 else if (tlen == 7 && memcmp(s, "replace", 7) == 0) x.type = XF_REPLACE;
309 14 46 else if (tlen == 6 && memcmp(s, "substr", 6) == 0) x.type = XF_SUBSTR;
4 10 else if (tlen == 6 && memcmp(s, "substr", 6) == 0) x.type = XF_SUBSTR;
310 10 46 else if (tlen == 6 && memcmp(s, "plural", 6) == 0) x.type = XF_PLURAL;
5 5 else if (tlen == 6 && memcmp(s, "plural", 6) == 0) x.type = XF_PLURAL;
311 4 47 else if (tlen == 2 && memcmp(s, "if", 2) == 0) x.type = XF_IF;
4 0 else if (tlen == 2 && memcmp(s, "if", 2) == 0) x.type = XF_IF;
312 5 42 else if (tlen == 6 && memcmp(s, "unless", 6) == 0) x.type = XF_UNLESS;
2 3 else if (tlen == 6 && memcmp(s, "unless", 6) == 0) x.type = XF_UNLESS;
313 9 36 else if (tlen == 3 && memcmp(s, "map", 3) == 0) x.type = XF_MAP;
5 4 else if (tlen == 3 && memcmp(s, "map", 3) == 0) x.type = XF_MAP;
314 11 29 else if (tlen == 4 && memcmp(s, "wrap", 4) == 0) x.type = XF_WRAP;
4 7 else if (tlen == 4 && memcmp(s, "wrap", 4) == 0) x.type = XF_WRAP;
315 5 31 else if (tlen == 9 && memcmp(s, "number_si", 9) == 0) x.type = XF_NUMBER_SI;
5 0 else if (tlen == 9 && memcmp(s, "number_si", 9) == 0) x.type = XF_NUMBER_SI;
316 10 21 else if (tlen == 8 && memcmp(s, "bytes_si", 8) == 0) x.type = XF_BYTES_SI;
5 5 else if (tlen == 8 && memcmp(s, "bytes_si", 8) == 0) x.type = XF_BYTES_SI;
317 6 20 else if (tlen == 7 && memcmp(s, "elapsed", 7) == 0) x.type = XF_ELAPSED;
6 0 else if (tlen == 7 && memcmp(s, "elapsed", 7) == 0) x.type = XF_ELAPSED;
318 4 16 else if (tlen == 3 && memcmp(s, "ago", 3) == 0) x.type = XF_AGO;
4 0 else if (tlen == 3 && memcmp(s, "ago", 3) == 0) x.type = XF_AGO;
319 7 9 else if (tlen == 4 && memcmp(s, "mask", 4) == 0) { x.type = XF_MASK; x.param_int = 4; }
7 0 else if (tlen == 4 && memcmp(s, "mask", 4) == 0) { x.type = XF_MASK; x.param_int = 4; }
320 3 6 else if (tlen == 6 && memcmp(s, "length", 6) == 0) x.type = XF_LENGTH;
3 0 else if (tlen == 6 && memcmp(s, "length", 6) == 0) x.type = XF_LENGTH;
321 5 1 else if (tlen == 8 && memcmp(s, "coalesce", 8) == 0) x.type = XF_COALESCE;
5 0 else if (tlen == 8 && memcmp(s, "coalesce", 8) == 0) x.type = XF_COALESCE;
323 66 169 if (param && plen == 0 && x.type == XF_DEFAULT) {
1 65 if (param && plen == 0 && x.type == XF_DEFAULT) {
1 0 if (param && plen == 0 && x.type == XF_DEFAULT) {
327 65 169 } else if (param && plen > 0) {
65 0 } else if (param && plen > 0) {
328 63 2 if (x.type == XF_FLOAT || x.type == XF_PAD || x.type == XF_RPAD || x.type == XF_TRUNC || x.type == XF_MASK) {
59 4 if (x.type == XF_FLOAT || x.type == XF_PAD || x.type == XF_RPAD || x.type == XF_TRUNC || x.type == XF_MASK) {
58 1 if (x.type == XF_FLOAT || x.type == XF_PAD || x.type == XF_RPAD || x.type == XF_TRUNC || x.type == XF_MASK) {
55 3 if (x.type == XF_FLOAT || x.type == XF_PAD || x.type == XF_RPAD || x.type == XF_TRUNC || x.type == XF_MASK) {
5 50 if (x.type == XF_FLOAT || x.type == XF_PAD || x.type == XF_RPAD || x.type == XF_TRUNC || x.type == XF_MASK) {
330 18 15 for (int i = 0; i < plen; i++) x.param_int = x.param_int * 10 + (param[i] - '0');
331 6 44 } else if (x.type == XF_SPRINTF) {
336 5 39 } else if (x.type == XF_REPLACE) {
338 5 0 if (c2) {
341 4 1 if (p1len > 0) {
350 4 35 } else if (x.type == XF_SUBSTR) {
353 1 3 int p1len = c2 ? (int)(c2 - param) : plen;
354 6 4 for (int i = 0; i < p1len; i++) x.param_int = x.param_int * 10 + (param[i] - '0');
356 1 3 if (c2) {
359 1 1 for (int i = 0; i < p2len; i++) x.param_int2 = x.param_int2 * 10 + (c2[1+i] - '0');
361 5 30 } else if (x.type == XF_PLURAL) {
363 5 0 if (c2) {
373 26 4 } else if (x.type == XF_IF || x.type == XF_UNLESS) {
2 24 } else if (x.type == XF_IF || x.type == XF_UNLESS) {
377 4 20 } else if (x.type == XF_WRAP) {
379 3 1 if (c2) {
393 5 15 } else if (x.type == XF_MAP) {
395 8 83 for (int i = 0; i < plen; i++) if (param[i] == ':') cnt++;
91 5 for (int i = 0; i < plen; i++) if (param[i] == ':') cnt++;
402 13 5 while (p2 < pe) {
404 5 8 if (!next) next = pe;
406 13 0 if (eq) {
414 5 10 } else if (x.type == XF_COALESCE) {
419 6 4 } else if (x.type == XF_DEFAULT || x.type == XF_DATE) {
1 5 } else if (x.type == XF_DEFAULT || x.type == XF_DATE) {
424 5 0 } else if (x.type == XF_BOOL) {
426 5 0 if (c2) {
451 487 6 for (int i = 0; i < spec_len; i++) {
452 271 216 if (spec[i] == ':' || spec[i] == '|') { sep = spec + i; break; }
0 271 if (spec[i] == ':' || spec[i] == '|') { sep = spec + i; break; }
456 216 6 int field_len = sep ? (int)(sep - spec) : spec_len;
459 201 21 if (field_len == 1 && field[0] == '#') {
5 196 if (field_len == 1 && field[0] == '#') {
462 3 2 if (!sep) {
473 217 0 if (field_len > 0 && field[0] == '-') { is_neg = 1; start_idx = 1; }
3 214 if (field_len > 0 && field[0] == '-') { is_neg = 1; start_idx = 1; }
474 217 198 for (int i = start_idx; i < field_len; i++)
475 217 0 if (field[i] < '0' || field[i] > '9') { is_num = 0; break; }
19 198 if (field[i] < '0' || field[i] > '9') { is_num = 0; break; }
477 198 19 if (is_num && field_len > start_idx) {
198 0 if (is_num && field_len > start_idx) {
479 198 198 for (int i = start_idx; i < field_len; i++) op->col = op->col * 10 + (field[i] - '0');
480 3 195 if (is_neg) op->col = -op->col;
490 3 214 if (!sep) {
499 0 216 if (*xforms_start == ':' || *xforms_start == '|') xforms_start++;
0 0 if (*xforms_start == ':' || *xforms_start == '|') xforms_start++;
504 19 1489 for (int i = 0; i < xforms_len; i++) if (xforms_start[i] == '|') nxforms++;
1508 216 for (int i = 0; i < xforms_len; i++) if (xforms_start[i] == '|') nxforms++;
511 235 216 while (p < xend) {
513 216 19 if (!pipe) pipe = xend;
521 19 214 for (int i = 1; i < op->chain_len; i++) {
522 1 18 if (op->chain[i].type == XF_COUNT)
524 1 17 if (op->chain[i].type == XF_COALESCE)
535 12 196 if (hlen) { t->header = (char *)malloc(hlen); memcpy(t->header, header, hlen); } t->header_len = hlen;
536 12 196 if (flen) { t->footer = (char *)malloc(flen); memcpy(t->footer, footer, flen); } t->footer_len = flen;
537 30 178 if (slen) { t->sep = (char *)malloc(slen); memcpy(t->sep, sep, slen); t->sep_len = slen; }
539 7 201 t->escape_char = esc_char ? esc_char : '{';
545 5 203 char close_char = (t->escape_char == '{') ? '}' : t->escape_char;
546 3 205 if (t->escape_char == '[') close_char = ']';
547 0 208 if (t->escape_char == '(') close_char = ')';
548 1 207 if (t->escape_char == '<') close_char = '>';
551 242 189 while (p < end) {
553 17 225 if (!brace) brace = end;
554 45 197 if (brace > p) {
555 0 45 if (t->nops >= cap) { cap *= 2; t->ops = (tpl_op *)realloc(t->ops, cap * sizeof(tpl_op)); if (!t->ops) croak("realloc"); memset(&t->ops[cap/2], 0, (cap/2)*sizeof(tpl_op)); }
0 0 if (t->nops >= cap) { cap *= 2; t->ops = (tpl_op *)realloc(t->ops, cap * sizeof(tpl_op)); if (!t->ops) croak("realloc"); memset(&t->ops[cap/2], 0, (cap/2)*sizeof(tpl_op)); }
562 17 225 if (brace >= end) break;
565 225 0 if (brace + 1 < end && brace[1] == t->escape_char) {
3 222 if (brace + 1 < end && brace[1] == t->escape_char) {
566 0 3 if (t->nops >= cap) { cap *= 2; t->ops = (tpl_op *)realloc(t->ops, cap * sizeof(tpl_op)); if (!t->ops) croak("realloc"); memset(&t->ops[cap/2], 0, (cap/2)*sizeof(tpl_op)); }
0 0 if (t->nops >= cap) { cap *= 2; t->ops = (tpl_op *)realloc(t->ops, cap * sizeof(tpl_op)); if (!t->ops) croak("realloc"); memset(&t->ops[cap/2], 0, (cap/2)*sizeof(tpl_op)); }
577 0 222 if (!close) break;
579 0 222 if (t->nops >= cap) { cap *= 2; t->ops = (tpl_op *)realloc(t->ops, cap * sizeof(tpl_op)); if (!t->ops) croak("realloc"); memset(&t->ops[cap/2], 0, (cap/2)*sizeof(tpl_op)); }
0 0 if (t->nops >= cap) { cap *= 2; t->ops = (tpl_op *)realloc(t->ops, cap * sizeof(tpl_op)); if (!t->ops) croak("realloc"); memset(&t->ops[cap/2], 0, (cap/2)*sizeof(tpl_op)); }
615 110 10456 if (mode == ROW_HASH) {
616 110 0 if (!SvROK(row_sv) || SvTYPE(SvRV(row_sv)) != SVt_PVHV) return NULL;
0 110 if (!SvROK(row_sv) || SvTYPE(SvRV(row_sv)) != SVt_PVHV) return NULL;
618 110 0 return sv ? *sv : NULL;
620 10456 0 if (!SvROK(row_sv) || SvTYPE(SvRV(row_sv)) != SVt_PVAV) return NULL;
0 10456 if (!SvROK(row_sv) || SvTYPE(SvRV(row_sv)) != SVt_PVAV) return NULL;
623 0 10456 SSize_t top = av_top_index(av);
625 3 10453 if (col < 0) col = (int)(top + 1) + col;
626 10456 0 if (col >= 0 && col <= (int)top) return ary[col];
10456 0 if (col >= 0 && col <= (int)top) return ary[col];
648 0 0 OUT_ENSURE(20);
0 0 OUT_ENSURE(20);
0 0 OUT_ENSURE(20);
0 0 OUT_ENSURE(20);
0 0 OUT_ENSURE(20);
0 0 OUT_ENSURE(20);
650 0 0 for (STRLEN i = 0; i < slen; i++) {
651 0 0 if (src[i] == '-') neg = 1;
652 0 0 else if (src[i] >= '0' && src[i] <= '9') v = v * 10 + (src[i] - '0');
0 0 else if (src[i] >= '0' && src[i] <= '9') v = v * 10 + (src[i] - '0');
654 0 0 if (neg) v = -v;
655 0 0 int w = itoa_fast(OUT_PTR, v);
656 0 0 if (to_output) pos += w; else tmp_len = w;
660 1001 0 OUT_ENSURE(28);
0 1001 OUT_ENSURE(28);
0 0 OUT_ENSURE(28);
0 0 OUT_ENSURE(28);
0 0 OUT_ENSURE(28);
0 0 OUT_ENSURE(28);
662 2894 1001 for (STRLEN i = 0; i < slen; i++) {
663 0 2894 if (src[i] == '-') neg = 1;
664 2894 0 else if (src[i] >= '0' && src[i] <= '9') v = v * 10 + (src[i] - '0');
2894 0 else if (src[i] >= '0' && src[i] <= '9') v = v * 10 + (src[i] - '0');
666 0 1001 if (neg) v = -v;
667 1001 0 int w = itoa_comma(OUT_PTR, v);
668 1001 0 if (to_output) pos += w; else tmp_len = w;
672 0 0 OUT_ENSURE(64);
0 0 OUT_ENSURE(64);
0 0 OUT_ENSURE(64);
0 0 OUT_ENSURE(64);
0 0 OUT_ENSURE(64);
0 0 OUT_ENSURE(64);
674 0 0 { char tb[64]; int tl = slen < 63 ? (int)slen : 63; memcpy(tb, src, tl); tb[tl] = 0; fv = atof(tb); }
675 0 0 int w = snprintf(OUT_PTR, 64, "%.*f", xf->param_int, fv);
676 0 0 if (w > 63) w = 63;
677 0 0 if (to_output) pos += w; else tmp_len = w;
681 32 0 OUT_ENSURE(slen * 6);
1 31 OUT_ENSURE(slen * 6);
0 1 OUT_ENSURE(slen * 6);
0 0 OUT_ENSURE(slen * 6);
0 0 OUT_ENSURE(slen * 6);
0 0 OUT_ENSURE(slen * 6);
0 0 OUT_ENSURE(slen * 6);
683 100672 17 for (STRLEN i = 0; i < slen; i++)
684 15 100657 if (html_special[(unsigned char)src[i]]) { needs_escape = 1; break; }
685 17 15 if (!needs_escape) {
686 17 0 memcpy(OUT_PTR, src, slen);
687 17 0 if (to_output) pos += slen; else tmp_len = slen;
689 15 0 int w = html_escape(OUT_PTR, src, slen);
690 15 0 if (to_output) pos += w; else tmp_len = w;
695 1 0 OUT_ENSURE(slen * 6);
0 1 OUT_ENSURE(slen * 6);
0 0 OUT_ENSURE(slen * 6);
0 0 OUT_ENSURE(slen * 6);
0 0 OUT_ENSURE(slen * 6);
0 0 OUT_ENSURE(slen * 6);
0 0 OUT_ENSURE(slen * 6);
697 6 0 for (STRLEN i = 0; i < slen; i++)
698 1 5 if (html_br_special[(unsigned char)src[i]]) { needs_escape = 1; break; }
699 0 1 if (!needs_escape) {
700 0 0 memcpy(OUT_PTR, src, slen);
701 0 0 if (to_output) pos += slen; else tmp_len = slen;
703 1 0 int w = html_br_escape(OUT_PTR, src, slen);
704 1 0 if (to_output) pos += w; else tmp_len = w;
709 1 0 OUT_ENSURE(slen * 3);
0 1 OUT_ENSURE(slen * 3);
0 0 OUT_ENSURE(slen * 3);
0 0 OUT_ENSURE(slen * 3);
0 0 OUT_ENSURE(slen * 3);
0 0 OUT_ENSURE(slen * 3);
0 0 OUT_ENSURE(slen * 3);
710 1 0 int w = url_escape(OUT_PTR, src, slen);
711 1 0 if (to_output) pos += w; else tmp_len = w;
715 4 0 OUT_ENSURE(slen * 6);
0 4 OUT_ENSURE(slen * 6);
0 0 OUT_ENSURE(slen * 6);
0 0 OUT_ENSURE(slen * 6);
0 0 OUT_ENSURE(slen * 6);
0 0 OUT_ENSURE(slen * 6);
0 0 OUT_ENSURE(slen * 6);
717 24 1 for (STRLEN i = 0; i < slen; i++)
718 3 21 if (json_special[(unsigned char)src[i]]) { needs_escape = 1; break; }
719 1 3 if (!needs_escape) {
720 1 0 memcpy(OUT_PTR, src, slen);
721 1 0 if (to_output) pos += slen; else tmp_len = slen;
723 3 0 int w = json_escape(OUT_PTR, src, slen);
724 3 0 if (to_output) pos += w; else tmp_len = w;
730 21 0 while (l > 0 && (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r')) { s++; l--; }
12 9 while (l > 0 && (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r')) { s++; l--; }
0 9 while (l > 0 && (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r')) { s++; l--; }
0 9 while (l > 0 && (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r')) { s++; l--; }
0 9 while (l > 0 && (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r')) { s++; l--; }
731 22 0 while (l > 0 && (s[l-1] == ' ' || s[l-1] == '\t' || s[l-1] == '\n' || s[l-1] == '\r')) l--;
12 10 while (l > 0 && (s[l-1] == ' ' || s[l-1] == '\t' || s[l-1] == '\n' || s[l-1] == '\r')) l--;
0 10 while (l > 0 && (s[l-1] == ' ' || s[l-1] == '\t' || s[l-1] == '\n' || s[l-1] == '\r')) l--;
1 9 while (l > 0 && (s[l-1] == ' ' || s[l-1] == '\t' || s[l-1] == '\n' || s[l-1] == '\r')) l--;
0 9 while (l > 0 && (s[l-1] == ' ' || s[l-1] == '\t' || s[l-1] == '\n' || s[l-1] == '\r')) l--;
732 1 8 OUT_ENSURE(l);
0 1 OUT_ENSURE(l);
0 0 OUT_ENSURE(l);
2 6 OUT_ENSURE(l);
0 2 OUT_ENSURE(l);
6 0 OUT_ENSURE(l);
0 6 OUT_ENSURE(l);
733 1 8 memcpy(OUT_PTR, s, l);
734 1 8 if (to_output) pos += l; else tmp_len = l;
738 5 1 OUT_ENSURE(slen);
0 5 OUT_ENSURE(slen);
0 0 OUT_ENSURE(slen);
0 1 OUT_ENSURE(slen);
0 0 OUT_ENSURE(slen);
1 0 OUT_ENSURE(slen);
0 1 OUT_ENSURE(slen);
739 19 9 for (STRLEN i = 0; i < slen; i++) OUT_PTR[i] = toupper((unsigned char)src[i]);
28 6 for (STRLEN i = 0; i < slen; i++) OUT_PTR[i] = toupper((unsigned char)src[i]);
740 5 1 if (to_output) pos += slen; else tmp_len = slen;
744 2 3 OUT_ENSURE(slen);
0 2 OUT_ENSURE(slen);
0 0 OUT_ENSURE(slen);
2 1 OUT_ENSURE(slen);
0 2 OUT_ENSURE(slen);
1 0 OUT_ENSURE(slen);
0 1 OUT_ENSURE(slen);
745 9 24 for (STRLEN i = 0; i < slen; i++) OUT_PTR[i] = tolower((unsigned char)src[i]);
33 5 for (STRLEN i = 0; i < slen; i++) OUT_PTR[i] = tolower((unsigned char)src[i]);
746 2 3 if (to_output) pos += slen; else tmp_len = slen;
751 4 0 OUT_ENSURE(w > (int)slen ? w : slen);
3 1 OUT_ENSURE(w > (int)slen ? w : slen);
0 4 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
753 3 1 if (pad > 0) { memset(OUT_PTR, ' ', pad); memcpy(OUT_PTR + pad, src, slen); }
3 0 if (pad > 0) { memset(OUT_PTR, ' ', pad); memcpy(OUT_PTR + pad, src, slen); }
3 0 if (pad > 0) { memset(OUT_PTR, ' ', pad); memcpy(OUT_PTR + pad, src, slen); }
754 1 0 else memcpy(OUT_PTR, src, slen);
755 1 3 int total = pad > 0 ? w : (int)slen;
756 4 0 if (to_output) pos += total; else tmp_len = total;
761 1 0 OUT_ENSURE(w > (int)slen ? w : slen);
1 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 1 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
0 0 OUT_ENSURE(w > (int)slen ? w : slen);
762 1 0 memcpy(OUT_PTR, src, slen);
764 1 0 if (pad > 0) memset(OUT_PTR + slen, ' ', pad);
1 0 if (pad > 0) memset(OUT_PTR + slen, ' ', pad);
765 0 1 int total = pad > 0 ? w : (int)slen;
766 1 0 if (to_output) pos += total; else tmp_len = total;
771 1 2 if ((int)slen <= mx) {
772 1 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 1 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
1 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
773 1 0 if (to_output) pos += slen; else tmp_len = slen;
776 1 1 OUT_ENSURE(tl + 3);
0 1 OUT_ENSURE(tl + 3);
0 0 OUT_ENSURE(tl + 3);
0 1 OUT_ENSURE(tl + 3);
0 0 OUT_ENSURE(tl + 3);
1 0 OUT_ENSURE(tl + 3);
0 1 OUT_ENSURE(tl + 3);
777 1 1 memcpy(OUT_PTR, src, tl);
778 1 1 memcpy(OUT_PTR + tl, "...", 3);
779 1 1 if (to_output) pos += tl + 3; else tmp_len = tl + 3;
784 1 0 OUT_ENSURE(slen * 2);
0 1 OUT_ENSURE(slen * 2);
0 0 OUT_ENSURE(slen * 2);
0 0 OUT_ENSURE(slen * 2);
0 0 OUT_ENSURE(slen * 2);
0 0 OUT_ENSURE(slen * 2);
0 0 OUT_ENSURE(slen * 2);
785 1 0 int w = hex_encode(OUT_PTR, src, slen);
786 1 0 if (to_output) pos += w; else tmp_len = w;
790 7 0 OUT_ENSURE(((slen + 2) / 3) * 4);
0 7 OUT_ENSURE(((slen + 2) / 3) * 4);
0 0 OUT_ENSURE(((slen + 2) / 3) * 4);
0 0 OUT_ENSURE(((slen + 2) / 3) * 4);
0 0 OUT_ENSURE(((slen + 2) / 3) * 4);
0 0 OUT_ENSURE(((slen + 2) / 3) * 4);
0 0 OUT_ENSURE(((slen + 2) / 3) * 4);
791 7 0 int w = base64_encode(OUT_PTR, (const unsigned char *)src, slen);
792 7 0 if (to_output) pos += w; else tmp_len = w;
796 3 0 OUT_ENSURE(((slen + 2) / 3) * 4);
0 3 OUT_ENSURE(((slen + 2) / 3) * 4);
0 0 OUT_ENSURE(((slen + 2) / 3) * 4);
0 0 OUT_ENSURE(((slen + 2) / 3) * 4);
0 0 OUT_ENSURE(((slen + 2) / 3) * 4);
0 0 OUT_ENSURE(((slen + 2) / 3) * 4);
0 0 OUT_ENSURE(((slen + 2) / 3) * 4);
797 3 0 int w = base64url_encode(OUT_PTR, (const unsigned char *)src, slen);
798 3 0 if (to_output) pos += w; else tmp_len = w;
805 0 0 OUT_ENSURE(12);
0 0 OUT_ENSURE(12);
0 0 OUT_ENSURE(12);
0 0 OUT_ENSURE(12);
0 0 OUT_ENSURE(12);
0 0 OUT_ENSURE(12);
806 0 0 int w = itoa_fast(OUT_PTR, xf->param_int);
807 0 0 if (to_output) pos += w; else tmp_len = w;
812 4 3 if (slen == 1 && src[0] == '0') truthy = 0;
3 1 if (slen == 1 && src[0] == '0') truthy = 0;
814 3 4 if (truthy) {
815 2 1 val = xf->param_str ? xf->param_str : "true";
816 2 1 vlen = xf->param_str ? xf->param_str_len : 4;
818 3 1 val = xf->param_str2 ? xf->param_str2 : "false";
819 3 1 vlen = xf->param_str2 ? xf->param_str2_len : 5;
821 7 0 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
0 7 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
0 0 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
0 0 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
0 0 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
0 0 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
0 0 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
7 0 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
822 7 0 if (to_output) pos += vlen; else tmp_len = vlen;
827 11 2 for (STRLEN i = 0; i < slen; i++) {
828 11 0 if (src[i] >= '0' && src[i] <= '9') epoch = epoch * 10 + (src[i] - '0');
11 0 if (src[i] >= '0' && src[i] <= '9') epoch = epoch * 10 + (src[i] - '0');
832 1 1 const char *fmt = xf->param_str ? xf->param_str : "%Y-%m-%d %H:%M:%S";
833 2 0 OUT_ENSURE(256);
0 2 OUT_ENSURE(256);
0 0 OUT_ENSURE(256);
0 0 OUT_ENSURE(256);
0 0 OUT_ENSURE(256);
0 0 OUT_ENSURE(256);
834 2 0 int w = (int)strftime(OUT_PTR, 256, fmt, &tm);
835 2 0 if (to_output) pos += w; else tmp_len = w;
839 6 0 OUT_ENSURE(256);
0 6 OUT_ENSURE(256);
0 0 OUT_ENSURE(256);
0 0 OUT_ENSURE(256);
0 0 OUT_ENSURE(256);
0 0 OUT_ENSURE(256);
840 6 0 if (xf->param_str && xf->param_str_len > 0) {
6 0 if (xf->param_str && xf->param_str_len > 0) {
842 5 1 if (last != 'd' && last != 'i' && last != 'x' && last != 'X' &&
5 0 if (last != 'd' && last != 'i' && last != 'x' && last != 'X' &&
4 1 if (last != 'd' && last != 'i' && last != 'x' && last != 'X' &&
4 0 if (last != 'd' && last != 'i' && last != 'x' && last != 'X' &&
4 0 if (last != 'd' && last != 'i' && last != 'x' && last != 'X' &&
843 4 0 last != 'o' && last != 'u' && last != 'f' && last != 'e' &&
3 1 last != 'o' && last != 'u' && last != 'f' && last != 'e' &&
3 0 last != 'o' && last != 'u' && last != 'f' && last != 'e' &&
3 0 last != 'o' && last != 'u' && last != 'f' && last != 'e' &&
844 1 2 last != 'g' && last != 's') {
845 1 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 1 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
1 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
846 1 0 if (to_output) pos += slen; else tmp_len = slen;
851 5 0 xf->param_str[0] == '%' ? "" : "%", xf->param_str);
852 0 5 if (fmtlen >= (int)sizeof(fmtbuf)) {
853 0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
854 0 0 if (to_output) pos += slen; else tmp_len = slen;
858 21 5 for (int fi = 0; fi < fmtlen && fmtbuf[fi]; fi++) {
21 0 for (int fi = 0; fi < fmtlen && fmtbuf[fi]; fi++) {
859 6 15 if (fmtbuf[fi] == '%') { if (fi + 1 < fmtlen && fmtbuf[fi+1] == '%') fi++; else pct_count++; }
6 0 if (fmtbuf[fi] == '%') { if (fi + 1 < fmtlen && fmtbuf[fi+1] == '%') fi++; else pct_count++; }
0 6 if (fmtbuf[fi] == '%') { if (fi + 1 < fmtlen && fmtbuf[fi+1] == '%') fi++; else pct_count++; }
860 0 15 else if (fmtbuf[fi] == '*') has_star = 1;
862 4 1 if (pct_count != 1 || has_star) {
0 4 if (pct_count != 1 || has_star) {
863 1 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 1 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
1 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
864 1 0 if (to_output) pos += slen; else tmp_len = slen;
868 3 1 if (last == 'd' || last == 'i' || last == 'x' || last == 'X' || last == 'o' || last == 'u') {
3 0 if (last == 'd' || last == 'i' || last == 'x' || last == 'X' || last == 'o' || last == 'u') {
2 1 if (last == 'd' || last == 'i' || last == 'x' || last == 'X' || last == 'o' || last == 'u') {
2 0 if (last == 'd' || last == 'i' || last == 'x' || last == 'X' || last == 'o' || last == 'u') {
2 0 if (last == 'd' || last == 'i' || last == 'x' || last == 'X' || last == 'o' || last == 'u') {
0 2 if (last == 'd' || last == 'i' || last == 'x' || last == 'X' || last == 'o' || last == 'u') {
870 5 2 for (STRLEN i = 0; i < slen; i++) {
871 0 5 if (src[i] == '-') neg = 1;
872 5 0 else if (src[i] >= '0' && src[i] <= '9') lv = lv * 10 + (src[i] - '0');
5 0 else if (src[i] >= '0' && src[i] <= '9') lv = lv * 10 + (src[i] - '0');
874 0 2 if (neg) lv = -lv;
875 2 0 w = snprintf(OUT_PTR, 256, fmtbuf, lv);
876 1 1 } else if (last == 'f' || last == 'e' || last == 'g') {
1 0 } else if (last == 'f' || last == 'e' || last == 'g') {
0 1 } else if (last == 'f' || last == 'e' || last == 'g') {
877 1 0 char tb[64]; int tl = slen < 63 ? (int)slen : 63;
879 1 0 w = snprintf(OUT_PTR, 256, fmtbuf, atof(tb));
881 1 0 char tb[256]; int tl = slen < 255 ? (int)slen : 255;
883 1 0 w = snprintf(OUT_PTR, 256, fmtbuf, tb);
885 0 4 if (w > 255) w = 255;
886 4 0 if (to_output) pos += w; else tmp_len = w;
891 1 4 if (!xf->param_str) {
892 1 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 1 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
1 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
893 1 0 if (to_output) pos += slen; else tmp_len = slen;
898 4 0 const char *repl = xf->param_str2 ? xf->param_str2 : "";
899 4 0 STRLEN rlen = xf->param_str2 ? xf->param_str2_len : 0;
900 4 0 OUT_ENSURE(slen * (rlen + 1));
0 4 OUT_ENSURE(slen * (rlen + 1));
0 0 OUT_ENSURE(slen * (rlen + 1));
0 0 OUT_ENSURE(slen * (rlen + 1));
0 0 OUT_ENSURE(slen * (rlen + 1));
0 0 OUT_ENSURE(slen * (rlen + 1));
0 0 OUT_ENSURE(slen * (rlen + 1));
901 4 0 char *out = OUT_PTR;
904 19 4 while (i < slen) {
905 18 1 if (i + nlen <= slen && memcmp(src + i, needle, nlen) == 0) {
7 11 if (i + nlen <= slen && memcmp(src + i, needle, nlen) == 0) {
912 4 0 if (to_output) pos += opos; else tmp_len = opos;
918 3 1 if (start < 0 || start >= (int)slen) {
1 2 if (start < 0 || start >= (int)slen) {
919 0 2 if (!to_output) tmp_len = 0;
924 1 1 if (maxlen >= 0 && (int)l > maxlen) l = maxlen;
1 0 if (maxlen >= 0 && (int)l > maxlen) l = maxlen;
925 2 0 OUT_ENSURE(l); memcpy(OUT_PTR, s, l);
0 2 OUT_ENSURE(l); memcpy(OUT_PTR, s, l);
0 0 OUT_ENSURE(l); memcpy(OUT_PTR, s, l);
0 0 OUT_ENSURE(l); memcpy(OUT_PTR, s, l);
0 0 OUT_ENSURE(l); memcpy(OUT_PTR, s, l);
0 0 OUT_ENSURE(l); memcpy(OUT_PTR, s, l);
0 0 OUT_ENSURE(l); memcpy(OUT_PTR, s, l);
2 0 OUT_ENSURE(l); memcpy(OUT_PTR, s, l);
926 2 0 if (to_output) pos += l; else tmp_len = l;
931 5 0 STRLEN pi = (slen > 0 && src[0] == '-') ? 1 : 0;
1 4 STRLEN pi = (slen > 0 && src[0] == '-') ? 1 : 0;
932 5 5 for (STRLEN i = pi; i < slen; i++)
933 5 0 if (src[i] >= '0' && src[i] <= '9') v = v * 10 + (src[i] - '0');
5 0 if (src[i] >= '0' && src[i] <= '9') v = v * 10 + (src[i] - '0');
934 1 4 if (pi) v = -v; /* preserve sign: -1 is plural, and itoa keeps the '-' */
936 2 3 if (v == 1) {
937 2 0 form = xf->param_str ? xf->param_str : ""; flen = xf->param_str_len;
939 3 0 form = xf->param_str2 ? xf->param_str2 : "s"; flen = xf->param_str2 ? xf->param_str2_len : 1;
3 0 form = xf->param_str2 ? xf->param_str2 : "s"; flen = xf->param_str2 ? xf->param_str2_len : 1;
941 5 0 OUT_ENSURE(20 + 1 + flen);
0 5 OUT_ENSURE(20 + 1 + flen);
0 0 OUT_ENSURE(20 + 1 + flen);
0 0 OUT_ENSURE(20 + 1 + flen);
0 0 OUT_ENSURE(20 + 1 + flen);
0 0 OUT_ENSURE(20 + 1 + flen);
0 0 OUT_ENSURE(20 + 1 + flen);
942 5 0 int nw = itoa_fast(OUT_PTR, v);
943 5 0 OUT_PTR[nw] = ' ';
944 5 0 memcpy(OUT_PTR + nw + 1, form, flen);
946 5 0 if (to_output) pos += total; else tmp_len = total;
950 2 2 int truthy = (slen > 0 && !(slen == 1 && src[0] == '0'));
2 0 int truthy = (slen > 0 && !(slen == 1 && src[0] == '0'));
1 1 int truthy = (slen > 0 && !(slen == 1 && src[0] == '0'));
951 1 3 if (truthy && xf->param_str) {
1 0 if (truthy && xf->param_str) {
952 1 0 OUT_ENSURE(xf->param_str_len);
0 1 OUT_ENSURE(xf->param_str_len);
0 0 OUT_ENSURE(xf->param_str_len);
0 0 OUT_ENSURE(xf->param_str_len);
0 0 OUT_ENSURE(xf->param_str_len);
0 0 OUT_ENSURE(xf->param_str_len);
0 0 OUT_ENSURE(xf->param_str_len);
953 1 0 memcpy(OUT_PTR, xf->param_str, xf->param_str_len);
954 1 0 if (to_output) pos += xf->param_str_len; else tmp_len = xf->param_str_len;
956 0 3 if (!to_output) tmp_len = 0;
961 1 1 int truthy = (slen > 0 && !(slen == 1 && src[0] == '0'));
1 0 int truthy = (slen > 0 && !(slen == 1 && src[0] == '0'));
1 0 int truthy = (slen > 0 && !(slen == 1 && src[0] == '0'));
962 1 1 if (!truthy && xf->param_str) {
1 0 if (!truthy && xf->param_str) {
963 1 0 OUT_ENSURE(xf->param_str_len);
0 1 OUT_ENSURE(xf->param_str_len);
0 0 OUT_ENSURE(xf->param_str_len);
0 0 OUT_ENSURE(xf->param_str_len);
0 0 OUT_ENSURE(xf->param_str_len);
0 0 OUT_ENSURE(xf->param_str_len);
0 0 OUT_ENSURE(xf->param_str_len);
964 1 0 memcpy(OUT_PTR, xf->param_str, xf->param_str_len);
965 1 0 if (to_output) pos += xf->param_str_len; else tmp_len = xf->param_str_len;
967 0 1 if (!to_output) tmp_len = 0;
973 10 2 for (int mi = 0; mi < xf->map_count; mi++) {
974 10 0 if ((xf->map_key_lens[mi] == slen && memcmp(xf->map_keys[mi], src, slen) == 0) ||
7 3 if ((xf->map_key_lens[mi] == slen && memcmp(xf->map_keys[mi], src, slen) == 0) ||
975 7 0 (xf->map_key_lens[mi] == 1 && xf->map_keys[mi][0] == '*')) {
2 5 (xf->map_key_lens[mi] == 1 && xf->map_keys[mi][0] == '*')) {
977 5 0 if (xf->map_key_lens[mi] != 1 || xf->map_keys[mi][0] != '*') break;
2 3 if (xf->map_key_lens[mi] != 1 || xf->map_keys[mi][0] != '*') break;
980 5 0 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
0 5 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
0 0 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
0 0 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
0 0 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
0 0 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
0 0 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
5 0 OUT_ENSURE(vlen); memcpy(OUT_PTR, val, vlen);
981 5 0 if (to_output) pos += vlen; else tmp_len = vlen;
985 2 2 if (slen > 0 && xf->param_str) {
2 0 if (slen > 0 && xf->param_str) {
986 1 1 STRLEN plen2 = xf->param_str_len + slen + (xf->param_str2 ? xf->param_str2_len : 0);
987 2 0 OUT_ENSURE(plen2);
0 2 OUT_ENSURE(plen2);
0 0 OUT_ENSURE(plen2);
0 0 OUT_ENSURE(plen2);
0 0 OUT_ENSURE(plen2);
0 0 OUT_ENSURE(plen2);
0 0 OUT_ENSURE(plen2);
988 2 0 memcpy(OUT_PTR, xf->param_str, xf->param_str_len);
990 2 0 memcpy(OUT_PTR + wpos, src, slen); wpos += slen;
991 1 1 if (xf->param_str2) { memcpy(OUT_PTR + wpos, xf->param_str2, xf->param_str2_len); wpos += xf->param_str2_len; }
1 0 if (xf->param_str2) { memcpy(OUT_PTR + wpos, xf->param_str2, xf->param_str2_len); wpos += xf->param_str2_len; }
992 2 0 if (to_output) pos += wpos; else tmp_len = wpos;
994 0 2 if (!to_output) tmp_len = 0;
1000 4 0 { char tb[64]; int tl = slen < 63 ? (int)slen : 63; memcpy(tb, src, tl); tb[tl] = 0; v = atof(tb); }
1001 4 0 OUT_ENSURE(32);
0 4 OUT_ENSURE(32);
0 0 OUT_ENSURE(32);
0 0 OUT_ENSURE(32);
0 0 OUT_ENSURE(32);
0 0 OUT_ENSURE(32);
1003 4 0 if (v >= 1e15 || v <= -1e15) w = snprintf(OUT_PTR, 32, "%.1fP", v / 1e15);
0 4 if (v >= 1e15 || v <= -1e15) w = snprintf(OUT_PTR, 32, "%.1fP", v / 1e15);
0 0 if (v >= 1e15 || v <= -1e15) w = snprintf(OUT_PTR, 32, "%.1fP", v / 1e15);
1004 4 0 else if (v >= 1e12 || v <= -1e12) w = snprintf(OUT_PTR, 32, "%.1fT", v / 1e12);
0 4 else if (v >= 1e12 || v <= -1e12) w = snprintf(OUT_PTR, 32, "%.1fT", v / 1e12);
0 0 else if (v >= 1e12 || v <= -1e12) w = snprintf(OUT_PTR, 32, "%.1fT", v / 1e12);
1005 4 0 else if (v >= 1e9 || v <= -1e9) w = snprintf(OUT_PTR, 32, "%.1fG", v / 1e9);
0 4 else if (v >= 1e9 || v <= -1e9) w = snprintf(OUT_PTR, 32, "%.1fG", v / 1e9);
0 0 else if (v >= 1e9 || v <= -1e9) w = snprintf(OUT_PTR, 32, "%.1fG", v / 1e9);
1006 3 1 else if (v >= 1e6 || v <= -1e6) w = snprintf(OUT_PTR, 32, "%.1fM", v / 1e6);
0 3 else if (v >= 1e6 || v <= -1e6) w = snprintf(OUT_PTR, 32, "%.1fM", v / 1e6);
1 0 else if (v >= 1e6 || v <= -1e6) w = snprintf(OUT_PTR, 32, "%.1fM", v / 1e6);
1007 2 1 else if (v >= 1e3 || v <= -1e3) w = snprintf(OUT_PTR, 32, "%.1fK", v / 1e3);
1 1 else if (v >= 1e3 || v <= -1e3) w = snprintf(OUT_PTR, 32, "%.1fK", v / 1e3);
2 0 else if (v >= 1e3 || v <= -1e3) w = snprintf(OUT_PTR, 32, "%.1fK", v / 1e3);
1008 1 0 else w = snprintf(OUT_PTR, 32, "%.0f", v);
1009 0 4 if (w > 31) w = 31;
1010 4 0 if (to_output) pos += w; else tmp_len = w;
1015 4 0 { char tb[64]; int tl = slen < 63 ? (int)slen : 63; memcpy(tb, src, tl); tb[tl] = 0; v = atof(tb); }
1016 4 0 OUT_ENSURE(32);
0 4 OUT_ENSURE(32);
0 0 OUT_ENSURE(32);
0 0 OUT_ENSURE(32);
0 0 OUT_ENSURE(32);
0 0 OUT_ENSURE(32);
1018 1 3 if (v >= 1099511627776.0) w = snprintf(OUT_PTR, 32, "%.1f TB", v / 1099511627776.0);
1 0 if (v >= 1099511627776.0) w = snprintf(OUT_PTR, 32, "%.1f TB", v / 1099511627776.0);
1019 1 2 else if (v >= 1073741824.0) w = snprintf(OUT_PTR, 32, "%.1f GB", v / 1073741824.0);
1 0 else if (v >= 1073741824.0) w = snprintf(OUT_PTR, 32, "%.1f GB", v / 1073741824.0);
1020 0 2 else if (v >= 1048576.0) w = snprintf(OUT_PTR, 32, "%.1f MB", v / 1048576.0);
0 0 else if (v >= 1048576.0) w = snprintf(OUT_PTR, 32, "%.1f MB", v / 1048576.0);
1021 1 1 else if (v >= 1024.0) w = snprintf(OUT_PTR, 32, "%.1f KB", v / 1024.0);
1 0 else if (v >= 1024.0) w = snprintf(OUT_PTR, 32, "%.1f KB", v / 1024.0);
1022 1 0 else w = snprintf(OUT_PTR, 32, "%.0f B", v);
1023 0 4 if (w > 31) w = 31;
1024 4 0 if (to_output) pos += w; else tmp_len = w;
1029 17 5 for (STRLEN i = 0; i < slen; i++)
1030 17 0 if (src[i] >= '0' && src[i] <= '9') v = v * 10 + (src[i] - '0');
17 0 if (src[i] >= '0' && src[i] <= '9') v = v * 10 + (src[i] - '0');
1031 5 0 OUT_ENSURE(64);
0 5 OUT_ENSURE(64);
0 0 OUT_ENSURE(64);
0 0 OUT_ENSURE(64);
0 0 OUT_ENSURE(64);
0 0 OUT_ENSURE(64);
1033 2 3 if (v >= 86400 && w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%ldd ", v / 86400); if (n > 0) w += n; v %= 86400; }
2 0 if (v >= 86400 && w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%ldd ", v / 86400); if (n > 0) w += n; v %= 86400; }
2 0 if (v >= 86400 && w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%ldd ", v / 86400); if (n > 0) w += n; v %= 86400; }
2 0 if (v >= 86400 && w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%ldd ", v / 86400); if (n > 0) w += n; v %= 86400; }
1034 3 2 if (v >= 3600 && w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%ldh ", v / 3600); if (n > 0) w += n; v %= 3600; }
3 0 if (v >= 3600 && w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%ldh ", v / 3600); if (n > 0) w += n; v %= 3600; }
3 0 if (v >= 3600 && w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%ldh ", v / 3600); if (n > 0) w += n; v %= 3600; }
3 0 if (v >= 3600 && w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%ldh ", v / 3600); if (n > 0) w += n; v %= 3600; }
1035 3 2 if (v >= 60 && w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%ldm ", v / 60); if (n > 0) w += n; v %= 60; }
3 0 if (v >= 60 && w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%ldm ", v / 60); if (n > 0) w += n; v %= 60; }
3 0 if (v >= 60 && w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%ldm ", v / 60); if (n > 0) w += n; v %= 60; }
3 0 if (v >= 60 && w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%ldm ", v / 60); if (n > 0) w += n; v %= 60; }
1036 5 0 if (w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%lds", v); if (n > 0) w += n; }
5 0 if (w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%lds", v); if (n > 0) w += n; }
5 0 if (w < 63) { int n = snprintf(OUT_PTR + w, 64 - w, "%lds", v); if (n > 0) w += n; }
1037 0 5 if (w > 63) w = 63;
1038 5 0 if (to_output) pos += w; else tmp_len = w;
1044 30 3 for (STRLEN i = 0; i < slen; i++)
1045 30 0 if (src[i] >= '0' && src[i] <= '9') epoch = epoch * 10 + (src[i] - '0');
30 0 if (src[i] >= '0' && src[i] <= '9') epoch = epoch * 10 + (src[i] - '0');
1047 3 0 OUT_ENSURE(32);
0 3 OUT_ENSURE(32);
0 0 OUT_ENSURE(32);
0 0 OUT_ENSURE(32);
0 0 OUT_ENSURE(32);
0 0 OUT_ENSURE(32);
1049 1 2 if (diff < 0) w = snprintf(OUT_PTR, 32, "in the future");
1 0 if (diff < 0) w = snprintf(OUT_PTR, 32, "in the future");
1050 0 2 else if (diff < 60) w = snprintf(OUT_PTR, 32, "%lds ago", diff);
0 0 else if (diff < 60) w = snprintf(OUT_PTR, 32, "%lds ago", diff);
1051 1 1 else if (diff < 3600) w = snprintf(OUT_PTR, 32, "%ldm ago", diff / 60);
1 0 else if (diff < 3600) w = snprintf(OUT_PTR, 32, "%ldm ago", diff / 60);
1052 1 0 else if (diff < 86400) w = snprintf(OUT_PTR, 32, "%ldh ago", diff / 3600);
1 0 else if (diff < 86400) w = snprintf(OUT_PTR, 32, "%ldh ago", diff / 3600);
1053 0 0 else if (diff < 2592000) w = snprintf(OUT_PTR, 32, "%ldd ago", diff / 86400);
0 0 else if (diff < 2592000) w = snprintf(OUT_PTR, 32, "%ldd ago", diff / 86400);
1054 0 0 else if (diff < 31536000) w = snprintf(OUT_PTR, 32, "%ldmo ago", diff / 2592000);
0 0 else if (diff < 31536000) w = snprintf(OUT_PTR, 32, "%ldmo ago", diff / 2592000);
1055 0 0 else w = snprintf(OUT_PTR, 32, "%ldy ago", diff / 31536000);
1056 0 3 if (w > 31) w = 31;
1057 3 0 if (to_output) pos += w; else tmp_len = w;
1062 5 1 OUT_ENSURE(slen);
0 5 OUT_ENSURE(slen);
0 0 OUT_ENSURE(slen);
0 1 OUT_ENSURE(slen);
0 0 OUT_ENSURE(slen);
1 0 OUT_ENSURE(slen);
0 1 OUT_ENSURE(slen);
1064 5 1 if (mask_len > 0) memset(OUT_PTR, '*', mask_len);
4 1 if (mask_len > 0) memset(OUT_PTR, '*', mask_len);
1065 5 1 if (keep > 0) {
1068 4 1 memcpy(OUT_PTR + start, src + slen - copy, copy);
1071 5 1 if (to_output) pos += total; else tmp_len = total;
1075 3 0 OUT_ENSURE(20);
0 3 OUT_ENSURE(20);
0 0 OUT_ENSURE(20);
0 0 OUT_ENSURE(20);
0 0 OUT_ENSURE(20);
0 0 OUT_ENSURE(20);
1076 3 0 int w = itoa_fast(OUT_PTR, (long)slen);
1077 3 0 if (to_output) pos += w; else tmp_len = w;
1084 348 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
1 347 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 1 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
0 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
348 0 OUT_ENSURE(slen); memcpy(OUT_PTR, src, slen);
1085 348 0 if (to_output) pos += slen; else tmp_len = slen;
1103 1010 10561 if (op->is_rownum) {
1110 10561 1010 if (!op->is_rownum) {
1114 10561 0 if (!sv || !SvOK(sv)) {
27 10534 if (!sv || !SvOK(sv)) {
1115 27 19 for (int i = 0; i < op->chain_len; i++) {
1116 4 23 if (op->chain[i].type == XF_DEFAULT && op->chain[i].param_str) {
4 0 if (op->chain[i].type == XF_DEFAULT && op->chain[i].param_str) {
1122 1 22 if (op->chain[i].type == XF_COALESCE) {
1126 21 1 if (op->chain[i].type == XF_BOOL || op->chain[i].type == XF_IF ||
20 1 if (op->chain[i].type == XF_BOOL || op->chain[i].type == XF_IF ||
1127 20 0 op->chain[i].type == XF_UNLESS || op->chain[i].type == XF_MAP ||
20 0 op->chain[i].type == XF_UNLESS || op->chain[i].type == XF_MAP ||
1128 1 19 op->chain[i].type == XF_WRAP) {
1134 19 8 if (!use_default) return;
1139 10542 1010 if (!op->is_rownum && op->chain_len > 0 && op->chain[0].type == XF_COALESCE) {
10542 0 if (!op->is_rownum && op->chain_len > 0 && op->chain[0].type == XF_COALESCE) {
6 10536 if (!op->is_rownum && op->chain_len > 0 && op->chain[0].type == XF_COALESCE) {
1141 6 0 if (sv && SvOK(sv)) {
5 1 if (sv && SvOK(sv)) {
1144 1 4 if (plen > 0) { primary_ok = 1; src = pstr; slen = plen; use_default = 0; }
1146 5 1 if (!primary_ok && !op->chain[0].param_str) return;
0 5 if (!primary_ok && !op->chain[0].param_str) return;
1147 5 1 if (!primary_ok && op->chain[0].param_str) {
5 0 if (!primary_ok && op->chain[0].param_str) {
1154 10 0 while (tp < pe) {
1156 5 5 if (!next) { last_param = tp; last_param_len = pe - tp; break; }
1163 7 0 while (p < pe) {
1165 5 2 STRLEN seg_len = next ? (STRLEN)(next - p) : (STRLEN)(pe - p);
1166 2 5 if (!next && p == last_param) break; /* this is the literal default */
2 0 if (!next && p == last_param) break; /* this is the literal default */
1168 0 5 if (p != last_param || next) {
0 0 if (p != last_param || next) {
1171 4 1 if (mode == ROW_HASH) {
1175 1 0 if (seg_len > 0 && p[0] == '-') { is_neg = 1; si = 1; }
0 1 if (seg_len > 0 && p[0] == '-') { is_neg = 1; si = 1; }
1177 1 1 for (STRLEN fi = si; fi < seg_len; fi++)
1178 1 0 if (p[fi] < '0' || p[fi] > '9') { is_num = 0; break; }
0 1 if (p[fi] < '0' || p[fi] > '9') { is_num = 0; break; }
1179 1 0 if (is_num && seg_len > (STRLEN)si) {
1 0 if (is_num && seg_len > (STRLEN)si) {
1181 1 1 for (STRLEN fi = si; fi < seg_len; fi++) tmp_op.col = tmp_op.col * 10 + (p[fi] - '0');
1182 0 1 if (is_neg) tmp_op.col = -tmp_op.col;
1184 0 0 if (!next) break; /* non-numeric in array mode = treat as literal default */
1189 5 0 if (fallback && SvOK(fallback)) {
4 1 if (fallback && SvOK(fallback)) {
1192 3 1 if (flen > 0) { sv = fallback; src = fstr; slen = flen; use_default = 0; found = 1; break; }
1195 0 2 if (!next) break;
1198 2 3 if (!found) {
1206 10533 1019 if (!use_default && !op->is_rownum && op->chain_len > 0 && op->chain[0].type == XF_COUNT) {
10533 0 if (!use_default && !op->is_rownum && op->chain_len > 0 && op->chain[0].type == XF_COUNT) {
10533 0 if (!use_default && !op->is_rownum && op->chain_len > 0 && op->chain[0].type == XF_COUNT) {
3 10530 if (!use_default && !op->is_rownum && op->chain_len > 0 && op->chain[0].type == XF_COUNT) {
1208 3 0 if (sv && SvROK(sv)) {
2 1 if (sv && SvROK(sv)) {
1210 1 1 if (SvTYPE(inner) == SVt_PVAV) cnt = (int)av_count((AV *)inner);
1211 1 0 else if (SvTYPE(inner) == SVt_PVHV) cnt = (int)HvUSEDKEYS((HV *)inner);
0 1 else if (SvTYPE(inner) == SVt_PVHV) cnt = (int)HvUSEDKEYS((HV *)inner);
1215 3 0 if (op->chain_len == 1) {
1217 0 3 BUF_ENSURE(clen); memcpy(buf + pos, cbuf, clen); pos += clen;
0 0 BUF_ENSURE(clen); memcpy(buf + pos, cbuf, clen); pos += clen;
1225 10530 1019 if (!use_default && !op->is_rownum && !(op->chain_len > 0 &&
10530 0 if (!use_default && !op->is_rownum && !(op->chain_len > 0 &&
10530 0 if (!use_default && !op->is_rownum && !(op->chain_len > 0 &&
1226 10530 0 (op->chain[0].type == XF_COUNT || op->chain[0].type == XF_COALESCE))) {
10526 4 (op->chain[0].type == XF_COUNT || op->chain[0].type == XF_COALESCE))) {
1228 10526 0 if (op->chain_len > 0 && (op->chain[0].type == XF_INT || op->chain[0].type == XF_INT_COMMA)) {
473 10053 if (op->chain_len > 0 && (op->chain[0].type == XF_INT || op->chain[0].type == XF_INT_COMMA)) {
5 468 if (op->chain_len > 0 && (op->chain[0].type == XF_INT || op->chain[0].type == XF_INT_COMMA)) {
1230 10053 5 int ilen = (op->chain[0].type == XF_INT) ? itoa_fast(ibuf, SvIV_nomg(sv)) : itoa_comma(ibuf, SvIV_nomg(sv));
1231 10058 0 if (op->chain_len == 1) {
1233 0 10058 BUF_ENSURE(ilen); memcpy(buf + pos, ibuf, ilen); pos += ilen;
0 0 BUF_ENSURE(ilen); memcpy(buf + pos, ibuf, ilen); pos += ilen;
1238 468 0 } else if (op->chain_len > 0 && op->chain[0].type == XF_FLOAT) {
3 465 } else if (op->chain_len > 0 && op->chain[0].type == XF_FLOAT) {
1241 0 3 if (flen > 63) flen = 63;
1242 3 0 if (op->chain_len == 1) {
1244 0 3 BUF_ENSURE(flen); memcpy(buf + pos, fbuf, flen); pos += flen;
0 0 BUF_ENSURE(flen); memcpy(buf + pos, fbuf, flen); pos += flen;
1256 469 1019 if (!use_default && !op->is_rownum && op->chain_len > 0 &&
469 0 if (!use_default && !op->is_rownum && op->chain_len > 0 &&
469 0 if (!use_default && !op->is_rownum && op->chain_len > 0 &&
1257 469 0 (op->chain[0].type == XF_INT || op->chain[0].type == XF_INT_COMMA ||
469 0 (op->chain[0].type == XF_INT || op->chain[0].type == XF_INT_COMMA ||
1258 469 0 op->chain[0].type == XF_FLOAT || op->chain[0].type == XF_COUNT ||
469 0 op->chain[0].type == XF_FLOAT || op->chain[0].type == XF_COUNT ||
1259 4 465 op->chain[0].type == XF_COALESCE))
1262 4 1484 if (op->chain_len - start == 0) {
1264 0 4 BUF_ENSURE(slen); memcpy(buf + pos, src, slen); pos += slen;
0 0 BUF_ENSURE(slen); memcpy(buf + pos, src, slen); pos += slen;
1269 1475 9 if (op->chain_len - start == 1) {
1271 3 1472 if (xf->type == XF_DEFAULT) {
1273 0 3 BUF_ENSURE(slen); memcpy(buf + pos, src, slen); pos += slen;
0 0 BUF_ENSURE(slen); memcpy(buf + pos, src, slen); pos += slen;
1278 0 1472 if (tmp) free(tmp);
1289 25 9 for (int i = start; i < op->chain_len; i++) {
1290 2 23 if (op->chain[i].type == XF_DEFAULT) continue;
1292 14 9 for (int k = i + 1; k < op->chain_len; k++)
1293 14 0 if (op->chain[k].type != XF_DEFAULT) { is_last = 0; break; }
1295 9 14 if (is_last) {
1298 0 9 if (dummy) free(dummy);
1300 10 4 if (use_a) {
1313 8 1 if (tmp_a) free(tmp_a);
1314 2 7 if (tmp_b) free(tmp_b);
1320 18 13 if (is_skip_if) { col = t->skip_if_col; key = t->skip_if_key; key_len = t->skip_if_key_len; }
1324 6 25 if (key) {
1325 6 0 if (SvROK(row_sv) && SvTYPE(SvRV(row_sv)) == SVt_PVHV) {
6 0 if (SvROK(row_sv) && SvTYPE(SvRV(row_sv)) == SVt_PVHV) {
1327 6 0 if (sv) field = *sv;
1330 25 0 if (SvROK(row_sv) && SvTYPE(SvRV(row_sv)) == SVt_PVAV) {
25 0 if (SvROK(row_sv) && SvTYPE(SvRV(row_sv)) == SVt_PVAV) {
1333 0 25 SSize_t top = av_top_index(av);
1334 6 19 if (col < 0) col = (int)(top + 1) + col;
1335 25 0 if (col >= 0 && col <= (int)top) field = ary[col];
25 0 if (col >= 0 && col <= (int)top) field = ary[col];
1338 31 0 if (!field || !SvOK(field)) return 0;
2 29 if (!field || !SvOK(field)) return 0;
1341 11 18 if (flen == 0) return 0;
1342 15 3 if (flen == 1 && fstr[0] == '0') return 0;
5 10 if (flen == 1 && fstr[0] == '0') return 0;
1347 18 11525 if (t->has_skip_if && is_field_truthy(aTHX_ row_sv, t, 1)) return 1;
7 11 if (t->has_skip_if && is_field_truthy(aTHX_ row_sv, t, 1)) return 1;
1348 13 11523 if (t->has_skip_unless && !is_field_truthy(aTHX_ row_sv, t, 0)) return 1;
7 6 if (t->has_skip_unless && !is_field_truthy(aTHX_ row_sv, t, 0)) return 1;
1357 10 175 RBUF_INIT(t, t->header_len + t->footer_len + nrows * 300 + 1);
10 0 RBUF_INIT(t, t->header_len + t->footer_len + nrows * 300 + 1);
0 175 RBUF_INIT(t, t->header_len + t->footer_len + nrows * 300 + 1);
1359 0 185 BUF_WRITE(t->header, t->header_len);
0 0 BUF_WRITE(t->header, t->header_len);
1361 11221 185 for (SSize_t i = 0; i < nrows; i++) {
1363 0 11221 if (!rowref) continue;
1364 10 11211 if (should_skip_row(aTHX_ *rowref, t)) continue;
1365 11029 182 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
11012 17 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
0 11012 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
0 0 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
1367 11321 11211 for (int j = 0; j < t->nops; j++) {
1369 87 11234 if (op->static_data)
1370 0 87 BUF_WRITE(op->static_data, op->static_len);
0 0 BUF_WRITE(op->static_data, op->static_len);
1375 0 185 BUF_WRITE(t->footer, t->footer_len);
0 0 BUF_WRITE(t->footer, t->footer_len);
1388 39 0 for (int k = 0; k < sort_nsort; k++) {
1389 5 34 if (sort_numeric) {
1391 5 0 int la = ea->key_lens[k] < 63 ? (int)ea->key_lens[k] : 63;
1392 5 0 int lb = eb->key_lens[k] < 63 ? (int)eb->key_lens[k] : 63;
1396 2 3 if (da < db) return -1;
1397 3 0 if (da > db) return 1;
1401 32 2 if (r) return r;
1402 0 2 if (ea->key_lens[k] != eb->key_lens[k])
1403 0 0 return ea->key_lens[k] < eb->key_lens[k] ? -1 : 1;
1427 13 1 sort_entry *entries = nrows > 0 ? (sort_entry *)malloc(nrows * sizeof(sort_entry)) : NULL;
1428 13 1 if (nrows > 0 && !entries) croak("malloc");
0 13 if (nrows > 0 && !entries) croak("malloc");
1429 13 1 const char **all_keys = nrows > 0 ? (const char **)calloc(nrows * nsort, sizeof(char *)) : NULL;
1430 13 1 STRLEN *all_lens = nrows > 0 ? (STRLEN *)calloc(nrows * nsort, sizeof(STRLEN)) : NULL;
1435 13 1 if (entries) SAVEDESTRUCTOR_X(ts_free, entries);
1436 13 1 if (all_keys) SAVEDESTRUCTOR_X(ts_free, all_keys);
1437 13 1 if (all_lens) SAVEDESTRUCTOR_X(ts_free, all_lens);
1440 13 1 if (nrows > 0 && (!all_keys || !all_lens)) croak("calloc");
13 0 if (nrows > 0 && (!all_keys || !all_lens)) croak("calloc");
0 13 if (nrows > 0 && (!all_keys || !all_lens)) croak("calloc");
1441 39 14 for (SSize_t i = 0; i < nrows; i++) {
1443 39 0 entries[i].sv = rowref ? *rowref : &PL_sv_undef;
1446 45 39 for (int k = 0; k < nsort; k++) {
1448 45 0 if (rowref && SvROK(*rowref)) {
45 0 if (rowref && SvROK(*rowref)) {
1450 21 24 if (sort_keys) {
1451 21 0 if (SvTYPE(SvRV(*rowref)) == SVt_PVHV) {
1453 21 0 if (sv) field = *sv;
1456 24 0 if (SvTYPE(SvRV(*rowref)) == SVt_PVAV) {
1458 24 0 if (sv) field = *sv;
1461 45 0 if (field) entries[i].keys[k] = SvPV(field, entries[i].key_lens[k]);
1468 5 9 int (*cmp)(const void *, const void *) = descending ? sort_cmp_desc : sort_cmp_asc;
1473 2 12 RBUF_INIT(t, t->header_len + t->footer_len + nrows * 300 + 1);
2 0 RBUF_INIT(t, t->header_len + t->footer_len + nrows * 300 + 1);
0 12 RBUF_INIT(t, t->header_len + t->footer_len + nrows * 300 + 1);
1475 0 14 BUF_WRITE(t->header, t->header_len);
0 0 BUF_WRITE(t->header, t->header_len);
1477 39 14 for (SSize_t i = 0; i < nrows; i++) {
1479 1 38 if (should_skip_row(aTHX_ row_sv, t)) continue;
1480 25 13 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
21 4 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
0 21 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
0 0 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
1482 68 38 for (int j = 0; j < t->nops; j++) {
1484 15 53 if (op->static_data) BUF_WRITE(op->static_data, op->static_len);
0 15 if (op->static_data) BUF_WRITE(op->static_data, op->static_len);
0 0 if (op->static_data) BUF_WRITE(op->static_data, op->static_len);
1488 0 14 BUF_WRITE(t->footer, t->footer_len);
0 0 BUF_WRITE(t->footer, t->footer_len);
1496 1 4 if (should_skip_row(aTHX_ row_sv, t))
1500 0 4 RBUF_INIT(t, t->header_len + t->footer_len + 512);
0 0 RBUF_INIT(t, t->header_len + t->footer_len + 512);
0 4 RBUF_INIT(t, t->header_len + t->footer_len + 512);
1501 0 4 BUF_WRITE(t->header, t->header_len);
0 0 BUF_WRITE(t->header, t->header_len);
1502 9 4 for (int j = 0; j < t->nops; j++) {
1504 4 5 if (op->static_data) BUF_WRITE(op->static_data, op->static_len);
0 4 if (op->static_data) BUF_WRITE(op->static_data, op->static_len);
0 0 if (op->static_data) BUF_WRITE(op->static_data, op->static_len);
1507 0 4 BUF_WRITE(t->footer, t->footer_len);
0 0 BUF_WRITE(t->footer, t->footer_len);
1517 0 2 if (!buf) croak("malloc");
1519 0 2 BUF_WRITE(t->header, t->header_len);
0 0 BUF_WRITE(t->header, t->header_len);
1521 203 2 for (SSize_t i = 0; i < nrows; i++) {
1523 0 203 if (!rowref) continue;
1524 0 203 if (should_skip_row(aTHX_ *rowref, t)) continue;
1525 201 2 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
201 0 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
0 201 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
0 0 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
1527 203 203 for (int j = 0; j < t->nops; j++) {
1529 0 203 if (op->static_data) BUF_WRITE(op->static_data, op->static_len);
0 0 if (op->static_data) BUF_WRITE(op->static_data, op->static_len);
0 0 if (op->static_data) BUF_WRITE(op->static_data, op->static_len);
1532 3 200 if (pos > 65536) { PerlIO_write(fh, buf, pos); pos = 0; }
1534 0 2 BUF_WRITE(t->footer, t->footer_len);
0 0 BUF_WRITE(t->footer, t->footer_len);
1535 2 0 if (pos) PerlIO_write(fh, buf, pos);
1544 3 5 if (use_fh) {
1547 0 3 if (!buf) croak("malloc");
1549 0 5 RBUF_INIT(t, 4096);
0 0 RBUF_INIT(t, 4096);
0 5 RBUF_INIT(t, 4096);
1553 0 8 BUF_WRITE(t->header, t->header_len);
0 0 BUF_WRITE(t->header, t->header_len);
1561 0 83 PUSHMARK(SP);
1565 83 0 if (SvTRUE(ERRSV)) {
2 81 if (SvTRUE(ERRSV)) {
1569 2 0 SV *err = newSVsv(ERRSV);
1570 2 0 PUTBACK; FREETMPS; LEAVE;
1575 81 0 if (count > 0) row_sv = POPs;
1576 81 0 if (!row_sv || !SvOK(row_sv) || !SvROK(row_sv)) {
75 6 if (!row_sv || !SvOK(row_sv) || !SvROK(row_sv)) {
0 75 if (!row_sv || !SvOK(row_sv) || !SvROK(row_sv)) {
1577 6 0 PUTBACK; FREETMPS; LEAVE;
1581 75 0 PUTBACK; FREETMPS; LEAVE;
1583 73 2 if (!should_skip_row(aTHX_ row_sv, t)) {
1584 67 6 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
5 62 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
0 5 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
0 0 if (!first && t->sep_len) BUF_WRITE(t->sep, t->sep_len);
1586 209 73 for (int j = 0; j < t->nops; j++) {
1588 133 76 if (op->static_data) BUF_WRITE(op->static_data, op->static_len);
3 130 if (op->static_data) BUF_WRITE(op->static_data, op->static_len);
0 3 if (op->static_data) BUF_WRITE(op->static_data, op->static_len);
1591 5 68 if (use_fh && pos > 65536) { PerlIO_write(fh, buf, pos); pos = 0; }
0 5 if (use_fh && pos > 65536) { PerlIO_write(fh, buf, pos); pos = 0; }
1598 0 6 BUF_WRITE(t->footer, t->footer_len);
0 0 BUF_WRITE(t->footer, t->footer_len);
1600 2 4 if (use_fh) {
1601 2 0 if (pos) PerlIO_write(fh, buf, pos);
1613 6 2 for (int i = 0; i < t->nops; i++) {
1615 4 2 if (op->chain && !op->is_rownum) {
4 0 if (op->chain && !op->is_rownum) {
1616 2 2 if (op->key)
1641 2 204 if (items == 2 && SvPOK(ST(1))) {
2 0 if (items == 2 && SvPOK(ST(1))) {
1644 0 204 if (items % 2 == 0) croak("Odd number of arguments");
1645 270 204 for (int i = 1; i < items; i += 2) {
1648 10 260 if (strcmp(key, "header") == 0) header = SvPV(val, hlen);
1649 204 56 else if (strcmp(key, "row") == 0) row = SvPV(val, rlen);
1650 10 46 else if (strcmp(key, "footer") == 0) footer = SvPV(val, flen);
1651 30 16 else if (strcmp(key, "separator") == 0) sep = SvPV(val, slen);
1652 5 11 else if (strcmp(key, "escape_char") == 0) { STRLEN el; const char *ev = SvPV(val, el); if (el) esc = ev[0]; }
5 0 else if (strcmp(key, "escape_char") == 0) { STRLEN el; const char *ev = SvPV(val, el); if (el) esc = ev[0]; }
1653 7 4 else if (strcmp(key, "skip_if") == 0) skip_if_sv = val;
1654 4 0 else if (strcmp(key, "skip_unless") == 0) skip_unless_sv = val;
1658 7 197 if (skip_if_sv) {
1660 1 6 if (SvIOK(skip_if_sv) || looks_like_number(skip_if_sv)) {
0 1 if (SvIOK(skip_if_sv) || looks_like_number(skip_if_sv)) {
1671 4 200 if (skip_unless_sv) {
1673 1 3 if (SvIOK(skip_unless_sv) || looks_like_number(skip_unless_sv)) {
0 1 if (SvIOK(skip_unless_sv) || looks_like_number(skip_unless_sv)) {
1713 5 9 if (items > 3 && SvROK(ST(3)) && SvTYPE(SvRV(ST(3))) == SVt_PVHV) {
5 0 if (items > 3 && SvROK(ST(3)) && SvTYPE(SvRV(ST(3))) == SVt_PVHV) {
5 0 if (items > 3 && SvROK(ST(3)) && SvTYPE(SvRV(ST(3))) == SVt_PVHV) {
1717 4 1 if (sv && SvTRUE(*sv)) descending = 1;
4 0 if (sv && SvTRUE(*sv)) descending = 1;
1719 2 3 if (sv && SvTRUE(*sv)) numeric = 1;
2 0 if (sv && SvTRUE(*sv)) numeric = 1;
1721 3 11 if (SvROK(sort_by) && SvTYPE(SvRV(sort_by)) == SVt_PVAV) {
3 0 if (SvROK(sort_by) && SvTYPE(SvRV(sort_by)) == SVt_PVAV) {
1724 0 3 if (nsort == 0) {
1728 3 0 int use_keys = first && !SvIOK(*first) && !looks_like_number(*first);
2 1 int use_keys = first && !SvIOK(*first) && !looks_like_number(*first);
2 0 int use_keys = first && !SvIOK(*first) && !looks_like_number(*first);
1729 2 1 if (use_keys) {
1732 3 2 for (int i = 0; i < nsort; i++) {
1734 3 0 skeys[i] = el ? SvPV(*el, sklens[i]) : "";
1735 0 3 if (!el) sklens[i] = 0;
1741 2 1 for (int i = 0; i < nsort; i++) {
1743 2 0 scols[i] = el ? (int)SvIV(*el) : 0;
1749 4 7 } else if (SvIOK(sort_by) || looks_like_number(sort_by)) {
0 4 } else if (SvIOK(sort_by) || looks_like_number(sort_by)) {
1755 4 0 if (klen > 1 && key[0] == '-') { key++; klen--; descending = 1; }
1 3 if (klen > 1 && key[0] == '-') { key++; klen--; descending = 1; }
1792 8 0 if (!SvROK(cb) || SvTYPE(SvRV(cb)) != SVt_PVCV)
0 8 if (!SvROK(cb) || SvTYPE(SvRV(cb)) != SVt_PVCV)
1795 3 5 if (items > 2) {
1820 0 2 RETVAL = (IV)t->last_row_count;
1831 0 2 if (items % 2 == 0) croak("Odd number of arguments");
1834 2 2 for (int i = 1; i < items; i += 2) {
1837 2 0 if (strcmp(key, "row") == 0) row = SvPV(val, rlen);
1838 0 0 else if (strcmp(key, "separator") == 0) sep = SvPV(val, slen);
1840 0 2 if (!row) croak("clone requires 'row' argument");
1841 2 0 tpl_compiled *t = tpl_compile(aTHX_
1846 2 0 orig->escape_char);
1850 0 2 if (orig->skip_if_key) {
1857 0 2 if (orig->skip_unless_key) {