summaryrefslogtreecommitdiff
path: root/src/chunk.h
diff options
context:
space:
mode:
authorNick Wellnhofer <wellnhofer@aevum.de>2014-11-18 18:27:18 +0100
committerNick Wellnhofer <wellnhofer@aevum.de>2014-11-18 18:43:04 +0100
commit3f9fec6998fccabe5d61bfe84b9d2431f9d5ae53 (patch)
tree7a81e02d98354252f1c0c009031ba3e918bf3811 /src/chunk.h
parent41a73d5285368d19ac1ef17a7992bf13a352817c (diff)
Add node constructor and accessors to the public API
The approach I'm taking is to copy inline literals internally to NULL-terminated C strings if requested by an accessor. This allows to return a 'const char *' that doesn't have to be freed by the caller.
Diffstat (limited to 'src/chunk.h')
-rw-r--r--src/chunk.h39
1 files changed, 28 insertions, 11 deletions
diff --git a/src/chunk.h b/src/chunk.h
index 9dd56b6..7a1dbc3 100644
--- a/src/chunk.h
+++ b/src/chunk.h
@@ -8,15 +8,15 @@
#include "buffer.h"
typedef struct {
- const unsigned char *data;
+ unsigned char *data;
int len;
- int alloc;
+ int alloc; // also implies a NULL-terminated string
} cmark_chunk;
static inline void cmark_chunk_free(cmark_chunk *c)
{
if (c->alloc)
- free((char *)c->data);
+ free(c->data);
c->data = NULL;
c->alloc = 0;
@@ -55,21 +55,38 @@ static inline int cmark_chunk_strchr(cmark_chunk *ch, int c, int offset)
return p ? (int)(p - ch->data) : ch->len;
}
-static inline unsigned char *cmark_chunk_to_cstr(cmark_chunk *c)
+static inline const char *cmark_chunk_to_cstr(cmark_chunk *c)
{
unsigned char *str;
- str = (unsigned char *)calloc(c->len + 1, sizeof(*str));
- if(str != NULL) {
- memcpy(str, c->data, c->len);
- str[c->len] = 0;
- }
- return str;
+ if (c->alloc) {
+ return (char *)c->data;
+ }
+ str = (unsigned char *)malloc(c->len + 1);
+ if(str != NULL) {
+ memcpy(str, c->data, c->len);
+ str[c->len] = 0;
+ }
+ c->data = str;
+ c->alloc = 1;
+
+ return (char *)str;
+}
+
+static inline void cmark_chunk_set_cstr(cmark_chunk *c, const char *str)
+{
+ if (c->alloc) {
+ free(c->data);
+ }
+ c->len = strlen(str);
+ c->data = (unsigned char *)malloc(c->len + 1);
+ c->alloc = 1;
+ memcpy(c->data, str, c->len + 1);
}
static inline cmark_chunk cmark_chunk_literal(const char *data)
{
- cmark_chunk c = {(const unsigned char *)data, data ? strlen(data) : 0, 0};
+ cmark_chunk c = {(unsigned char *)data, data ? strlen(data) : 0, 0};
return c;
}