diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/html/html.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/html/html.c b/src/html/html.c index fde1cb4..6d60149 100644 --- a/src/html/html.c +++ b/src/html/html.c @@ -8,6 +8,63 @@ #include "debug.h" #include "html/houdini.h" +typedef struct RenderStack { + struct RenderStack *previous; + chunk literal; + union { + node_inl *inl; + node_block *block; + } next_sibling; + bool tight; +} render_stack; + +static void free_render_stack(render_stack * stack) +{ + render_stack * tempstack; + while (stack) { + tempstack = stack; + stack = stack->previous; + chunk_free(&tempstack->literal); + free(tempstack); + } +} + +static render_stack* push_inline(render_stack* stack, + node_inl* inl, + char* literal) +{ + render_stack* newstack; + newstack = (render_stack*)malloc(sizeof(render_stack)); + newstack->previous = stack; + newstack->next_sibling.inl = inl; + newstack->literal = chunk_literal(literal); + return newstack; +} + +static render_stack* push_block(render_stack* stack, + node_block* block, + char* literal, + bool tight) +{ + render_stack* newstack; + newstack = (render_stack*)malloc(sizeof(render_stack)); + newstack->previous = stack; + newstack->next_sibling.block = block; + newstack->literal = chunk_literal(literal); + newstack->tight = tight; + return newstack; +} + +static render_stack* pop_render_stack(render_stack* stack) +{ + render_stack* top = stack; + if (stack == NULL) { + return NULL; + } + stack = stack->previous; + return top; +} + // Functions to convert node_block and inline lists to HTML strings. static void escape_html(strbuf *dest, const unsigned char *source, int length) |