diff options
author | Nick Wellnhofer <wellnhofer@aevum.de> | 2020-01-19 00:51:02 +0100 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2020-01-23 08:25:54 -0800 |
commit | b0a4cfa36e99c27dd2b20be8f8888fa7721bad58 (patch) | |
tree | 528ace24d0526b0dd647bcd774f348e677b78a9f /src/node.c | |
parent | 75b48c5938f5984dbcf79a579d15c9cbd6447d12 (diff) |
Use C string instead of chunk for literal text
Use zero-terminated C strings and a separate length field instead of
cmark_chunks. Literal inline text will now be copied from the parent
block's content buffer, slowing the benchmark down by 10-15%.
The node struct never references memory of other nodes now, fixing #309.
Node accessors don't have to check for delayed creation of C strings,
so parsing and iterating all literals using the public API should
actually be faster than before.
Diffstat (limited to 'src/node.c')
-rw-r--r-- | src/node.c | 7 |
1 files changed, 4 insertions, 3 deletions
@@ -116,7 +116,7 @@ static void S_free_nodes(cmark_node *e) { case CMARK_NODE_HTML_INLINE: case CMARK_NODE_CODE: case CMARK_NODE_HTML_BLOCK: - cmark_chunk_free(NODE_MEM(e), &e->as.literal); + NODE_MEM(e)->free(e->as.literal.data); break; case CMARK_NODE_LINK: case CMARK_NODE_IMAGE: @@ -295,7 +295,7 @@ const char *cmark_node_get_literal(cmark_node *node) { case CMARK_NODE_TEXT: case CMARK_NODE_HTML_INLINE: case CMARK_NODE_CODE: - return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.literal); + return node->as.literal.data ? (char *)node->as.literal.data : ""; case CMARK_NODE_CODE_BLOCK: return (char *)node->as.code.literal; @@ -317,7 +317,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: - cmark_chunk_set_cstr(NODE_MEM(node), &node->as.literal, content); + node->as.literal.len = cmark_set_cstr(NODE_MEM(node), + &node->as.literal.data, content); return 1; case CMARK_NODE_CODE_BLOCK: |