X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=ct.c;h=93eac2e425d3073dca322f99ebbf5faa9c229fa0;hb=1b621a6f90a8e8a75832bcc524aaea4e5ff1ca56;hp=3506b8cc60ed85c2f4445f028da281bb94265987;hpb=8001a0abc5f72c5055a76c566b8b6f04ba784b1c;p=~andy%2Fct diff --git a/ct.c b/ct.c index 3506b8c..93eac2e 100644 --- a/ct.c +++ b/ct.c @@ -1,4 +1,5 @@ #include +#include #include #include "parse.h" @@ -8,33 +9,50 @@ gpointer parse(FILE *input, GList **data, GList **code); int main(int argc, char **argv) { /* Parse arguments */ - int option_log_level = 7; + char *option_output = NULL; GOptionEntry entries[] = { - {"debug", 'd', 0, G_OPTION_ARG_INT, &option_log_level, - "Change default log level", "[1-7]"}, + {"output", 'o', 0, G_OPTION_ARG_STRING, &option_output, + "Output file", ""}, {NULL} }; - GOptionContext *context = g_option_context_new("infile"); + GOptionContext *context = g_option_context_new("[template]"); g_option_context_add_main_entries(context, entries, NULL); g_option_context_parse(context, &argc, &argv, NULL); - FILE *input = stdin; - for (int i = 1; i < argc; i++) - if (g_str_has_suffix(argv[i], ".ct")) - input = fopen(argv[i], "r"); + /* Handle input and output */ + FILE *input = stdin; + if (argv[1] && !g_str_equal(input, "-")) + input = fopen(argv[1], "r"); + if (!input) + g_error("invalid input file"); - /* Start compiling */ + FILE *output = stdout; + if (option_output && !g_str_equal(option_output, "-")) + output = fopen(option_output, "w"); + else if (input != stdin && option_output == NULL) { + char *outf = g_strdup(argv[1]); + outf[strlen(outf)-1] = '\0'; + output = fopen(outf, "w"); + g_free(outf); + } + if (!output) + g_error("invalid output file"); + + /* Start compiling */ GList *data = NULL; GList *code = NULL; - parse(input, &data, &code); + parse(input, &data, &code); data = g_list_reverse(data); code = g_list_reverse(code); - g_print("#include \n"); - g_print("\n"); + fprintf(output, "#include \n"); + fprintf(output, "\n"); for (GList *cur = data; cur; cur = cur->next) - g_print("%s", cur->data); - g_print("\n"); + fprintf(output, "%s", (gchar *)cur->data); + fprintf(output, "\n"); for (GList *cur = code; cur; cur = cur->next) - g_print("%s", cur->data); + fprintf(output, "%s", (gchar *)cur->data); + + fclose(input); + fclose(output); }