#include "arg.h" #include "cgen.h" #include "lex.h" #include "parse.h" #include #include #include #include int main(int argc, char *argv[]) { const char *fname = ""; struct args args = {.name = *argv}; struct lex l = {0}; struct ast a = {0}; struct cgen c = {0}; FILE *f = stdin; int ret = EXIT_FAILURE; if (argc == 1) { fprintf(stderr, "%s [options ...] file\n", *argv); goto end; } arg_defaults(&args); for (int i = 1; i < argc; i++) if (arg(&args, argv[i])) goto end; if (args.src) { if (!(f = fopen(args.src, "rb"))) { fprintf(stderr, "%s: fopen(3) %s: %s\n", *argv, args.src, strerror(errno)); goto end; } fname = args.src; } l.loc.f = fname; l.args = a.args = &args; if (lex(&l, f) || parse(&l, &a) || cgen(&a, &c)) goto end; ret = EXIT_SUCCESS; end: if (f && f != stdin && fclose(f)) { perror("fclose(3)"); ret = EXIT_FAILURE; } cgen_free(&c); ast_free(&a); lex_free(&l); arg_free(&args); return ret; }