#include #include #include #include #include"lexer.h" #include"parse.h" #include"ntc.h" #include"reporting.h" #include"cg.h" #include"dumberdowner.h" #include"x86.h" #include"utils.h" static int argc; static char **argv; static char **includePaths; const char **ntc_get_import_paths() { return (const char**) includePaths; } static const char *ntc_get_arg_from(size_t *i, const char *name) { for(; *i < argc; (*i)++) { if(strstr(argv[*i], name) == argv[*i]) { return argv[*i] + strlen(name) + 1; } } return NULL; } const char* ntc_get_arg(const char *name) { size_t i = 1; return ntc_get_arg_from(&i, name); } intmax_t ntc_get_int(const char *name) { const char *val = ntc_get_arg(name); if(!val) { return 0; } long result = 0; if(!unstupid_strtol(val, (const char**) &val, 0, &result)) { return 0; } return result; } int main(int argc_, char **argv_) { argc = argc_; argv = argv_; if(x86_target() == IUNKNOWN86) { stahp(0, 0, "Unknown architecture %s", ntc_get_arg("target")); } const char *in = ntc_get_arg("in"); size_t includePathsCount = 1; includePaths = malloc(sizeof(*includePaths)); includePaths[0] = strdup(in ? dirname(strdup(in)) : "."); for(size_t i = 1; i < argc; i++) { const char *path = ntc_get_arg_from(&i, "inc"); if(!path) { break; } includePaths = realloc(includePaths, sizeof(*includePaths) * (++includePathsCount)); includePaths[includePathsCount - 1] = path; } FILE *f = in ? fopen(in, "rb") : stdin; if(!f) { stahp(0, 0, "Failed to read input (%s)", strerror(errno)); } Token *tokens = nct_lex(f); if(in) fclose(f); AST *chunk = nct_parse(tokens); free(tokens); if(ntc_get_int("pdbg")) { char *astdump = ast_dump(chunk); fprintf(stderr, "### ORIGINAL ###\n%s\n", astdump); free(astdump); } dumben_pre(chunk); dumben_go(chunk); while(!cg_go(chunk)) { dumben_go(chunk); if(ntc_get_int("pdbg")) { char *astdump = ast_dump(chunk); fprintf(stderr, "### CG FAILURE ###\n%s\n", astdump); free(astdump); } } return 0; }