diff options
| author | Nick Wellnhofer <wellnhofer@aevum.de> | 2020-01-18 22:27:13 +0100 | 
|---|---|---|
| committer | John MacFarlane <jgm@berkeley.edu> | 2020-01-23 08:25:54 -0800 | 
| commit | 3acbdf0965859c55fa36c65a4c0e17e92012687c (patch) | |
| tree | 11cb19bc51d83d159f54d5a15be0533c4dfb3d96 /src | |
| parent | df7ef9ed7b5f418897df557c9de88eaba2174703 (diff) | |
Use C string instead of chunk for code info and literal
Use zero-terminated C strings instead of cmark_chunks without storing
the length. The length of code literals will be readded in a later
commit. strlen overhead for code info should be negligible.
Reduces size of struct cmark_node by 8 bytes.
Diffstat (limited to 'src')
| -rw-r--r-- | src/blocks.c | 20 | ||||
| -rw-r--r-- | src/html.c | 11 | ||||
| -rw-r--r-- | src/node.c | 12 | ||||
| -rw-r--r-- | src/node.h | 4 | ||||
| -rw-r--r-- | src/xml.c | 7 | 
5 files changed, 30 insertions, 24 deletions
| diff --git a/src/blocks.c b/src/blocks.c index b6077eb..5214f47 100644 --- a/src/blocks.c +++ b/src/blocks.c @@ -302,11 +302,15 @@ static cmark_node *finalize(cmark_parser *parser, cmark_node *b) {        }        assert(pos < node_content->size); -      cmark_strbuf tmp = CMARK_BUF_INIT(parser->mem); -      houdini_unescape_html_f(&tmp, node_content->ptr, pos); -      cmark_strbuf_trim(&tmp); -      cmark_strbuf_unescape(&tmp); -      b->as.code.info = cmark_chunk_buf_detach(&tmp); +      if (pos == 0) { +        b->as.code.info = NULL; +      } else { +        cmark_strbuf tmp = CMARK_BUF_INIT(parser->mem); +        houdini_unescape_html_f(&tmp, node_content->ptr, pos); +        cmark_strbuf_trim(&tmp); +        cmark_strbuf_unescape(&tmp); +        b->as.code.info = cmark_strbuf_detach(&tmp); +      }        if (node_content->ptr[pos] == '\r')          pos += 1; @@ -314,7 +318,7 @@ static cmark_node *finalize(cmark_parser *parser, cmark_node *b) {          pos += 1;        cmark_strbuf_drop(node_content, pos);      } -    b->as.code.literal = cmark_chunk_buf_detach(node_content); +    b->as.code.literal = cmark_strbuf_detach(node_content);      break;    case CMARK_NODE_HTML_BLOCK: @@ -972,7 +976,7 @@ static void open_new_blocks(cmark_parser *parser, cmark_node **container,        (*container)->as.code.fence_length = (matched > 255) ? 255 : matched;        (*container)->as.code.fence_offset =            (int8_t)(parser->first_nonspace - parser->offset); -      (*container)->as.code.info = cmark_chunk_literal(""); +      (*container)->as.code.info = NULL;        S_advance_offset(parser, input,                         parser->first_nonspace + matched - parser->offset,                         false); @@ -1074,7 +1078,7 @@ static void open_new_blocks(cmark_parser *parser, cmark_node **container,        (*container)->as.code.fence_char = 0;        (*container)->as.code.fence_length = 0;        (*container)->as.code.fence_offset = 0; -      (*container)->as.code.info = cmark_chunk_literal(""); +      (*container)->as.code.info = NULL;      } else {        break; @@ -146,25 +146,26 @@ static int S_render_node(cmark_node *node, cmark_event_type ev_type,    case CMARK_NODE_CODE_BLOCK:      cr(html); -    if (node->as.code.info.len == 0) { +    if (node->as.code.info == NULL || node->as.code.info[0] == 0) {        cmark_strbuf_puts(html, "<pre");        S_render_sourcepos(node, html, options);        cmark_strbuf_puts(html, "><code>");      } else {        bufsize_t first_tag = 0; -      while (first_tag < node->as.code.info.len && -             !cmark_isspace(node->as.code.info.data[first_tag])) { +      while (node->as.code.info[first_tag] && +             !cmark_isspace(node->as.code.info[first_tag])) {          first_tag += 1;        }        cmark_strbuf_puts(html, "<pre");        S_render_sourcepos(node, html, options);        cmark_strbuf_puts(html, "><code class=\"language-"); -      escape_html(html, node->as.code.info.data, first_tag); +      escape_html(html, node->as.code.info, first_tag);        cmark_strbuf_puts(html, "\">");      } -    escape_html(html, node->as.code.literal.data, node->as.code.literal.len); +    escape_html(html, node->as.code.literal, +                strlen((char *)node->as.code.literal));      cmark_strbuf_puts(html, "</code></pre>\n");      break; @@ -109,8 +109,8 @@ static void S_free_nodes(cmark_node *e) {      cmark_strbuf_free(&e->content);      switch (e->type) {      case CMARK_NODE_CODE_BLOCK: -      cmark_chunk_free(NODE_MEM(e), &e->as.code.info); -      cmark_chunk_free(NODE_MEM(e), &e->as.code.literal); +      NODE_MEM(e)->free(e->as.code.info); +      NODE_MEM(e)->free(e->as.code.literal);        break;      case CMARK_NODE_TEXT:      case CMARK_NODE_HTML_INLINE: @@ -298,7 +298,7 @@ const char *cmark_node_get_literal(cmark_node *node) {      return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.literal);    case CMARK_NODE_CODE_BLOCK: -    return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.code.literal); +    return (char *)node->as.code.literal;    default:      break; @@ -321,7 +321,7 @@ int cmark_node_set_literal(cmark_node *node, const char *content) {      return 1;    case CMARK_NODE_CODE_BLOCK: -    cmark_chunk_set_cstr(NODE_MEM(node), &node->as.code.literal, content); +    cmark_set_cstr(NODE_MEM(node), &node->as.code.literal, content);      return 1;    default: @@ -478,7 +478,7 @@ const char *cmark_node_get_fence_info(cmark_node *node) {    }    if (node->type == CMARK_NODE_CODE_BLOCK) { -    return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.code.info); +    return node->as.code.info ? (char *)node->as.code.info : "";    } else {      return NULL;    } @@ -490,7 +490,7 @@ int cmark_node_set_fence_info(cmark_node *node, const char *info) {    }    if (node->type == CMARK_NODE_CODE_BLOCK) { -    cmark_chunk_set_cstr(NODE_MEM(node), &node->as.code.info, info); +    cmark_set_cstr(NODE_MEM(node), &node->as.code.info, info);      return 1;    } else {      return 0; @@ -23,8 +23,8 @@ typedef struct {  } cmark_list;  typedef struct { -  cmark_chunk info; -  cmark_chunk literal; +  unsigned char *info; +  unsigned char *literal;    uint8_t fence_length;    uint8_t fence_offset;    unsigned char fence_char; @@ -95,13 +95,14 @@ static int S_render_node(cmark_node *node, cmark_event_type ev_type,        cmark_strbuf_puts(xml, buffer);        break;      case CMARK_NODE_CODE_BLOCK: -      if (node->as.code.info.len > 0) { +      if (node->as.code.info) {          cmark_strbuf_puts(xml, " info=\""); -        escape_xml(xml, node->as.code.info.data, node->as.code.info.len); +        escape_xml(xml, node->as.code.info, strlen((char *)node->as.code.info));          cmark_strbuf_putc(xml, '"');        }        cmark_strbuf_puts(xml, " xml:space=\"preserve\">"); -      escape_xml(xml, node->as.code.literal.data, node->as.code.literal.len); +      escape_xml(xml, node->as.code.literal, +                 strlen((char *)node->as.code.literal));        cmark_strbuf_puts(xml, "</");        cmark_strbuf_puts(xml, cmark_node_get_type_string(node));        literal = true; | 
