md4c

C Markdown parser. Fast. SAX-like interface. Compliant to CommonMark specification.
git clone https://noulin.net/git/md4c.git
Log | Files | Refs | README | LICENSE

commit 4c96ac2626175c8518d4753b37b5d568a58d1b66
parent aacbbfae6414e9aba479220a7afc0412c90dc62e
Author: Martin Mitas <mity@morous.org>
Date:   Sat, 26 Nov 2016 20:31:35 +0100

Refactorize memory management of MD_LINK_REF_DEF structures.

Diffstat:
Mmd4c/md4c.c | 55++++++++++++++++++++++++++++---------------------------
1 file changed, 28 insertions(+), 27 deletions(-)

diff --git a/md4c/md4c.c b/md4c/md4c.c @@ -101,8 +101,10 @@ struct MD_CTX_tag { CHAR* buffer; unsigned alloc_buffer; - MD_LINK_REF_DEF* link_ref_head; - MD_LINK_REF_DEF* link_ref_tail; + /* Link reference definitions. */ + MD_LINK_REF_DEF* link_ref_defs; + unsigned n_link_ref_defs; + unsigned alloc_link_ref_defs; /* Stack of inline/span markers. * This is only used for parsing a single block contents but by storing it @@ -1188,8 +1190,6 @@ struct MD_LINK_REF_DEF_tag { SZ title_size; OFF dest_beg; OFF dest_end; - - MD_LINK_REF_DEF* next; }; typedef struct MD_LINK_ATTR_tag MD_LINK_ATTR; @@ -1535,11 +1535,22 @@ md_is_link_reference_definition(MD_CTX* ctx, const MD_LINE* lines, int n_lines) return FALSE; /* Store the link reference definition. */ - def = (MD_LINK_REF_DEF*) malloc(sizeof(MD_LINK_REF_DEF)); - if(def == NULL) { - MD_LOG("malloc() failed."); - return -1; + if(ctx->n_link_ref_defs >= ctx->alloc_link_ref_defs) { + MD_LINK_REF_DEF* new_defs; + + ctx->alloc_link_ref_defs = (ctx->alloc_link_ref_defs > 0 ? ctx->alloc_link_ref_defs * 2 : 16); + new_defs = (MD_LINK_REF_DEF*) realloc(ctx->link_ref_defs, ctx->alloc_link_ref_defs * sizeof(MD_LINK_REF_DEF)); + if(new_defs == NULL) { + MD_LOG("realloc() failed."); + ret = -1; + goto abort; + } + + ctx->link_ref_defs = new_defs; } + + def = &ctx->link_ref_defs[ctx->n_link_ref_defs]; + ctx->n_link_ref_defs++; memset(def, 0, sizeof(MD_LINK_REF_DEF)); if(label_is_multiline) { @@ -1571,13 +1582,6 @@ md_is_link_reference_definition(MD_CTX* ctx, const MD_LINE* lines, int n_lines) def->title_needs_free = TRUE; } - if(ctx->link_ref_tail != NULL) - ctx->link_ref_tail->next = def; - else - ctx->link_ref_head = def; - ctx->link_ref_tail = def; - def->next = NULL; - ret = line_index + 1; abort: @@ -1664,16 +1668,15 @@ md_link_label_eq(const CHAR* a_label, SZ a_size, const CHAR* b_label, SZ b_size) static int md_lookup_link_ref_def(MD_CTX* ctx, const CHAR* label, SZ label_size, MD_LINK_REF_DEF** p_def) { - MD_LINK_REF_DEF* def; + unsigned i; + + for(i = 0; i < ctx->n_link_ref_defs; i++) { + MD_LINK_REF_DEF* def = &ctx->link_ref_defs[i]; - def = ctx->link_ref_head; - while(def != NULL) { if(md_link_label_eq(def->label, def->label_size, label, label_size)) { *p_def = def; return TRUE; } - - def = def->next; } *p_def = NULL; @@ -1822,20 +1825,18 @@ abort: static void md_free_link_ref_defs(MD_CTX* ctx) { - MD_LINK_REF_DEF* def = ctx->link_ref_head; - MD_LINK_REF_DEF* def_next; + unsigned i; - while(def != NULL) { - def_next = def->next; + for(i = 0; i < ctx->n_link_ref_defs; i++) { + MD_LINK_REF_DEF* def = &ctx->link_ref_defs[i]; if(def->label_needs_free) free(def->label); if(def->title_needs_free) free(def->title); - free(def); - - def = def_next; } + + free(ctx->link_ref_defs); }