Skip to content

Commit f088300

Browse files
committed
mem: make allocator calls take a context pointer
This allows an allocator that stores some local state to be used.
1 parent fe807df commit f088300

File tree

13 files changed

+69
-61
lines changed

13 files changed

+69
-61
lines changed

api_test/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ static void iterator_delete(test_batch_runner *runner) {
340340

341341
cmark_mem *allocator = cmark_get_default_mem_allocator();
342342

343-
allocator->free(html);
343+
allocator->free(allocator->ctx, html);
344344
cmark_iter_free(iter);
345345
cmark_node_free(doc);
346346
}

src/blocks.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ static cmark_node *make_block(cmark_mem *mem, cmark_node_type tag,
7373
int start_line, int start_column) {
7474
cmark_node *e;
7575

76-
e = (cmark_node *)mem->calloc(1, sizeof(*e));
76+
e = (cmark_node *)mem->calloc(mem->ctx, 1, sizeof(*e));
7777
e->mem = mem;
7878
e->type = (uint16_t)tag;
7979
e->flags = CMARK_NODE__OPEN;
@@ -91,7 +91,7 @@ static cmark_node *make_document(cmark_mem *mem) {
9191
}
9292

9393
cmark_parser *cmark_parser_new_with_mem_into_root(int options, cmark_mem *mem, cmark_node *root) {
94-
cmark_parser *parser = (cmark_parser *)mem->calloc(1, sizeof(cmark_parser));
94+
cmark_parser *parser = (cmark_parser *)mem->calloc(mem->ctx, 1, sizeof(cmark_parser));
9595
parser->mem = mem;
9696

9797
cmark_strbuf_init(mem, &parser->curline, 256);
@@ -134,7 +134,7 @@ void cmark_parser_free(cmark_parser *parser) {
134134
cmark_strbuf_free(&parser->curline);
135135
cmark_strbuf_free(&parser->linebuf);
136136
cmark_reference_map_free(parser->refmap);
137-
mem->free(parser);
137+
mem->free(mem->ctx, parser);
138138
}
139139

140140
static cmark_node *finalize(cmark_parser *parser, cmark_node *b);
@@ -411,7 +411,7 @@ static void process_inlines(cmark_mem *mem, cmark_node *root,
411411
if (ev_type == CMARK_EVENT_ENTER) {
412412
if (contains_inlines(S_type(cur))) {
413413
cmark_parse_inlines(mem, cur, refmap, options);
414-
mem->free(cur->data);
414+
mem->free(mem->ctx, cur->data);
415415
cur->data = NULL;
416416
cur->len = 0;
417417
}
@@ -452,7 +452,7 @@ static bufsize_t parse_list_marker(cmark_mem *mem, cmark_chunk *input,
452452
}
453453
}
454454

455-
data = (cmark_list *)mem->calloc(1, sizeof(*data));
455+
data = (cmark_list *)mem->calloc(mem->ctx, 1, sizeof(*data));
456456
data->marker_offset = 0; // will be adjusted later
457457
data->list_type = CMARK_BULLET_LIST;
458458
data->bullet_char = c;
@@ -492,7 +492,7 @@ static bufsize_t parse_list_marker(cmark_mem *mem, cmark_chunk *input,
492492
}
493493
}
494494

495-
data = (cmark_list *)mem->calloc(1, sizeof(*data));
495+
data = (cmark_list *)mem->calloc(mem->ctx, 1, sizeof(*data));
496496
data->marker_offset = 0; // will be adjusted later
497497
data->list_type = CMARK_ORDERED_LIST;
498498
data->bullet_char = 0;
@@ -1130,7 +1130,7 @@ static void open_new_blocks(cmark_parser *parser, cmark_node **container,
11301130
parser->first_nonspace + 1);
11311131
/* TODO: static */
11321132
memcpy(&((*container)->as.list), data, sizeof(*data));
1133-
parser->mem->free(data);
1133+
parser->mem->free(parser->mem->ctx, data);
11341134
} else if (indented && !maybe_lazy && !parser->blank) {
11351135
S_advance_offset(parser, input, CODE_INDENT, true);
11361136
*container = add_child(parser, *container, CMARK_NODE_CODE_BLOCK,

src/buffer.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ void cmark_strbuf_grow(cmark_strbuf *buf, bufsize_t target_size) {
5353
new_size += 1;
5454
new_size = (new_size + 7) & ~7;
5555

56-
buf->ptr = (unsigned char *)buf->mem->realloc(buf->asize ? buf->ptr : NULL,
56+
buf->ptr = (unsigned char *)buf->mem->realloc(buf->mem->ctx, buf->asize ? buf->ptr : NULL,
5757
new_size);
5858
buf->asize = new_size;
5959
}
@@ -63,7 +63,7 @@ void cmark_strbuf_free(cmark_strbuf *buf) {
6363
return;
6464

6565
if (buf->ptr != cmark_strbuf__initbuf)
66-
buf->mem->free(buf->ptr);
66+
buf->mem->free(buf->mem->ctx, buf->ptr);
6767

6868
cmark_strbuf_init(buf->mem, buf, 0);
6969
}
@@ -116,7 +116,7 @@ unsigned char *cmark_strbuf_detach(cmark_strbuf *buf) {
116116

117117
if (buf->asize == 0) {
118118
/* return an empty string */
119-
return (unsigned char *)buf->mem->calloc(1, 1);
119+
return (unsigned char *)buf->mem->calloc(buf->mem->ctx, 1, 1);
120120
}
121121

122122
cmark_strbuf_init(buf->mem, buf, 0);

src/cmark.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ int cmark_version(void) { return CMARK_VERSION; }
1010

1111
const char *cmark_version_string(void) { return CMARK_VERSION_STRING; }
1212

13-
static void *xcalloc(size_t nmem, size_t size) {
13+
static void *xcalloc(void *ctx, size_t nmem, size_t size) {
14+
(void)ctx; // explicitly discard
1415
void *ptr = calloc(nmem, size);
1516
if (!ptr) {
1617
fprintf(stderr, "[cmark] calloc returned null pointer, aborting\n");
@@ -19,7 +20,8 @@ static void *xcalloc(size_t nmem, size_t size) {
1920
return ptr;
2021
}
2122

22-
static void *xrealloc(void *ptr, size_t size) {
23+
static void *xrealloc(void *ctx, void *ptr, size_t size) {
24+
(void)ctx; // explicitly discard
2325
void *new_ptr = realloc(ptr, size);
2426
if (!new_ptr) {
2527
fprintf(stderr, "[cmark] realloc returned null pointer, aborting\n");
@@ -28,7 +30,12 @@ static void *xrealloc(void *ptr, size_t size) {
2830
return new_ptr;
2931
}
3032

31-
cmark_mem DEFAULT_MEM_ALLOCATOR = {xcalloc, xrealloc, free};
33+
static void xfree(void *ctx, void *ptr) {
34+
(void)ctx; // explicitly discard
35+
free(ptr);
36+
}
37+
38+
cmark_mem DEFAULT_MEM_ALLOCATOR = {NULL, xcalloc, xrealloc, xfree};
3239

3340
cmark_mem *cmark_get_default_mem_allocator(void) {
3441
return &DEFAULT_MEM_ALLOCATOR;

src/cmark.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,10 @@ typedef struct cmark_iter cmark_iter;
9696
* when parsing and allocating a document tree
9797
*/
9898
typedef struct cmark_mem {
99-
void *(*calloc)(size_t, size_t);
100-
void *(*realloc)(void *, size_t);
101-
void (*free)(void *);
99+
void *ctx;
100+
void *(*calloc)(void*, size_t, size_t);
101+
void *(*realloc)(void*, void *, size_t);
102+
void (*free)(void*, void *);
102103
} cmark_mem;
103104

104105
/** Returns a pointer to the default memory allocator.

src/inlines.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ static bufsize_t subject_find_special_char(subject *subj, int options);
8686
// Create an inline with a literal string value.
8787
static inline cmark_node *make_literal(subject *subj, cmark_node_type t,
8888
int start_column, int end_column) {
89-
cmark_node *e = (cmark_node *)subj->mem->calloc(1, sizeof(*e));
89+
cmark_node *e = (cmark_node *)subj->mem->calloc(subj->mem->ctx, 1, sizeof(*e));
9090
e->mem = subj->mem;
9191
e->type = (uint16_t)t;
9292
e->start_line = e->end_line = subj->line;
@@ -98,15 +98,15 @@ static inline cmark_node *make_literal(subject *subj, cmark_node_type t,
9898

9999
// Create an inline with no value.
100100
static inline cmark_node *make_simple(cmark_mem *mem, cmark_node_type t) {
101-
cmark_node *e = (cmark_node *)mem->calloc(1, sizeof(*e));
101+
cmark_node *e = (cmark_node *)mem->calloc(mem->ctx, 1, sizeof(*e));
102102
e->mem = mem;
103103
e->type = t;
104104
return e;
105105
}
106106

107107
static cmark_node *make_str(subject *subj, int sc, int ec, cmark_chunk s) {
108108
cmark_node *e = make_literal(subj, CMARK_NODE_TEXT, sc, ec);
109-
e->data = (unsigned char *)subj->mem->realloc(NULL, s.len + 1);
109+
e->data = (unsigned char *)subj->mem->realloc(subj->mem->ctx, NULL, s.len + 1);
110110
if (s.data != NULL) {
111111
memcpy(e->data, s.data, s.len);
112112
}
@@ -161,7 +161,7 @@ static unsigned char *cmark_strdup(cmark_mem *mem, unsigned char *src) {
161161
return NULL;
162162
}
163163
size_t len = strlen((char *)src);
164-
unsigned char *data = (unsigned char *)mem->realloc(NULL, len + 1);
164+
unsigned char *data = (unsigned char *)mem->realloc(mem->ctx, NULL, len + 1);
165165
memcpy(data, src, len + 1);
166166
return data;
167167
}
@@ -516,7 +516,7 @@ static void remove_delimiter(subject *subj, delimiter *delim) {
516516
if (delim->previous != NULL) {
517517
delim->previous->next = delim->next;
518518
}
519-
subj->mem->free(delim);
519+
subj->mem->free(subj->mem->ctx, delim);
520520
}
521521

522522
static void pop_bracket(subject *subj) {
@@ -525,12 +525,12 @@ static void pop_bracket(subject *subj) {
525525
return;
526526
b = subj->last_bracket;
527527
subj->last_bracket = subj->last_bracket->previous;
528-
subj->mem->free(b);
528+
subj->mem->free(subj->mem->ctx, b);
529529
}
530530

531531
static void push_delimiter(subject *subj, unsigned char c, bool can_open,
532532
bool can_close, cmark_node *inl_text) {
533-
delimiter *delim = (delimiter *)subj->mem->calloc(1, sizeof(delimiter));
533+
delimiter *delim = (delimiter *)subj->mem->calloc(subj->mem->ctx, 1, sizeof(delimiter));
534534
delim->delim_char = c;
535535
delim->can_open = can_open;
536536
delim->can_close = can_close;
@@ -546,7 +546,7 @@ static void push_delimiter(subject *subj, unsigned char c, bool can_open,
546546
}
547547

548548
static void push_bracket(subject *subj, bool image, cmark_node *inl_text) {
549-
bracket *b = (bracket *)subj->mem->calloc(1, sizeof(bracket));
549+
bracket *b = (bracket *)subj->mem->calloc(subj->mem->ctx, 1, sizeof(bracket));
550550
if (subj->last_bracket != NULL) {
551551
subj->last_bracket->bracket_after = true;
552552
}
@@ -992,7 +992,7 @@ static cmark_node *handle_pointy_brace(subject *subj, int options) {
992992
subj->pos += matchlen;
993993
cmark_node *node = make_literal(subj, CMARK_NODE_HTML_INLINE,
994994
subj->pos - matchlen - 1, subj->pos - 1);
995-
node->data = (unsigned char *)subj->mem->realloc(NULL, len + 1);
995+
node->data = (unsigned char *)subj->mem->realloc(subj->mem->ctx, NULL, len + 1);
996996
memcpy(node->data, src, len);
997997
node->data[len] = 0;
998998
node->len = len;

src/iterator.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ cmark_iter *cmark_iter_new(cmark_node *root) {
1717
return NULL;
1818
}
1919
cmark_mem *mem = root->mem;
20-
cmark_iter *iter = (cmark_iter *)mem->calloc(1, sizeof(cmark_iter));
20+
cmark_iter *iter = (cmark_iter *)mem->calloc(mem->ctx, 1, sizeof(cmark_iter));
2121
iter->mem = mem;
2222
iter->root = root;
2323
iter->cur.ev_type = CMARK_EVENT_NONE;
@@ -27,7 +27,7 @@ cmark_iter *cmark_iter_new(cmark_node *root) {
2727
return iter;
2828
}
2929

30-
void cmark_iter_free(cmark_iter *iter) { iter->mem->free(iter); }
30+
void cmark_iter_free(cmark_iter *iter) { iter->mem->free(iter->mem->ctx, iter); }
3131

3232
static bool S_is_leaf(cmark_node *node) {
3333
return ((1 << node->type) & S_leaf_mask) != 0;
@@ -111,7 +111,7 @@ void cmark_consolidate_text_nodes(cmark_node *root) {
111111
cmark_node_free(tmp);
112112
tmp = next;
113113
}
114-
iter->mem->free(cur->data);
114+
iter->mem->free(iter->mem->ctx, cur->data);
115115
cur->len = buf.size;
116116
cur->data = cmark_strbuf_detach(&buf);
117117
}

src/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ static void print_document(cmark_node *document, writer_format writer,
7070
exit(1);
7171
}
7272
fwrite(result, strlen(result), 1, stdout);
73-
document->mem->free(result);
73+
document->mem->free(document->mem->ctx, result);
7474
}
7575

7676
int main(int argc, char *argv[]) {

src/man.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
116116

117117
case CMARK_NODE_ITEM:
118118
if (entering) {
119-
new_block_number = allocator->calloc(1, sizeof(struct block_number));
119+
new_block_number = allocator->calloc(allocator->ctx, 1, sizeof(struct block_number));
120120
new_block_number->number = 0;
121121
new_block_number->parent = renderer->block_number_in_list_item;
122122
renderer->block_number_in_list_item = new_block_number;
@@ -145,7 +145,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
145145
new_block_number = renderer->block_number_in_list_item;
146146
renderer->block_number_in_list_item =
147147
renderer->block_number_in_list_item->parent;
148-
allocator->free(new_block_number);
148+
allocator->free(allocator->ctx, new_block_number);
149149
}
150150
CR();
151151
}

src/node.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ static bool S_can_contain(cmark_node *node, cmark_node *child) {
8888
}
8989

9090
cmark_node *cmark_node_new_with_mem(cmark_node_type type, cmark_mem *mem) {
91-
cmark_node *node = (cmark_node *)mem->calloc(1, sizeof(*node));
91+
cmark_node *node = (cmark_node *)mem->calloc(mem->ctx, 1, sizeof(*node));
9292
node->mem = mem;
9393
node->type = (uint16_t)type;
9494

@@ -124,24 +124,24 @@ static void S_free_nodes(cmark_node *e) {
124124
while (e != NULL) {
125125
switch (e->type) {
126126
case CMARK_NODE_CODE_BLOCK:
127-
mem->free(e->data);
128-
mem->free(e->as.code.info);
127+
mem->free(mem->ctx, e->data);
128+
mem->free(mem->ctx, e->as.code.info);
129129
break;
130130
case CMARK_NODE_TEXT:
131131
case CMARK_NODE_HTML_INLINE:
132132
case CMARK_NODE_CODE:
133133
case CMARK_NODE_HTML_BLOCK:
134-
mem->free(e->data);
134+
mem->free(mem->ctx, e->data);
135135
break;
136136
case CMARK_NODE_LINK:
137137
case CMARK_NODE_IMAGE:
138-
mem->free(e->as.link.url);
139-
mem->free(e->as.link.title);
138+
mem->free(mem->ctx, e->as.link.url);
139+
mem->free(mem->ctx, e->as.link.title);
140140
break;
141141
case CMARK_NODE_CUSTOM_BLOCK:
142142
case CMARK_NODE_CUSTOM_INLINE:
143-
mem->free(e->as.custom.on_enter);
144-
mem->free(e->as.custom.on_exit);
143+
mem->free(mem->ctx, e->as.custom.on_enter);
144+
mem->free(mem->ctx, e->as.custom.on_exit);
145145
break;
146146
default:
147147
break;
@@ -152,7 +152,7 @@ static void S_free_nodes(cmark_node *e) {
152152
e->next = e->first_child;
153153
}
154154
next = e->next;
155-
mem->free(e);
155+
mem->free(mem->ctx, e);
156156
e = next;
157157
}
158158
}
@@ -271,14 +271,14 @@ static bufsize_t cmark_set_cstr(cmark_mem *mem, unsigned char **dst,
271271

272272
if (src && src[0]) {
273273
len = (bufsize_t)strlen(src);
274-
*dst = (unsigned char *)mem->realloc(NULL, len + 1);
274+
*dst = (unsigned char *)mem->realloc(mem->ctx, NULL, len + 1);
275275
memcpy(*dst, src, len + 1);
276276
} else {
277277
len = 0;
278278
*dst = NULL;
279279
}
280280
if (old) {
281-
mem->free(old);
281+
mem->free(mem->ctx, old);
282282
}
283283

284284
return len;

0 commit comments

Comments
 (0)