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];