Skip to content

Commit

Permalink
Fix quadratic performance issue in list numbering.
Browse files Browse the repository at this point in the history
  • Loading branch information
kevinbackhouse committed Mar 28, 2023
1 parent f7e31f8 commit 763587e
Show file tree
Hide file tree
Showing 5 changed files with 9 additions and 20 deletions.
8 changes: 2 additions & 6 deletions src/commonmark.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,19 +231,15 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
LIT("<!-- end list -->");
BLANKLINE();
}
renderer->list_number = cmark_node_get_list_start(node);
break;

case CMARK_NODE_ITEM:
if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
marker_width = 4;
} else {
list_number = cmark_node_get_list_start(node->parent);
list_number = renderer->list_number++;
list_delim = cmark_node_get_list_delim(node->parent);
tmp = node;
while (tmp->prev) {
tmp = tmp->prev;
list_number += 1;
}
// we ensure a width of at least 4 so
// we get nice transition from single digits
// to double
Expand Down
8 changes: 2 additions & 6 deletions src/man.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
break;

case CMARK_NODE_LIST:
renderer->list_number = cmark_node_get_list_start(node);
break;

case CMARK_NODE_ITEM:
Expand All @@ -123,12 +124,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
LIT("\\[bu] 2");
} else {
list_number = cmark_node_get_list_start(node->parent);
tmp = node;
while (tmp->prev) {
tmp = tmp->prev;
list_number += 1;
}
list_number = renderer->list_number++;
char list_number_s[LIST_NUMBER_SIZE];
snprintf(list_number_s, LIST_NUMBER_SIZE, "\"%d.\" 4", list_number);
LIT(list_number_s);
Expand Down
8 changes: 2 additions & 6 deletions src/plaintext.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,19 +76,15 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
node->next->type == CMARK_NODE_LIST)) {
CR();
}
renderer->list_number = cmark_node_get_list_start(node);
break;

case CMARK_NODE_ITEM:
if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
marker_width = 4;
} else {
list_number = cmark_node_get_list_start(node->parent);
list_number = renderer->list_number++;
list_delim = cmark_node_get_list_delim(node->parent);
tmp = node;
while (tmp->prev) {
tmp = tmp->prev;
list_number += 1;
}
// we ensure a width of at least 4 so
// we get nice transition from single digits
// to double
Expand Down
4 changes: 2 additions & 2 deletions src/render.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,8 @@ char *cmark_render(cmark_mem *mem, cmark_node *root, int options, int width,

cmark_renderer renderer = {mem, &buf, &pref, 0, width,
0, 0, true, true, false,
false, outc, S_cr, S_blankline, S_out,
0};
false, 0, outc, S_cr, S_blankline,
S_out, 0};

while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
cur = cmark_iter_get_node(iter);
Expand Down
1 change: 1 addition & 0 deletions src/render.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ struct cmark_renderer {
bool begin_content;
bool no_linebreaks;
bool in_tight_list_item;
int list_number;
void (*outc)(struct cmark_renderer *, cmark_node *, cmark_escaping, int32_t, unsigned char);
void (*cr)(struct cmark_renderer *);
void (*blankline)(struct cmark_renderer *);
Expand Down

0 comments on commit 763587e

Please sign in to comment.