summaryrefslogtreecommitdiff
path: root/src/node.c
diff options
context:
space:
mode:
authorNick Wellnhofer <wellnhofer@aevum.de>2020-01-19 13:46:10 +0100
committerJohn MacFarlane <jgm@berkeley.edu>2020-01-23 08:25:54 -0800
commitf3f50b29d615d2678d8047dc277b108cc5143167 (patch)
treeca3f01f6352d2cc2dd7cfc9c96508b800b8cc510 /src/node.c
parent3ef0718f9f4c9dea5014a8a0e9a67e2366b9374f (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.c42
1 files changed, 17 insertions, 25 deletions
diff --git a/src/node.c b/src/node.c
index fd6526c..ea09c30 100644
--- a/src/node.c
+++ b/src/node.c
@@ -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;