From 2dea7d0bacdf7e23d2aff929d22dff80abad07ae Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 20 May 2018 16:04:44 -0400 Subject: [PATCH] write C file --- src/main.cc | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/main.cc b/src/main.cc index 9730e4b..fd61f64 100644 --- a/src/main.cc +++ b/src/main.cc @@ -5,9 +5,12 @@ #include #include #include +#include static char preprocessed_fname[] = "/tmp/cxlppXXXXXX"; +static char c_fname[] = "/tmp/cxlcXXXXXX"; static bool preprocessed_fname_created = false; +static bool c_fname_created = false; bool preprocess(const char * input_fname) { @@ -38,8 +41,47 @@ bool preprocess(const char * input_fname) return true; } -void emit_c(Node * node) +void write_node(FILE * file, Node * node) { + switch (node->type) + { + case NODE_TYPE_LIST: + { + bool space = false; + for (auto subnode : *node->list) + { + if (space) + { + fprintf(file, " "); + } + write_node(file, subnode); + space = true; + } + } + break; + case NODE_TYPE_TOKEN: + fprintf(file, "%s", node->token.text->c_str()); + if (*node->token.text == ";") + { + fprintf(file, "\n"); + } + break; + } +} + +bool emit_c(Node * node) +{ + int fd = mkstemp(c_fname); + if (fd < 0) + { + perror("mkstemp"); + return false; + } + FILE * file = fdopen(fd, "w"); + c_fname_created = true; + write_node(file, node); + fclose(file); + return true; } int main(int argc, char * argv[])