diff options
Diffstat (limited to 'src/bindings.c')
-rw-r--r-- | src/bindings.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/bindings.c b/src/bindings.c new file mode 100644 index 0000000..235e2df --- /dev/null +++ b/src/bindings.c @@ -0,0 +1,66 @@ +#include <stdlib.h> +#include <string.h> +#include <lua.h> + +#include "honeysuckle.h" +#include "md4c-html.h" +#include "bindings.h" + +struct concat_buffer { + char *buf; + size_t size; + int index; + bool ok; +}; + +static void md_callback(const MD_CHAR *html, MD_SIZE size, void *data) +{ + struct concat_buffer *d = data; + + if (!d->ok) + return; + + if (d->index + size >= d->size) { + char *new_buf = realloc(d->buf, d->size * 2); + if (new_buf == NULL) { + // failed to allocate memory, abort! + d->ok = false; + return; + } + + d->buf = new_buf; + d->size *= 2; + } + + memcpy((d->buf) + d->index, html, size); + d->index += size; +} + +int markdown(lua_State *L) +{ + char *markdown_buffer; + hs_parse_args(L, hs_str(markdown_buffer)); + size_t len = strlen(markdown_buffer); + + unsigned int md_flags = MD_FLAG_TABLES | MD_FLAG_STRIKETHROUGH | MD_FLAG_UNDERLINE; + + struct concat_buffer data; + data.buf = malloc(128 * sizeof(char)); + data.size = 128 * sizeof(char); + data.index = 0; + data.ok = true; + + // fill out the buffer + int error = md_html(markdown_buffer, len, md_callback, &data, md_flags, 0); + if (error) + hs_throw_error(L, "markdown parsing failed!"); + + if (data.ok == false) + hs_throw_error(L, "encountered error (re)allocating html buffer memory!"); + + lua_pushstring(L, data.buf); + + free(data.buf); + + return 1; +} |