diff options
author | John MacFarlane <fiddlosopher@gmail.com> | 2014-11-18 16:45:11 -0800 |
---|---|---|
committer | John MacFarlane <fiddlosopher@gmail.com> | 2014-11-18 16:45:11 -0800 |
commit | 9370b2cfd9b6382164ab7bde36a59409d32ae498 (patch) | |
tree | 5a371e5c14340531753e446a0b84a75bab87ec29 /src/node.c | |
parent | 47580cbda73fa6ad984dc4690625eb27b54bc563 (diff) | |
parent | 1d39b50d8889155de11df40f7e89bec09e0c4681 (diff) |
Merge branch 'api_tests' of https://github.com/nwellnhof/CommonMark into nwellnhof-api_tests
Diffstat (limited to 'src/node.c')
-rw-r--r-- | src/node.c | 85 |
1 files changed, 84 insertions, 1 deletions
@@ -1,8 +1,26 @@ -#include <stddef.h> +#include <stdlib.h> +#include <string.h> #include "config.h" #include "node.h" +static void +S_node_unlink(cmark_node *node); + +cmark_node* +cmark_node_new(cmark_node_type type) { + cmark_node *node = (cmark_node *)calloc(1, sizeof(*node)); + node->type = type; + return node; +} + +void +cmark_node_destroy(cmark_node *node) { + S_node_unlink(node); + node->next = NULL; + cmark_free_nodes(node); +} + cmark_node_type cmark_node_get_type(cmark_node *node) { @@ -69,6 +87,71 @@ cmark_node_last_child(cmark_node *node) return node->last_child; } +static char* +S_strdup(const char *str) { + size_t size = strlen(str) + 1; + char *dup = (char *)malloc(size); + memcpy(dup, str, size); + return dup; +} + +const char* +cmark_node_get_content(cmark_node *node) { + switch (node->type) { + case NODE_STRING: + case NODE_INLINE_HTML: + case NODE_INLINE_CODE: + return cmark_chunk_to_cstr(&node->as.literal); + default: + break; + } + + return NULL; +} + +int +cmark_node_set_content(cmark_node *node, const char *content) { + switch (node->type) { + case NODE_STRING: + case NODE_INLINE_HTML: + case NODE_INLINE_CODE: + cmark_chunk_set_cstr(&node->as.literal, content); + return 1; + default: + break; + } + + return 0; +} + +const char* +cmark_node_get_url(cmark_node *node) { + switch (node->type) { + case NODE_LINK: + case NODE_IMAGE: + return (char *)node->as.link.url; + default: + break; + } + + return NULL; +} + +int +cmark_node_set_url(cmark_node *node, const char *url) { + switch (node->type) { + case NODE_LINK: + case NODE_IMAGE: + free(node->as.link.url); + node->as.link.url = (unsigned char *)S_strdup(url); + return 1; + default: + break; + } + + return 0; +} + static inline bool S_is_block(cmark_node *node) { return node->type >= CMARK_NODE_FIRST_BLOCK |