diff options
author | Nick Wellnhofer <[email protected]> | 2020-01-19 13:46:10 +0100 |
---|---|---|
committer | John MacFarlane <[email protected]> | 2020-01-23 08:25:54 -0800 |
commit | f3f50b29d615d2678d8047dc277b108cc5143167 (patch) | |
tree | ca3f01f6352d2cc2dd7cfc9c96508b800b8cc510 /src/node.c | |
parent | 3ef0718f9f4c9dea5014a8a0e9a67e2366b9374f (diff) |
Rearrange struct cmark_node
Introduce multi-purpose data/len members in struct cmark_node. This
is mainly used to store literal text for inlines, code and HTML blocks.
Move the content strbuf for blocks from cmark_node to cmark_parser.
When finalizing nodes that allow inlines (paragraphs and headings),
detach the strbuf and store the block content in the node's data/len
members. Free the block content after processing inlines.
Reduces size of struct cmark_node by 8 bytes.
Diffstat (limited to 'src/node.c')
-rw-r--r-- | src/node.c | 42 |
1 files changed, 17 insertions, 25 deletions
@@ -6,8 +6,6 @@ static void S_node_unlink(cmark_node *node); -#define NODE_MEM(node) cmark_node_mem(node) - static CMARK_INLINE bool S_is_block(cmark_node *node) { if (node == NULL) { return false; @@ -74,7 +72,7 @@ static bool S_can_contain(cmark_node *node, cmark_node *child) { cmark_node *cmark_node_new_with_mem(cmark_node_type type, cmark_mem *mem) { cmark_node *node = (cmark_node *)mem->calloc(1, sizeof(*node)); - cmark_strbuf_init(mem, &node->content, 0); + node->mem = mem; node->type = (uint16_t)type; switch (node->type) { @@ -104,29 +102,29 @@ cmark_node *cmark_node_new(cmark_node_type type) { // Free a cmark_node list and any children. static void S_free_nodes(cmark_node *e) { + cmark_mem *mem = e->mem; cmark_node *next; while (e != NULL) { - cmark_strbuf_free(&e->content); switch (e->type) { case CMARK_NODE_CODE_BLOCK: - NODE_MEM(e)->free(e->as.code.info); - NODE_MEM(e)->free(e->as.code.literal); + mem->free(e->data); + mem->free(e->as.code.info); break; case CMARK_NODE_TEXT: case CMARK_NODE_HTML_INLINE: case CMARK_NODE_CODE: case CMARK_NODE_HTML_BLOCK: - NODE_MEM(e)->free(e->as.literal.data); + mem->free(e->data); break; case CMARK_NODE_LINK: case CMARK_NODE_IMAGE: - NODE_MEM(e)->free(e->as.link.url); - NODE_MEM(e)->free(e->as.link.title); + mem->free(e->as.link.url); + mem->free(e->as.link.title); break; case CMARK_NODE_CUSTOM_BLOCK: case CMARK_NODE_CUSTOM_INLINE: - NODE_MEM(e)->free(e->as.custom.on_enter); - NODE_MEM(e)->free(e->as.custom.on_exit); + mem->free(e->as.custom.on_enter); + mem->free(e->as.custom.on_exit); break; default: break; @@ -137,7 +135,7 @@ static void S_free_nodes(cmark_node *e) { e->next = e->first_child; } next = e->next; - NODE_MEM(e)->free(e); + mem->free(e); e = next; } } @@ -295,10 +293,8 @@ const char *cmark_node_get_literal(cmark_node *node) { case CMARK_NODE_TEXT: case CMARK_NODE_HTML_INLINE: case CMARK_NODE_CODE: - return node->as.literal.data ? (char *)node->as.literal.data : ""; - case CMARK_NODE_CODE_BLOCK: - return (char *)node->as.code.literal; + return node->data ? (char *)node->data : ""; default: break; @@ -317,12 +313,8 @@ int cmark_node_set_literal(cmark_node *node, const char *content) { case CMARK_NODE_TEXT: case CMARK_NODE_HTML_INLINE: case CMARK_NODE_CODE: - node->as.literal.len = cmark_set_cstr(NODE_MEM(node), - &node->as.literal.data, content); - return 1; - case CMARK_NODE_CODE_BLOCK: - cmark_set_cstr(NODE_MEM(node), &node->as.code.literal, content); + node->len = cmark_set_cstr(node->mem, &node->data, content); return 1; default: @@ -491,7 +483,7 @@ int cmark_node_set_fence_info(cmark_node *node, const char *info) { } if (node->type == CMARK_NODE_CODE_BLOCK) { - cmark_set_cstr(NODE_MEM(node), &node->as.code.info, info); + cmark_set_cstr(node->mem, &node->as.code.info, info); return 1; } else { return 0; @@ -522,7 +514,7 @@ int cmark_node_set_url(cmark_node *node, const char *url) { switch (node->type) { case CMARK_NODE_LINK: case CMARK_NODE_IMAGE: - cmark_set_cstr(NODE_MEM(node), &node->as.link.url, url); + cmark_set_cstr(node->mem, &node->as.link.url, url); return 1; default: break; @@ -555,7 +547,7 @@ int cmark_node_set_title(cmark_node *node, const char *title) { switch (node->type) { case CMARK_NODE_LINK: case CMARK_NODE_IMAGE: - cmark_set_cstr(NODE_MEM(node), &node->as.link.title, title); + cmark_set_cstr(node->mem, &node->as.link.title, title); return 1; default: break; @@ -588,7 +580,7 @@ int cmark_node_set_on_enter(cmark_node *node, const char *on_enter) { switch (node->type) { case CMARK_NODE_CUSTOM_INLINE: case CMARK_NODE_CUSTOM_BLOCK: - cmark_set_cstr(NODE_MEM(node), &node->as.custom.on_enter, on_enter); + cmark_set_cstr(node->mem, &node->as.custom.on_enter, on_enter); return 1; default: break; @@ -621,7 +613,7 @@ int cmark_node_set_on_exit(cmark_node *node, const char *on_exit) { switch (node->type) { case CMARK_NODE_CUSTOM_INLINE: case CMARK_NODE_CUSTOM_BLOCK: - cmark_set_cstr(NODE_MEM(node), &node->as.custom.on_exit, on_exit); + cmark_set_cstr(node->mem, &node->as.custom.on_exit, on_exit); return 1; default: break; |