Skip to content

Commit 36f8112

Browse files
Revert "Fix quadratic performance issue in list numbering."
This reverts commit 763587e.
1 parent 6ab3e99 commit 36f8112

File tree

5 files changed

+20
-9
lines changed

5 files changed

+20
-9
lines changed

src/commonmark.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,15 +217,19 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
217217
LIT("<!-- end list -->");
218218
BLANKLINE();
219219
}
220-
renderer->list_number = cmark_node_get_list_start(node);
221220
break;
222221

223222
case CMARK_NODE_ITEM:
224223
if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
225224
marker_width = 4;
226225
} else {
227-
list_number = renderer->list_number++;
226+
list_number = cmark_node_get_list_start(node->parent);
228227
list_delim = cmark_node_get_list_delim(node->parent);
228+
tmp = node;
229+
while (tmp->prev) {
230+
tmp = tmp->prev;
231+
list_number += 1;
232+
}
229233
// we ensure a width of at least 4 so
230234
// we get nice transition from single digits
231235
// to double

src/man.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
114114
break;
115115

116116
case CMARK_NODE_LIST:
117-
renderer->list_number = cmark_node_get_list_start(node);
118117
break;
119118

120119
case CMARK_NODE_ITEM:
@@ -124,7 +123,12 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
124123
if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
125124
LIT("\\[bu] 2");
126125
} else {
127-
list_number = renderer->list_number++;
126+
list_number = cmark_node_get_list_start(node->parent);
127+
tmp = node;
128+
while (tmp->prev) {
129+
tmp = tmp->prev;
130+
list_number += 1;
131+
}
128132
char list_number_s[LIST_NUMBER_SIZE];
129133
snprintf(list_number_s, LIST_NUMBER_SIZE, "\"%d.\" 4", list_number);
130134
LIT(list_number_s);

src/plaintext.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,19 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
6262
node->next->type == CMARK_NODE_LIST)) {
6363
CR();
6464
}
65-
renderer->list_number = cmark_node_get_list_start(node);
6665
break;
6766

6867
case CMARK_NODE_ITEM:
6968
if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
7069
marker_width = 4;
7170
} else {
72-
list_number = renderer->list_number++;
71+
list_number = cmark_node_get_list_start(node->parent);
7372
list_delim = cmark_node_get_list_delim(node->parent);
73+
tmp = node;
74+
while (tmp->prev) {
75+
tmp = tmp->prev;
76+
list_number += 1;
77+
}
7478
// we ensure a width of at least 4 so
7579
// we get nice transition from single digits
7680
// to double

src/render.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,8 @@ char *cmark_render(cmark_mem *mem, cmark_node *root, int options, int width,
171171

172172
cmark_renderer renderer = {mem, &buf, &pref, 0, width,
173173
0, 0, true, true, false,
174-
false, 0, outc, S_cr, S_blankline,
175-
S_out, 0};
174+
false, outc, S_cr, S_blankline, S_out,
175+
0};
176176

177177
while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
178178
cur = cmark_iter_get_node(iter);

src/render.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ struct cmark_renderer {
2323
bool begin_content;
2424
bool no_linebreaks;
2525
bool in_tight_list_item;
26-
int list_number;
2726
void (*outc)(struct cmark_renderer *, cmark_node *, cmark_escaping, int32_t, unsigned char);
2827
void (*cr)(struct cmark_renderer *);
2928
void (*blankline)(struct cmark_renderer *);

0 commit comments

Comments
 (0)