Skip to content

Commit

Permalink
Fix quadratic behavior with smart quotes
Browse files Browse the repository at this point in the history
Make sure to remove matching smart quote delimiters. Otherwise, the
same opener could be found over and over again, preventing the
`openers_bottom` optimization from kicking in and leading to quadratic
behavior when processing lots of quotes.

Fixes commonmark#388.
  • Loading branch information
nwellnhof authored and kevinbackhouse committed Nov 16, 2022
1 parent 6a6e335 commit 7e49343
Showing 1 changed file with 12 additions and 10 deletions.
22 changes: 12 additions & 10 deletions src/inlines.c
Original file line number Diff line number Diff line change
Expand Up @@ -696,22 +696,24 @@ static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *sta
} else {
closer = closer->next;
}
} else if (closer->delim_char == '\'') {
} else if (closer->delim_char == '\'' || closer->delim_char == '"') {
cmark_chunk_free(subj->mem, &closer->inl_text->as.literal);
closer->inl_text->as.literal = cmark_chunk_literal(RIGHTSINGLEQUOTE);
if (opener_found) {
cmark_chunk_free(subj->mem, &opener->inl_text->as.literal);
opener->inl_text->as.literal = cmark_chunk_literal(LEFTSINGLEQUOTE);
if (closer->delim_char == '\'') {
closer->inl_text->as.literal = cmark_chunk_literal(RIGHTSINGLEQUOTE);
} else {
closer->inl_text->as.literal = cmark_chunk_literal(RIGHTDOUBLEQUOTE);
}
closer = closer->next;
} else if (closer->delim_char == '"') {
cmark_chunk_free(subj->mem, &closer->inl_text->as.literal);
closer->inl_text->as.literal = cmark_chunk_literal(RIGHTDOUBLEQUOTE);
if (opener_found) {
cmark_chunk_free(subj->mem, &opener->inl_text->as.literal);
opener->inl_text->as.literal = cmark_chunk_literal(LEFTDOUBLEQUOTE);
if (old_closer->delim_char == '\'') {
opener->inl_text->as.literal = cmark_chunk_literal(LEFTSINGLEQUOTE);
} else {
opener->inl_text->as.literal = cmark_chunk_literal(LEFTDOUBLEQUOTE);
}
remove_delimiter(subj, opener);
remove_delimiter(subj, old_closer);
}
closer = closer->next;
}
if (!opener_found) {
// set lower bound for future searches for openers
Expand Down

0 comments on commit 7e49343

Please sign in to comment.