Branch Coverage
| src/mds_render_html.c |
|
| Criterion |
Covered |
Total |
% |
| branch |
668 |
996 |
67.0
|
| line |
true |
false |
branch |
|
132
|
0 |
100 |
if (n == 0) return; |
|
133
|
73 |
27 |
if (st->alt_len + n + 1 > st->alt_cap) { |
|
134
|
0 |
73 |
size_t nc = st->alt_cap ? st->alt_cap * 2 : 64; |
|
135
|
0 |
73 |
while (nc < st->alt_len + n + 1) nc *= 2; |
|
148
|
5561 |
0 |
if (st->top < CLOSE_STACK_MAX) st->closes[st->top++] = k; |
|
151
|
5561 |
0 |
return st->top > 0 ? st->closes[--st->top] : CLOSE_NONE; |
|
178
|
14628 |
5845 |
while ((size_t)(end - p) >= 8) { |
|
182
|
14484 |
144 |
if (MDS_LIKELY(!mds_escape_hot64(w))) { p += 8; continue; } |
|
185
|
1152 |
144 |
for (k = 0; k < 8; k++) { |
|
187
|
959 |
193 |
if (!e.rlen) continue; |
|
188
|
120 |
73 |
if (p + k > run) mds_buf_write(aTHX_ b, run, (size_t)((p + k) - run)); |
|
|
0 |
120 |
if (p + k > run) mds_buf_write(aTHX_ b, run, (size_t)((p + k) - run)); |
|
189
|
0 |
193 |
mds_buf_write(aTHX_ b, e.rep, e.rlen); |
|
195
|
16329 |
5845 |
for (; p < end; p++) { |
|
197
|
16087 |
242 |
if (!e.rlen) continue; |
|
198
|
119 |
123 |
if (p > run) mds_buf_write(aTHX_ b, run, (size_t)(p - run)); |
|
|
0 |
119 |
if (p > run) mds_buf_write(aTHX_ b, run, (size_t)(p - run)); |
|
199
|
0 |
242 |
mds_buf_write(aTHX_ b, e.rep, e.rlen); |
|
202
|
5701 |
144 |
if (run < end) mds_buf_write(aTHX_ b, run, (size_t)(end - run)); |
|
|
9 |
5692 |
if (run < end) mds_buf_write(aTHX_ b, run, (size_t)(end - run)); |
|
221
|
984 |
157 |
while (i < n) { |
|
222
|
15 |
969 |
if (s[i] == '\\' && i + 1 < n) { |
|
|
15 |
0 |
if (s[i] == '\\' && i + 1 < n) { |
|
224
|
15 |
0 |
if ((nx >= 0x21 && nx <= 0x2F) || |
|
|
3 |
12 |
if ((nx >= 0x21 && nx <= 0x2F) || |
|
225
|
3 |
0 |
(nx >= 0x3A && nx <= 0x40) || |
|
|
3 |
0 |
(nx >= 0x3A && nx <= 0x40) || |
|
226
|
3 |
0 |
(nx >= 0x5B && nx <= 0x60) || |
|
|
3 |
0 |
(nx >= 0x5B && nx <= 0x60) || |
|
227
|
0 |
3 |
(nx >= 0x7B && nx <= 0x7E)) { |
|
|
0 |
0 |
(nx >= 0x7B && nx <= 0x7E)) { |
|
229
|
6 |
6 |
if (e.rlen) mds_buf_write(aTHX_ b, e.rep, e.rlen); |
|
|
0 |
6 |
if (e.rlen) mds_buf_write(aTHX_ b, e.rep, e.rlen); |
|
235
|
30 |
942 |
if (s[i] == '&') { |
|
237
|
21 |
9 |
if (k) { |
|
240
|
39 |
21 |
for (z = 0; z < elen; z++) { |
|
242
|
3 |
36 |
if (e.rlen) mds_buf_write(aTHX_ b, e.rep, e.rlen); |
|
|
0 |
3 |
if (e.rlen) mds_buf_write(aTHX_ b, e.rep, e.rlen); |
|
243
|
0 |
36 |
else mds_buf_write(aTHX_ b, ebuf + z, 1); |
|
250
|
15 |
936 |
if (e.rlen) mds_buf_write(aTHX_ b, e.rep, e.rlen); |
|
|
0 |
15 |
if (e.rlen) mds_buf_write(aTHX_ b, e.rep, e.rlen); |
|
251
|
0 |
936 |
else mds_buf_write(aTHX_ b, s + i, 1); |
|
271
|
51 |
0 |
if (i >= n || s[i] != '&') return 0; |
|
|
0 |
51 |
if (i >= n || s[i] != '&') return 0; |
|
273
|
51 |
0 |
if (q < n && s[q] == '#') { |
|
|
0 |
51 |
if (q < n && s[q] == '#') { |
|
277
|
0 |
0 |
if (q < n && (s[q] == 'x' || s[q] == 'X')) { |
|
|
0 |
0 |
if (q < n && (s[q] == 'x' || s[q] == 'X')) { |
|
|
0 |
0 |
if (q < n && (s[q] == 'x' || s[q] == 'X')) { |
|
279
|
0 |
0 |
while (q < n && digits < 6 && isxdigit((unsigned char)s[q])) { |
|
|
0 |
0 |
while (q < n && digits < 6 && isxdigit((unsigned char)s[q])) { |
|
|
0 |
0 |
while (q < n && digits < 6 && isxdigit((unsigned char)s[q])) { |
|
281
|
0 |
0 |
cp = cp * 16 + (c <= '9' ? c - '0' : |
|
|
0 |
0 |
cp = cp * 16 + (c <= '9' ? c - '0' : |
|
286
|
0 |
0 |
while (q < n && digits < 7 && s[q] >= '0' && s[q] <= '9') { |
|
|
0 |
0 |
while (q < n && digits < 7 && s[q] >= '0' && s[q] <= '9') { |
|
|
0 |
0 |
while (q < n && digits < 7 && s[q] >= '0' && s[q] <= '9') { |
|
|
0 |
0 |
while (q < n && digits < 7 && s[q] >= '0' && s[q] <= '9') { |
|
291
|
0 |
0 |
if (!digits || q >= n || s[q] != ';') return 0; |
|
|
0 |
0 |
if (!digits || q >= n || s[q] != ';') return 0; |
|
|
0 |
0 |
if (!digits || q >= n || s[q] != ';') return 0; |
|
293
|
0 |
0 |
if (cp == 0 || cp > 0x10FFFF || (cp >= 0xD800 && cp <= 0xDFFF)) |
|
|
0 |
0 |
if (cp == 0 || cp > 0x10FFFF || (cp >= 0xD800 && cp <= 0xDFFF)) |
|
|
0 |
0 |
if (cp == 0 || cp > 0x10FFFF || (cp >= 0xD800 && cp <= 0xDFFF)) |
|
|
0 |
0 |
if (cp == 0 || cp > 0x10FFFF || (cp >= 0xD800 && cp <= 0xDFFF)) |
|
295
|
0 |
0 |
if (cp < 0x80) { |
|
297
|
0 |
0 |
} else if (cp < 0x800) { |
|
300
|
0 |
0 |
} else if (cp < 0x10000) { |
|
314
|
219 |
3 |
while (q < n && isalnum((unsigned char)s[q])) q++; |
|
|
171 |
48 |
while (q < n && isalnum((unsigned char)s[q])) q++; |
|
315
|
42 |
9 |
if (q == name_start || q >= n || s[q] != ';') return 0; |
|
|
39 |
3 |
if (q == name_start || q >= n || s[q] != ';') return 0; |
|
|
3 |
36 |
if (q == name_start || q >= n || s[q] != ';') return 0; |
|
317
|
0 |
36 |
if (!e) return 0; |
|
318
|
0 |
36 |
if (e->ulen > 8) return 0; |
|
336
|
455 |
15 |
while (i < n && (unsigned char)s[i] <= 0x20) i++; |
|
|
0 |
455 |
while (i < n && (unsigned char)s[i] <= 0x20) i++; |
|
339
|
1190 |
59 |
while (j < n) { |
|
341
|
80 |
1110 |
if (c == ':') break; |
|
342
|
370 |
740 |
if (!isalnum((unsigned char)c) && c != '+' && c != '-' && c != '.') return 0; |
|
|
361 |
9 |
if (!isalnum((unsigned char)c) && c != '+' && c != '-' && c != '.') return 0; |
|
|
355 |
6 |
if (!isalnum((unsigned char)c) && c != '+' && c != '-' && c != '.') return 0; |
|
|
331 |
24 |
if (!isalnum((unsigned char)c) && c != '+' && c != '-' && c != '.') return 0; |
|
345
|
80 |
59 |
if (j >= n || j == i) return 0; |
|
|
0 |
80 |
if (j >= n || j == i) return 0; |
|
349
|
1 |
79 |
if (SCHEME_EQ("javascript") || SCHEME_EQ("vbscript") || SCHEME_EQ("file")) |
|
|
0 |
1 |
if (SCHEME_EQ("javascript") || SCHEME_EQ("vbscript") || SCHEME_EQ("file")) |
|
|
1 |
78 |
if (SCHEME_EQ("javascript") || SCHEME_EQ("vbscript") || SCHEME_EQ("file")) |
|
|
0 |
1 |
if (SCHEME_EQ("javascript") || SCHEME_EQ("vbscript") || SCHEME_EQ("file")) |
|
|
27 |
51 |
if (SCHEME_EQ("javascript") || SCHEME_EQ("vbscript") || SCHEME_EQ("file")) |
|
|
0 |
27 |
if (SCHEME_EQ("javascript") || SCHEME_EQ("vbscript") || SCHEME_EQ("file")) |
|
351
|
27 |
51 |
if (SCHEME_EQ("data")) { |
|
|
1 |
26 |
if (SCHEME_EQ("data")) { |
|
352
|
1 |
0 |
if (!for_image) return 1; |
|
356
|
0 |
0 |
if (rem < 6 || strncasecmp(p, "image/", 6) != 0) return 1; |
|
|
0 |
0 |
if (rem < 6 || strncasecmp(p, "image/", 6) != 0) return 1; |
|
358
|
0 |
0 |
if ((rem >= 3 && strncasecmp(p, "gif", 3) == 0) || |
|
|
0 |
0 |
if ((rem >= 3 && strncasecmp(p, "gif", 3) == 0) || |
|
|
0 |
0 |
if ((rem >= 3 && strncasecmp(p, "gif", 3) == 0) || |
|
359
|
0 |
0 |
(rem >= 3 && strncasecmp(p, "png", 3) == 0) || |
|
|
0 |
0 |
(rem >= 3 && strncasecmp(p, "png", 3) == 0) || |
|
360
|
0 |
0 |
(rem >= 4 && strncasecmp(p, "jpeg", 4) == 0) || |
|
|
0 |
0 |
(rem >= 4 && strncasecmp(p, "jpeg", 4) == 0) || |
|
361
|
0 |
0 |
(rem >= 4 && strncasecmp(p, "webp", 4) == 0)) |
|
380
|
0 |
5561 |
if (st->fn_skip && t != MDS_BLK_FOOTNOTE_DEF && t != MDS_BLK_FOOTNOTES_SECTION) { |
|
|
0 |
0 |
if (st->fn_skip && t != MDS_BLK_FOOTNOTE_DEF && t != MDS_BLK_FOOTNOTES_SECTION) { |
|
|
0 |
0 |
if (st->fn_skip && t != MDS_BLK_FOOTNOTE_DEF && t != MDS_BLK_FOOTNOTES_SECTION) { |
|
389
|
573 |
4988 |
if (st->li_first_block) { |
|
393
|
525 |
48 |
st->tight_top > 0 && |
|
|
525 |
0 |
st->tight_top > 0 && |
|
394
|
390 |
135 |
st->tight_stack[st->tight_top - 1]); |
|
395
|
183 |
390 |
if (!tight_para) MDS_BUF_LIT(b, "\n"); |
|
396
|
53 |
4935 |
} else if (st->need_nl_next) { |
|
397
|
0 |
53 |
st->need_nl_next = 0; |
|
406
|
699 |
2181 |
int suppress = (st->tight_top > 0 && |
|
407
|
393 |
306 |
st->tight_stack[st->tight_top - 1]); |
|
408
|
393 |
2487 |
if (suppress) { |
|
420
|
0 |
216 |
if (lvl < 1) lvl = 1; else if (lvl > 6) lvl = 6; |
|
|
0 |
216 |
if (lvl < 1) lvl = 1; else if (lvl > 6) lvl = 6; |
|
425
|
0 |
216 |
open[4] = 0; |
|
430
|
0 |
104 |
case MDS_BLK_THEMATIC_BREAK: |
|
443
|
109 |
108 |
while (lang_len < il && info[lang_len] != ' ' && info[lang_len] != '\t') |
|
|
103 |
6 |
while (lang_len < il && info[lang_len] != ' ' && info[lang_len] != '\t') |
|
|
103 |
0 |
while (lang_len < il && info[lang_len] != ' ' && info[lang_len] != '\t') |
|
445
|
19 |
95 |
if (lang_len > 0) { |
|
455
|
0 |
170 |
case MDS_BLK_CODE_INDENTED: |
|
459
|
3 |
173 |
case MDS_BLK_QUOTE: |
|
461
|
176 |
0 |
if (st->tight_top < CLOSE_STACK_MAX) |
|
467
|
276 |
101 |
if (tight) st->tight_depth++; |
|
468
|
377 |
0 |
if (st->tight_top < CLOSE_STACK_MAX) |
|
469
|
276 |
101 |
st->tight_stack[st->tight_top++] = (unsigned char)(tight ? 1 : 0); |
|
470
|
97 |
280 |
if (d->u.list.is_ordered) { |
|
471
|
28 |
69 |
if (d->u.list.start != 1) { |
|
475
|
28 |
0 |
if (n > 0) mds_buf_write(aTHX_ b, buf, (size_t)n); |
|
|
0 |
28 |
if (n > 0) mds_buf_write(aTHX_ b, buf, (size_t)n); |
|
479
|
55 |
42 |
push_close(st, tight ? CLOSE_OL_TIGHT : CLOSE_OL); |
|
482
|
221 |
59 |
push_close(st, tight ? CLOSE_UL_TIGHT : CLOSE_UL); |
|
486
|
0 |
591 |
case MDS_BLK_LIST_ITEM: |
|
493
|
0 |
68 |
case MDS_BLK_TABLE: |
|
499
|
0 |
68 |
case MDS_BLK_TABLE_HEAD: |
|
504
|
0 |
56 |
case MDS_BLK_TABLE_BODY: |
|
509
|
0 |
164 |
case MDS_BLK_TABLE_ROW: |
|
515
|
350 |
0 |
mds_align al = (st->tbl_col < st->tbl_ncols && st->tbl_aligns) |
|
516
|
350 |
0 |
? st->tbl_aligns[st->tbl_col] : MDS_ALIGN_NONE; |
|
517
|
308 |
42 |
if (MDS_LIKELY(al == MDS_ALIGN_NONE)) { |
|
520
|
120 |
188 |
if (st->in_thead) MDS_BUF_LIT(b, " | ");
|
|
523
|
21 |
21 |
const char* tag = st->in_thead ? "th" : "td"; |
|
524
|
0 |
42 |
const char* aname = al == MDS_ALIGN_LEFT ? "left" |
|
525
|
28 |
14 |
: al == MDS_ALIGN_RIGHT ? "right" : "center"; |
|
|
14 |
14 |
: al == MDS_ALIGN_RIGHT ? "right" : "center"; |
|
529
|
0 |
42 |
mds_buf_write(aTHX_ b, aname, strlen(aname)); |
|
533
|
141 |
209 |
push_close(st, st->in_thead ? CLOSE_TH : CLOSE_TD); |
|
539
|
3 |
6 |
case MDS_BLK_FOOTNOTES_SECTION: |
|
547
|
0 |
18 |
if (!idx) { |
|
555
|
0 |
18 |
st->fn_in_def_label_len = ll; |
|
573
|
0 |
5561 |
if (st->fn_skip) { |
|
575
|
0 |
0 |
if (k == CLOSE_FN_DEF_SKIP) { |
|
581
|
0 |
5561 |
if (st->li_check_pending == 2) { |
|
590
|
3 |
2484 |
case CLOSE_P: MDS_BUF_LIT(b, "\n"); break; |
|
591
|
0 |
93 |
case CLOSE_H1: MDS_BUF_LIT(b, "\n"); break; |
|
592
|
0 |
78 |
case CLOSE_H2: MDS_BUF_LIT(b, "\n"); break; |
|
593
|
0 |
30 |
case CLOSE_H3: MDS_BUF_LIT(b, "\n"); break; |
|
594
|
0 |
4 |
case CLOSE_H4: MDS_BUF_LIT(b, "\n"); break; |
|
595
|
0 |
7 |
case CLOSE_H5: MDS_BUF_LIT(b, "\n"); break; |
|
596
|
0 |
4 |
case CLOSE_H6: MDS_BUF_LIT(b, "\n"); break; |
|
597
|
3 |
111 |
case CLOSE_CODE_FENCED: MDS_BUF_LIT(b, "\n"); break; |
|
598
|
0 |
170 |
case CLOSE_CODE_INDENTED: MDS_BUF_LIT(b, "\n"); break; |
|
599
|
6 |
170 |
case CLOSE_BLOCKQUOTE: MDS_BUF_LIT(b, "\n"); |
|
600
|
176 |
0 |
if (st->tight_top > 0) st->tight_top--; break; |
|
601
|
0 |
42 |
case CLOSE_OL: MDS_BUF_LIT(b, "\n"); |
|
602
|
42 |
0 |
if (st->tight_top > 0) st->tight_top--; break; |
|
603
|
0 |
59 |
case CLOSE_UL: MDS_BUF_LIT(b, "\n"); |
|
604
|
59 |
0 |
if (st->tight_top > 0) st->tight_top--; break; |
|
605
|
0 |
55 |
case CLOSE_OL_TIGHT: MDS_BUF_LIT(b, "\n"); st->tight_depth--; |
|
606
|
55 |
0 |
if (st->tight_top > 0) st->tight_top--; break; |
|
607
|
0 |
221 |
case CLOSE_UL_TIGHT: MDS_BUF_LIT(b, "\n"); st->tight_depth--; |
|
608
|
221 |
0 |
if (st->tight_top > 0) st->tight_top--; break; |
|
609
|
0 |
591 |
case CLOSE_LI: st->need_nl_next = 0; st->li_first_block = 0; |
|
612
|
3 |
65 |
case CLOSE_TABLE: MDS_BUF_LIT(b, " |
\n"); break;
|
613
|
0 |
68 |
case CLOSE_THEAD: MDS_BUF_LIT(b, "\n"); break; |
|
614
|
4 |
52 |
case CLOSE_TBODY: MDS_BUF_LIT(b, "\n"); break; |
|
615
|
4 |
160 |
case CLOSE_TR: MDS_BUF_LIT(b, " |
\n"); break;
|
616
|
0 |
141 |
case CLOSE_TH: MDS_BUF_LIT(b, "\n"); break; |
|
617
|
7 |
202 |
case CLOSE_TD: MDS_BUF_LIT(b, " | \n"); break;
|
618
|
0 |
9 |
case CLOSE_FN_SECTION: MDS_BUF_LIT(b, "\n\n"); break; |
|
637
|
18 |
0 |
uses = (idx >= 1 && idx <= st->fn_count) ? st->fn_uses[idx - 1] : 1; |
|
|
18 |
0 |
uses = (idx >= 1 && idx <= st->fn_count) ? st->fn_uses[idx - 1] : 1; |
|
639
|
18 |
0 |
if (b->cur - b->base >= 5 && memcmp(b->cur - 5, "\n", 5) == 0) { |
|
|
15 |
3 |
if (b->cur - b->base >= 5 && memcmp(b->cur - 5, "\n", 5) == 0) { |
|
643
|
24 |
18 |
for (u = 1; u <= uses; u++) { |
|
649
|
3 |
21 |
if (inject_in_p || u > 1) MDS_BUF_LIT(b, " "); |
|
|
0 |
3 |
if (inject_in_p || u > 1) MDS_BUF_LIT(b, " "); |
|
652
|
6 |
18 |
if (u > 1) { |
|
654
|
6 |
0 |
if (nn > 0) mds_buf_write(aTHX_ b, nbuf, (size_t)nn); |
|
|
0 |
6 |
if (nn > 0) mds_buf_write(aTHX_ b, nbuf, (size_t)nn); |
|
657
|
18 |
6 |
if (u == 1) in = snprintf(ibuf, sizeof ibuf, "%u", idx); |
|
659
|
24 |
0 |
if (in > 0) mds_buf_write(aTHX_ b, ibuf, (size_t)in); |
|
|
0 |
24 |
if (in > 0) mds_buf_write(aTHX_ b, ibuf, (size_t)in); |
|
661
|
24 |
0 |
if (in > 0) mds_buf_write(aTHX_ b, ibuf, (size_t)in); |
|
|
0 |
24 |
if (in > 0) mds_buf_write(aTHX_ b, ibuf, (size_t)in); |
|
663
|
6 |
18 |
if (u > 1) { |
|
666
|
6 |
0 |
if (nn > 0) mds_buf_write(aTHX_ b, nbuf, (size_t)nn); |
|
|
0 |
6 |
if (nn > 0) mds_buf_write(aTHX_ b, nbuf, (size_t)nn); |
|
671
|
15 |
3 |
if (inject_in_p) { |
|
699
|
1020 |
90 |
for (i = 0; i < n; i++) { |
|
701
|
894 |
24 |
int safe = (c >= '0' && c <= '9') || |
|
702
|
834 |
162 |
(c >= 'A' && c <= 'Z') || |
|
|
834 |
0 |
(c >= 'A' && c <= 'Z') || |
|
703
|
834 |
162 |
(c >= 'a' && c <= 'z') || |
|
|
0 |
834 |
(c >= 'a' && c <= 'z') || |
|
704
|
150 |
12 |
c == '(' || c == ')' || c == '!' || c == '*' || |
|
|
138 |
12 |
c == '(' || c == ')' || c == '!' || c == '*' || |
|
|
138 |
0 |
c == '(' || c == ')' || c == '!' || c == '*' || |
|
|
138 |
0 |
c == '(' || c == ')' || c == '!' || c == '*' || |
|
705
|
918 |
102 |
c == '-' || c == '.' || c == '_' || c == '~' || |
|
|
84 |
54 |
c == '-' || c == '.' || c == '_' || c == '~' || |
|
|
84 |
0 |
c == '-' || c == '.' || c == '_' || c == '~' || |
|
|
84 |
0 |
c == '-' || c == '.' || c == '_' || c == '~' || |
|
|
84 |
0 |
c == '-' || c == '.' || c == '_' || c == '~' || |
|
706
|
12 |
72 |
c == '/'; |
|
707
|
948 |
72 |
if (safe) { |
|
710
|
0 |
72 |
char esc[3] = { '%', hex[c >> 4], hex[c & 0xF] }; |
|
720
|
60 |
18 |
for (i = 0; i < st->fn_count; i++) { |
|
721
|
24 |
36 |
if (st->fn_label_lens[i] == n && |
|
722
|
24 |
0 |
memcmp(st->fn_labels[i], s, n) == 0) { |
|
732
|
6 |
18 |
if (idx) { |
|
736
|
9 |
9 |
if (st->fn_count == st->fn_cap) { |
|
737
|
0 |
9 |
size_t nc = st->fn_cap ? st->fn_cap * 2 : 8; |
|
752
|
1995 |
8176 |
return isalnum(c) || c == '_'; |
|
|
15 |
1980 |
return isalnum(c) || c == '_'; |
|
774
|
1459 |
68 |
while (q < end) { |
|
776
|
176 |
1283 |
if (c == '.') { |
|
777
|
164 |
12 |
if (q == p || q[-1] == '.') break; |
|
|
164 |
0 |
if (q == p || q[-1] == '.') break; |
|
781
|
90 |
1193 |
if (isalnum(c) || c == '-' || c == '_' || c >= 0x80) { q++; continue; } |
|
|
90 |
0 |
if (isalnum(c) || c == '-' || c == '_' || c >= 0x80) { q++; continue; } |
|
|
81 |
9 |
if (isalnum(c) || c == '-' || c == '_' || c >= 0x80) { q++; continue; } |
|
|
24 |
57 |
if (isalnum(c) || c == '-' || c == '_' || c >= 0x80) { q++; continue; } |
|
784
|
12 |
125 |
if (q == p) return 0; |
|
785
|
84 |
41 |
if (need_dot && dots == 0) return 0; |
|
|
0 |
84 |
if (need_dot && dots == 0) return 0; |
|
789
|
125 |
0 |
if (check_end > p && check_end[-1] == '.') { |
|
|
9 |
116 |
if (check_end > p && check_end[-1] == '.') { |
|
792
|
9 |
0 |
if (last_dot == check_end) { |
|
795
|
0 |
63 |
for (r = p; r < last_dot; r++) if (*r == '.') prev_dot = r; |
|
|
63 |
9 |
for (r = p; r < last_dot; r++) if (*r == '.') prev_dot = r; |
|
798
|
122 |
3 |
if (last_dot) { |
|
802
|
3 |
345 |
for (r = l_s; r < l_e; r++) if (*r == '_') return 0; |
|
|
348 |
119 |
for (r = l_s; r < l_e; r++) if (*r == '_') return 0; |
|
803
|
21 |
98 |
m_s = prev_dot ? prev_dot + 1 : p; |
|
805
|
3 |
725 |
for (r = m_s; r < m_e; r++) if (*r == '_') return 0; |
|
|
728 |
116 |
for (r = m_s; r < m_e; r++) if (*r == '_') return 0; |
|
808
|
0 |
21 |
for (r = p; r < check_end; r++) if (*r == '_') return 0; |
|
|
21 |
3 |
for (r = p; r < check_end; r++) if (*r == '_') return 0; |
|
819
|
152 |
0 |
while (q > p) { |
|
821
|
152 |
0 |
if (c == '?' || c == '!' || c == '.' || c == ',' || |
|
|
152 |
0 |
if (c == '?' || c == '!' || c == '.' || c == ',' || |
|
|
134 |
18 |
if (c == '?' || c == '!' || c == '.' || c == ',' || |
|
|
134 |
0 |
if (c == '?' || c == '!' || c == '.' || c == ',' || |
|
|
134 |
0 |
if (c == '?' || c == '!' || c == '.' || c == ',' || |
|
822
|
134 |
0 |
c == ':' || c == '*' || c == '_' || c == '~' || |
|
|
134 |
0 |
c == ':' || c == '*' || c == '_' || c == '~' || |
|
|
134 |
0 |
c == ':' || c == '*' || c == '_' || c == '~' || |
|
|
131 |
3 |
c == ':' || c == '*' || c == '_' || c == '~' || |
|
823
|
3 |
128 |
c == '\'' || c == '"') { |
|
826
|
3 |
125 |
if (c == ')') { |
|
829
|
45 |
3 |
for (r = p; r < q; r++) { |
|
830
|
0 |
45 |
if (*r == '(') opens++; |
|
831
|
3 |
42 |
else if (*r == ')') closes++; |
|
833
|
3 |
0 |
if (closes > opens) { q--; continue; } |
|
836
|
0 |
125 |
if (c == ';') { |
|
838
|
0 |
0 |
while (r > p && isalnum((unsigned char)*r)) r--; |
|
|
0 |
0 |
while (r > p && isalnum((unsigned char)*r)) r--; |
|
839
|
0 |
0 |
if (r > p && *r == '&') { q = r; continue; } |
|
|
0 |
0 |
if (r > p && *r == '&') { q = r; continue; } |
|
853
|
0 |
41 |
if (!dl) return 0; |
|
856
|
57 |
32 |
while (q < end) { |
|
858
|
48 |
9 |
if (c <= 0x20 || c == '<') break; |
|
|
48 |
0 |
if (c <= 0x20 || c == '<') break; |
|
878
|
480 |
72 |
while (L > base) { |
|
880
|
24 |
456 |
if (isalnum(c) || c == '.' || c == '_' || c == '+' || c == '-') L--; |
|
|
9 |
15 |
if (isalnum(c) || c == '.' || c == '_' || c == '+' || c == '-') L--; |
|
|
6 |
3 |
if (isalnum(c) || c == '.' || c == '_' || c == '+' || c == '-') L--; |
|
|
3 |
3 |
if (isalnum(c) || c == '.' || c == '_' || c == '+' || c == '-') L--; |
|
|
3 |
0 |
if (isalnum(c) || c == '.' || c == '_' || c == '+' || c == '-') L--; |
|
883
|
0 |
72 |
if (L == at) return 0; |
|
884
|
0 |
72 |
if (*L == '.') return 0; /* can't start with dot */ |
|
888
|
12 |
60 |
if (!dl) return 0; |
|
892
|
0 |
60 |
if (!dl) return 0; |
|
910
|
13532 |
1415 |
if (st->pending_len == 0) return; |
|
922
|
11586 |
1415 |
while (p < end) { |
|
932
|
10171 |
1415 |
boundary = (p == s) ? 1 : !gfm_word_byte((unsigned char)p[-1]); |
|
|
1980 |
8191 |
boundary = (p == s) ? 1 : !gfm_word_byte((unsigned char)p[-1]); |
|
933
|
8191 |
3395 |
if (!boundary) { p++; continue; } |
|
937
|
122 |
3273 |
if (c == 'h' && (size_t)(end - p) >= 7 && |
|
|
81 |
41 |
if (c == 'h' && (size_t)(end - p) >= 7 && |
|
938
|
35 |
46 |
memcmp(p, "http://", 7) == 0) { |
|
941
|
87 |
3273 |
} else if (c == 'h' && (size_t)(end - p) >= 8 && |
|
|
40 |
47 |
} else if (c == 'h' && (size_t)(end - p) >= 8 && |
|
942
|
6 |
34 |
memcmp(p, "https://", 8) == 0) { |
|
945
|
41 |
3313 |
} else if (c == 'f' && (size_t)(end - p) >= 6 && |
|
|
16 |
25 |
} else if (c == 'f' && (size_t)(end - p) >= 6 && |
|
946
|
0 |
16 |
memcmp(p, "ftp://", 6) == 0) { |
|
949
|
38 |
3316 |
} else if (c == 'w' && (size_t)(end - p) >= 4 && |
|
|
38 |
0 |
} else if (c == 'w' && (size_t)(end - p) >= 4 && |
|
950
|
24 |
14 |
memcmp(p, "www.", 4) == 0) { |
|
954
|
18 |
6 |
if (dl) { |
|
957
|
24 |
15 |
while (qq < end) { |
|
959
|
21 |
3 |
if (x <= 0x20 || x == '<') break; |
|
|
21 |
0 |
if (x <= 0x20 || x == '<') break; |
|
965
|
18 |
6 |
if (url_len) scheme_prefix = "http://"; |
|
967
|
3354 |
41 |
if (scheme_len || scheme_prefix) { |
|
|
18 |
3336 |
if (scheme_len || scheme_prefix) { |
|
968
|
59 |
0 |
if (url_len) { |
|
969
|
41 |
18 |
size_t total = (scheme_prefix ? url_len : scheme_len + url_len); |
|
971
|
38 |
21 |
if (p > run) html_escape(aTHX_ b, run, (size_t)(p - run)); |
|
973
|
18 |
41 |
if (scheme_prefix) mds_buf_write(aTHX_ b, scheme_prefix, strlen(scheme_prefix)); |
|
|
0 |
18 |
if (scheme_prefix) mds_buf_write(aTHX_ b, scheme_prefix, strlen(scheme_prefix)); |
|
984
|
44 |
3292 |
if (c == 'x' && (size_t)(end - p) >= 5 && memcmp(p, "xmpp:", 5) == 0) { |
|
|
21 |
23 |
if (c == 'x' && (size_t)(end - p) >= 5 && memcmp(p, "xmpp:", 5) == 0) { |
|
|
12 |
9 |
if (c == 'x' && (size_t)(end - p) >= 5 && memcmp(p, "xmpp:", 5) == 0) { |
|
986
|
12 |
0 |
if (at) { |
|
988
|
12 |
0 |
if (gfm_scan_email_at(p + 5, at, end, &ll, &dl) && |
|
989
|
12 |
0 |
(const char*)at - ll == p + 5) { |
|
993
|
9 |
3 |
if (q < end && *q == '/') { |
|
|
6 |
3 |
if (q < end && *q == '/') { |
|
994
|
51 |
6 |
while (q < end) { |
|
996
|
51 |
0 |
if (x <= 0x20 || x == '<') break; |
|
|
51 |
0 |
if (x <= 0x20 || x == '<') break; |
|
1002
|
0 |
12 |
if (p > run) html_escape(aTHX_ b, run, (size_t)(p - run)); |
|
1014
|
39 |
3285 |
if (c == 'm' && (size_t)(end - p) >= 7 && memcmp(p, "mailto:", 7) == 0) { |
|
|
36 |
3 |
if (c == 'm' && (size_t)(end - p) >= 7 && memcmp(p, "mailto:", 7) == 0) { |
|
|
21 |
15 |
if (c == 'm' && (size_t)(end - p) >= 7 && memcmp(p, "mailto:", 7) == 0) { |
|
1016
|
21 |
0 |
if (at) { |
|
1018
|
21 |
0 |
if (gfm_scan_email_at(p + 7, at, end, &ll, &dl) && |
|
1019
|
21 |
0 |
(const char*)at - ll == p + 7) { |
|
1021
|
6 |
15 |
if (p > run) html_escape(aTHX_ b, run, (size_t)(p - run)); |
|
1034
|
854 |
2449 |
if (isalnum(c) || c == '.' || c == '_' || c == '+' || c == '-') { |
|
|
802 |
52 |
if (isalnum(c) || c == '.' || c == '_' || c == '+' || c == '-') { |
|
|
778 |
24 |
if (isalnum(c) || c == '.' || c == '_' || c == '+' || c == '-') { |
|
|
778 |
0 |
if (isalnum(c) || c == '.' || c == '_' || c == '+' || c == '-') { |
|
|
60 |
718 |
if (isalnum(c) || c == '.' || c == '_' || c == '+' || c == '-') { |
|
1037
|
11248 |
1110 |
while (q < end) { |
|
1039
|
39 |
11209 |
if (x == '@') break; |
|
1040
|
1767 |
9442 |
if (!(isalnum(x) || x == '.' || x == '_' || x == '+' || x == '-')) { |
|
|
1603 |
164 |
if (!(isalnum(x) || x == '.' || x == '_' || x == '+' || x == '-')) { |
|
|
1558 |
45 |
if (!(isalnum(x) || x == '.' || x == '_' || x == '+' || x == '-')) { |
|
|
1555 |
3 |
if (!(isalnum(x) || x == '.' || x == '_' || x == '+' || x == '-')) { |
|
|
1436 |
119 |
if (!(isalnum(x) || x == '.' || x == '_' || x == '+' || x == '-')) { |
|
1045
|
1149 |
1436 |
if (q && q < end && *q == '@') { |
|
|
39 |
1110 |
if (q && q < end && *q == '@') { |
|
|
39 |
0 |
if (q && q < end && *q == '@') { |
|
1047
|
27 |
12 |
if (gfm_scan_email_at(p, q, end, &ll, &dl) && |
|
1048
|
27 |
0 |
q - ll == p) { |
|
1050
|
9 |
18 |
if (p > run) html_escape(aTHX_ b, run, (size_t)(p - run)); |
|
1064
|
1347 |
68 |
if (run < end) html_escape(aTHX_ b, run, (size_t)(end - run)); |
|
1070
|
0 |
5888 |
if (st->fn_skip) return; |
|
1071
|
612 |
5276 |
if (st->li_check_pending) { |
|
1075
|
552 |
60 |
if (st->li_check_pending == 1 && n == 1 && s[0] == '[') { |
|
|
205 |
347 |
if (st->li_check_pending == 1 && n == 1 && s[0] == '[') { |
|
|
60 |
145 |
if (st->li_check_pending == 1 && n == 1 && s[0] == '[') { |
|
1079
|
60 |
492 |
if (st->li_check_pending == 2) { |
|
1081
|
60 |
0 |
if (n >= 3 && s[1] == ']' && s[2] == ' ' && |
|
|
60 |
0 |
if (n >= 3 && s[1] == ']' && s[2] == ' ' && |
|
|
60 |
0 |
if (n >= 3 && s[1] == ']' && s[2] == ' ' && |
|
1082
|
41 |
19 |
(s[0] == ' ' || s[0] == 'x' || s[0] == 'X')) { |
|
|
24 |
17 |
(s[0] == ' ' || s[0] == 'x' || s[0] == 'X')) { |
|
|
0 |
24 |
(s[0] == ' ' || s[0] == 'x' || s[0] == 'X')) { |
|
1083
|
19 |
17 |
if (s[0] == ' ') |
|
1084
|
0 |
19 |
MDS_BUF_LIT(st->buf, " "); |
|
1086
|
4 |
13 |
MDS_BUF_LIT(st->buf, " "); |
|
1088
|
0 |
36 |
if (n == 0) return; |
|
1091
|
0 |
24 |
MDS_BUF_LIT(st->buf, "["); |
|
1095
|
86 |
406 |
if (n >= 4 && s[0] == '[' && s[2] == ']' && s[3] == ' ' && |
|
|
0 |
86 |
if (n >= 4 && s[0] == '[' && s[2] == ']' && s[3] == ' ' && |
|
|
0 |
0 |
if (n >= 4 && s[0] == '[' && s[2] == ']' && s[3] == ' ' && |
|
|
0 |
0 |
if (n >= 4 && s[0] == '[' && s[2] == ']' && s[3] == ' ' && |
|
1096
|
0 |
0 |
(s[1] == ' ' || s[1] == 'x' || s[1] == 'X')) { |
|
|
0 |
0 |
(s[1] == ' ' || s[1] == 'x' || s[1] == 'X')) { |
|
|
0 |
0 |
(s[1] == ' ' || s[1] == 'x' || s[1] == 'X')) { |
|
1097
|
0 |
0 |
if (s[1] == ' ') |
|
1098
|
0 |
0 |
MDS_BUF_LIT(st->buf, " "); |
|
1100
|
0 |
0 |
MDS_BUF_LIT(st->buf, " "); |
|
1102
|
0 |
0 |
if (n == 0) return; |
|
1106
|
100 |
5728 |
if (st->image_depth > 0) { |
|
1112
|
1532 |
4196 |
if (st->flags & MDS_FLAG_AUTOLINK) { |
|
1115
|
448 |
1084 |
if (need > st->pending_cap) { |
|
1118
|
9 |
439 |
nc = st->pending_cap ? st->pending_cap : 64; |
|
1119
|
9 |
448 |
while (nc < need) nc *= 2; |
|
1121
|
0 |
448 |
if (!np) { /* OOM: bypass coalescing for this chunk */ |
|
1139
|
0 |
339 |
if (st->fn_skip) return; |
|
1141
|
0 |
339 |
if (st->image_depth > 0) { |
|
1146
|
57 |
282 |
if (st->flags & MDS_FLAG_DISALLOW_RAW_HTML) { |
|
1161
|
1521 |
57 |
for (p = s; p < end; p++) { |
|
1162
|
1431 |
90 |
if (*p != '<') continue; |
|
1164
|
90 |
0 |
if (q < end && *q == '/') q++; |
|
|
28 |
62 |
if (q < end && *q == '/') q++; |
|
1166
|
420 |
0 |
while (q < end && isalnum((unsigned char)*q)) q++; |
|
|
330 |
90 |
while (q < end && isalnum((unsigned char)*q)) q++; |
|
1168
|
16 |
74 |
if (nlen == 0) continue; |
|
1170
|
590 |
58 |
for (i = 0; banned[i]; i++) { |
|
1172
|
86 |
504 |
if (nlen == bl && strncasecmp(name, banned[i], bl) == 0) { |
|
|
16 |
70 |
if (nlen == bl && strncasecmp(name, banned[i], bl) == 0) { |
|
1176
|
58 |
16 |
if (!hit) continue; |
|
1177
|
8 |
8 |
if (p > run) mds_buf_write(aTHX_ st->buf, run, (size_t)(p - run)); |
|
|
0 |
8 |
if (p > run) mds_buf_write(aTHX_ st->buf, run, (size_t)(p - run)); |
|
1178
|
0 |
16 |
mds_buf_write(aTHX_ st->buf, "<", 4); |
|
1181
|
57 |
0 |
if (run < end) mds_buf_write(aTHX_ st->buf, run, (size_t)(end - run)); |
|
|
0 |
57 |
if (run < end) mds_buf_write(aTHX_ st->buf, run, (size_t)(end - run)); |
|
1184
|
0 |
282 |
mds_buf_write(aTHX_ st->buf, s, n); |
|
1197
|
6072 |
586 |
for (i = 0; i < n; ) { |
|
1199
|
4780 |
1292 |
if (unesc && c == '\\' && i + 1 < n) { |
|
|
36 |
4744 |
if (unesc && c == '\\' && i + 1 < n) { |
|
|
36 |
0 |
if (unesc && c == '\\' && i + 1 < n) { |
|
1201
|
36 |
0 |
if ((nx >= 0x21 && nx <= 0x2F) || |
|
|
9 |
27 |
if ((nx >= 0x21 && nx <= 0x2F) || |
|
|
9 |
0 |
if ((nx >= 0x21 && nx <= 0x2F) || |
|
1202
|
6 |
3 |
(nx >= 0x3A && nx <= 0x40) || |
|
|
6 |
0 |
(nx >= 0x3A && nx <= 0x40) || |
|
1203
|
6 |
0 |
(nx >= 0x5B && nx <= 0x60) || |
|
|
0 |
6 |
(nx >= 0x5B && nx <= 0x60) || |
|
1204
|
0 |
0 |
(nx >= 0x7B && nx <= 0x7E)) { |
|
1210
|
21 |
6021 |
if (c == '&') { |
|
1213
|
15 |
6 |
if (k) { |
|
1220
|
30 |
15 |
for (z = 0; z < elen; z++) { |
|
1222
|
0 |
30 |
if (ec == '&') { mds_buf_write(aTHX_ b, "&", 5); continue; } |
|
1223
|
30 |
0 |
if (ec <= 0x20 || ec == 0x7f || |
|
|
30 |
0 |
if (ec <= 0x20 || ec == 0x7f || |
|
1224
|
0 |
30 |
ec >= 0x80 || |
|
1225
|
0 |
0 |
ec == '"' || ec == '<' || ec == '>' || ec == '`' || |
|
|
0 |
0 |
ec == '"' || ec == '<' || ec == '>' || ec == '`' || |
|
|
0 |
0 |
ec == '"' || ec == '<' || ec == '>' || ec == '`' || |
|
|
0 |
0 |
ec == '"' || ec == '<' || ec == '>' || ec == '`' || |
|
1226
|
0 |
0 |
ec == '{' || ec == '}' || ec == '|' || ec == '\\' || |
|
|
0 |
0 |
ec == '{' || ec == '}' || ec == '|' || ec == '\\' || |
|
|
0 |
0 |
ec == '{' || ec == '}' || ec == '|' || ec == '\\' || |
|
|
0 |
0 |
ec == '{' || ec == '}' || ec == '|' || ec == '\\' || |
|
1227
|
0 |
0 |
ec == '^' || ec == '[' || ec == ']') { |
|
|
0 |
0 |
ec == '^' || ec == '[' || ec == ']') { |
|
|
0 |
0 |
ec == '^' || ec == '[' || ec == ']') { |
|
1228
|
0 |
30 |
char esc[3] = { '%', hex[ec >> 4], hex[ec & 0xF] }; |
|
1243
|
6045 |
6 |
if (c <= 0x20 || c == 0x7f || c >= 0x80 || |
|
|
6045 |
0 |
if (c <= 0x20 || c == 0x7f || c >= 0x80 || |
|
|
5979 |
66 |
if (c <= 0x20 || c == 0x7f || c >= 0x80 || |
|
1244
|
5967 |
12 |
c == '"' || c == '<' || c == '>' || c == '`' || |
|
|
5967 |
0 |
c == '"' || c == '<' || c == '>' || c == '`' || |
|
|
5967 |
0 |
c == '"' || c == '<' || c == '>' || c == '`' || |
|
|
5964 |
3 |
c == '"' || c == '<' || c == '>' || c == '`' || |
|
1245
|
5964 |
0 |
c == '{' || c == '}' || c == '|' || c == '\\' || |
|
|
5964 |
0 |
c == '{' || c == '}' || c == '|' || c == '\\' || |
|
|
5964 |
0 |
c == '{' || c == '}' || c == '|' || c == '\\' || |
|
|
5949 |
15 |
c == '{' || c == '}' || c == '|' || c == '\\' || |
|
1246
|
5949 |
0 |
c == '^' || c == '[' || c == ']') { |
|
|
5943 |
6 |
c == '^' || c == '[' || c == ']') { |
|
|
9 |
5934 |
c == '^' || c == '[' || c == ']') { |
|
1247
|
0 |
117 |
char esc[3] = { '%', hex[c >> 4], hex[c & 0xF] }; |
|
1266
|
0 |
1743 |
if (st->fn_skip) return; |
|
1269
|
0 |
1743 |
if (st->li_check_pending == 2) { |
|
1272
|
6 |
1737 |
} else if (st->li_check_pending && t != MDS_INL_TEXT) { |
|
|
6 |
0 |
} else if (st->li_check_pending && t != MDS_INL_TEXT) { |
|
1277
|
24 |
1719 |
if (st->image_depth > 0 && t != MDS_INL_IMAGE) { |
|
|
21 |
3 |
if (st->image_depth > 0 && t != MDS_INL_IMAGE) { |
|
1281
|
0 |
328 |
case MDS_INL_EMPH: MDS_BUF_LIT(b, ""); break; |
|
1282
|
0 |
237 |
case MDS_INL_STRONG: MDS_BUF_LIT(b, ""); break; |
|
1283
|
0 |
26 |
case MDS_INL_STRIKE: MDS_BUF_LIT(b, ""); break; |
|
1284
|
3 |
141 |
case MDS_INL_CODE: MDS_BUF_LIT(b, ""); break; |
|
1286
|
1 |
321 |
if (st->flags & MDS_FLAG_HARD_BREAKS) MDS_BUF_LIT(b, " \n"); |
|
1289
|
0 |
29 |
case MDS_INL_LINEBREAK: MDS_BUF_LIT(b, " \n"); break; |
|
1290
|
0 |
337 |
case MDS_INL_LINK: { |
|
1297
|
100 |
237 |
if (d->u.link.title_len) { |
|
1306
|
76 |
3 |
if (st->image_depth == 0) { |
|
1310
|
79 |
0 |
if (g_img_stack_top < IMG_STACK_MAX) { |
|
1319
|
0 |
57 |
case MDS_INL_AUTOLINK: { |
|
1321
|
7 |
50 |
if (d->u.autolink.is_email) { |
|
1348
|
0 |
24 |
uses = st->fn_uses[idx - 1]; |
|
1353
|
6 |
18 |
if (uses > 1) { |
|
1355
|
6 |
0 |
if (nn > 0) mds_buf_write(aTHX_ b, nbuf, (size_t)nn); |
|
|
0 |
6 |
if (nn > 0) mds_buf_write(aTHX_ b, nbuf, (size_t)nn); |
|
1359
|
24 |
0 |
if (in > 0) mds_buf_write(aTHX_ b, ibuf, (size_t)in); |
|
|
0 |
24 |
if (in > 0) mds_buf_write(aTHX_ b, ibuf, (size_t)in); |
|
1375
|
0 |
1743 |
if (st->fn_skip) return; |
|
1380
|
100 |
1643 |
if (st->image_depth > 0 && t != MDS_INL_IMAGE) { |
|
|
21 |
79 |
if (st->image_depth > 0 && t != MDS_INL_IMAGE) { |
|
1384
|
0 |
328 |
case MDS_INL_EMPH: MDS_BUF_LIT(b, ""); break; |
|
1385
|
0 |
237 |
case MDS_INL_STRONG: MDS_BUF_LIT(b, ""); break; |
|
1386
|
3 |
23 |
case MDS_INL_STRIKE: MDS_BUF_LIT(b, ""); break; |
|
1387
|
0 |
144 |
case MDS_INL_CODE: MDS_BUF_LIT(b, ""); break; |
|
1388
|
0 |
337 |
case MDS_INL_LINK: MDS_BUF_LIT(b, ""); break; |
|
1389
|
0 |
57 |
case MDS_INL_AUTOLINK: MDS_BUF_LIT(b, ""); break; |
|
1393
|
79 |
0 |
if (g_img_stack_top > 0) g_img_stack_top--; |
|
1394
|
76 |
3 |
if (st->image_depth == 0) { |
|
1396
|
0 |
76 |
img_info inf = g_img_stack[g_img_stack_top]; |
|
1403
|
73 |
3 |
if (st->alt_len) html_escape(aTHX_ rb, st->alt, st->alt_len); |
|
1405
|
38 |
38 |
if (inf.tlen) { |
|
1473
|
45 |
0 |
if (!st || i >= st->fn_count) return 0; |
|
|
9 |
36 |
if (!st || i >= st->fn_count) return 0; |
|
1474
|
36 |
0 |
if (label_out) *label_out = st->fn_labels[i]; |
|
1475
|
36 |
0 |
if (label_len_out) *label_len_out = st->fn_label_lens[i]; |