diff --git a/ftepp.c b/ftepp.c index 865cd4e..4318633 100644 --- a/ftepp.c +++ b/ftepp.c @@ -62,8 +62,9 @@ typedef struct { ppcondition *conditions; ppmacro **macros; - bool output_string; + bool to_string; char *output; + FILE *output_file; } ftepp_t; #define ftepp_tokval(f) ((f)->lex->tok.value) @@ -171,7 +172,10 @@ static void ftepp_delete(ftepp_t *self) ppmacro_delete(self->macros[i]); vec_free(self->macros); vec_free(self->conditions); - lex_close(self->lex); + if (self->lex) + lex_close(self->lex); + if (self->output_file) + fclose(self->output_file); mem_d(self); } @@ -181,8 +185,8 @@ static void ftepp_out(ftepp_t *ftepp, const char *str, bool ignore_cond) { size_t len; char *data; - if (!ftepp->output_string) { - printf("%s", str); + if (!ftepp->to_string) { + fprintf((ftepp->output_file ? ftepp->output_file : stdout), "%s", str); return; } len = strlen(str); @@ -446,7 +450,7 @@ static bool ftepp_preprocess(ftepp_t *ftepp); static bool ftepp_macro_expand(ftepp_t *ftepp, ppmacro *macro, macroparam *params) { char *old_string = ftepp->output; - bool old_string_flag = ftepp->output_string; + bool old_string_flag = ftepp->to_string; lex_file *old_lexer = ftepp->lex; bool retval = true; @@ -457,8 +461,8 @@ static bool ftepp_macro_expand(ftepp_t *ftepp, ppmacro *macro, macroparam *param if (!vec_size(macro->output)) return true; - ftepp->output = NULL; - ftepp->output_string = true; + ftepp->output = NULL; + ftepp->to_string = true; for (o = 0; o < vec_size(macro->output); ++o) { pptoken *out = macro->output[o]; switch (out->token) { @@ -505,8 +509,8 @@ static bool ftepp_macro_expand(ftepp_t *ftepp, ppmacro *macro, macroparam *param retval = false; goto cleanup; } - ftepp->output = old_string; - ftepp->output_string = old_string_flag; + ftepp->output = old_string; + ftepp->to_string = old_string_flag; ftepp->lex = inlex; if (!ftepp_preprocess(ftepp)) { lex_close(ftepp->lex); @@ -515,9 +519,9 @@ static bool ftepp_macro_expand(ftepp_t *ftepp, ppmacro *macro, macroparam *param } cleanup: - ftepp->lex = old_lexer; - ftepp->output = old_string; - ftepp->output_string = old_string_flag; + ftepp->lex = old_lexer; + ftepp->output = old_string; + ftepp->to_string = old_string_flag; return retval; } @@ -1052,13 +1056,17 @@ bool ftepp_preprocess_string(const char *name, const char *str) return ftepp_preprocess_done(); } -bool ftepp_init() +bool ftepp_init(FILE *out) { ftepp = ftepp_new(); + ftepp->output_file = out; return !!ftepp; } void ftepp_finish() { + if (!ftepp) + return; ftepp_delete(ftepp); + ftepp = NULL; } diff --git a/gmqcc.h b/gmqcc.h index d99a778..c421970 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -755,7 +755,7 @@ void parser_cleanup (); /*===================================================================*/ /*====================== ftepp.c commandline ========================*/ /*===================================================================*/ -bool ftepp_init (); +bool ftepp_init (FILE *out); bool ftepp_preprocess_file (const char *filename); bool ftepp_preprocess_string(const char *name, const char *str); void ftepp_finish (); diff --git a/main.c b/main.c index d1ac7f1..1301e75 100644 --- a/main.c +++ b/main.c @@ -415,6 +415,7 @@ int main(int argc, char **argv) { size_t itr; int retval = 0; bool opts_output_free = false; + bool progs_src = false; app_name = argv[0]; con_init(); @@ -473,7 +474,16 @@ int main(int argc, char **argv) { } } if (opts_pp_only || opts_standard == COMPILER_FTEQCC) { - if (!ftepp_init()) { + FILE *out = NULL; + if (opts_output_wasset) { + out = util_fopen(opts_output, "wb"); + if (!out) { + con_err("failed to open `%s` for writing\n", opts_output); + retval = 1; + goto cleanup; + } + } + if (!ftepp_init(out)) { con_err("failed to initialize parser\n"); retval = 1; goto cleanup; @@ -482,9 +492,52 @@ int main(int argc, char **argv) { util_debug("COM", "starting ...\n"); + if (!vec_size(items)) { + FILE *src; + char *line; + size_t linelen = 0; + + progs_src = true; + + src = util_fopen("progs.src", "rb"); + if (!src) { + con_err("failed to open `progs.src` for reading\n"); + retval = 1; + goto cleanup; + } + + line = NULL; + if (!progs_nextline(&line, &linelen, src) || !line[0]) { + con_err("illformatted progs.src file: expected output filename in first line\n"); + retval = 1; + goto srcdone; + } + + if (!opts_output_wasset) { + opts_output = util_strdup(line); + opts_output_free = true; + } + + while (progs_nextline(&line, &linelen, src)) { + argitem item; + if (!line[0] || (line[0] == '/' && line[1] == '/')) + continue; + item.filename = util_strdup(line); + item.type = TYPE_QC; + vec_push(items, item); + } + +srcdone: + fclose(src); + mem_d(line); + } + + if (retval) + goto cleanup; + if (vec_size(items)) { if (!opts_pp_only) { - con_out("Mode: manual\n"); + con_out("Mode: %s\n", (progs_src ? "progs.src" : "manual")); con_out("There are %lu items to compile:\n", (unsigned long)vec_size(items)); } for (itr = 0; itr < vec_size(items); ++itr) { @@ -507,61 +560,27 @@ int main(int argc, char **argv) { retval = 1; goto cleanup; } - } - if (!parser_finish(opts_output)) { - retval = 1; - goto cleanup; - } - - } else { - FILE *src; - char *line; - size_t linelen = 0; - - if (!opts_pp_only) - con_out("Mode: progs.src\n"); - src = util_fopen("progs.src", "rb"); - if (!src) { - con_err("failed to open `progs.src` for reading\n"); - retval = 1; - goto cleanup; - } - - line = NULL; - if (!progs_nextline(&line, &linelen, src) || !line[0]) { - con_err("illformatted progs.src file: expected output filename in first line\n"); - retval = 1; - goto srcdone; - } - - if (!opts_output_wasset) { - opts_output = util_strdup(line); - opts_output_free = true; - } - - while (progs_nextline(&line, &linelen, src)) { - if (!line[0] || (line[0] == '/' && line[1] == '/')) - continue; - if (!opts_pp_only) - con_out(" src: %s\n", line); - if (!parser_compile_file(line)) { - retval = 1; - goto srcdone; + if (progs_src) { + mem_d(items[itr].filename); + items[itr].filename = NULL; } } - parser_finish(opts_output); - -srcdone: - fclose(src); - mem_d(line); + ftepp_finish(); + if (!opts_pp_only) { + if (!parser_finish(opts_output)) { + retval = 1; + goto cleanup; + } + } } /* stuff */ cleanup: util_debug("COM", "cleaning ...\n"); + ftepp_finish(); con_close(); vec_free(items);