From 8b779d6e9087e967f0c3678cb4bf6fa60e62e06a Mon Sep 17 00:00:00 2001 From: overflowerror Date: Sat, 5 Jun 2021 00:20:08 +0200 Subject: [PATCH] basic render structure block works --- src/main.c | 18 ++++++++++++++++++ src/parser.y | 15 +++++++++++++++ src/tree.c | 9 +++++++++ src/tree.h | 4 +++- 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 6a48231..2d418b6 100644 --- a/src/main.c +++ b/src/main.c @@ -30,6 +30,8 @@ void generateHeader() { fprintf(output, "\n"); fprintf(output, "extern void _registerTemplate(const char*, void (*)(FILE*, va_list), size_t (*)(va_list));\n"); fprintf(output, "\n"); + fprintf(output, "#define _renderTemplate(f, t, ...) renderTemplate(t, f, __VA_ARGS__)\n"); + fprintf(output, "\n"); for (size_t i = 0; i < result.stats.no; i++) { fprintf(output, "%s\n", result.stats.texts[i]); } @@ -117,6 +119,11 @@ void generateOutputNodeSize(int indentation, struct node node) { fprintf(output, "%s += snprintf(NULL, 0, %s);\n", SIZE_ACCUMULATOR_VAR, node.value.text); } +void generateRenderNodeSize(int indentation, struct node node) { + indent(indentation); + fprintf(output, "%s += sizeTemplate(%s);\n", SIZE_ACCUMULATOR_VAR, node.value.text); +} + void parseTreeSize(int indentation, struct tree tree) { for (size_t i = 0; i < tree.kidsno; i++) { switch(tree.kids[i].type) { @@ -129,6 +136,9 @@ void parseTreeSize(int indentation, struct tree tree) { case OUTPUT_NODE: generateOutputNodeSize(indentation, tree.kids[i]); break; + case RENDER_NODE: + generateRenderNodeSize(indentation, tree.kids[i]); + break; default: panic("unknown node type"); } @@ -170,6 +180,11 @@ void generateOutputNode(int indentation, struct node node) { fprintf(output, "fprintf(out, %s);\n", node.value.text); } +void generateRenderNode(int indentation, struct node node) { + indent(indentation); + fprintf(output, "_renderTemplate(out, %s);\n", node.value.text); +} + void parseTree(int indentation, struct tree tree) { for (size_t i = 0; i < tree.kidsno; i++) { switch(tree.kids[i].type) { @@ -182,6 +197,9 @@ void parseTree(int indentation, struct tree tree) { case OUTPUT_NODE: generateOutputNode(indentation, tree.kids[i]); break; + case RENDER_NODE: + generateRenderNode(indentation, tree.kids[i]); + break; default: panic("unknown node type"); } diff --git a/src/parser.y b/src/parser.y index ca5b1b1..7701177 100644 --- a/src/parser.y +++ b/src/parser.y @@ -20,6 +20,7 @@ extern struct template result; struct template template; char* text; + int nodeType; } %type