X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=main.c;h=244d57000c6afae7f0473e3e6bd3eb41b8d2f49a;hp=6a0fe1667a60a740fd7db2cd23323edaaa0c787b;hb=03c079cb8ca0805822e4101a6ccb7aa6155defd3;hpb=4ef0e8c66e3373a5fd824864735185d1eb28a13d diff --git a/main.c b/main.c index 6a0fe16..244d570 100644 --- a/main.c +++ b/main.c @@ -23,6 +23,7 @@ */ #include "gmqcc.h" #include "lexer.h" +#include /* TODO: cleanup this whole file .. it's a fuckign mess */ @@ -61,6 +62,7 @@ static int usage() { con_out(" -o, --output=file output file, defaults to progs.dat\n" " -s filename add a progs.src file to be used\n"); con_out(" -E stop after preprocessing\n"); + con_out(" -q, --quiet be less verbose\n"); con_out(" -config file use the specified ini file\n"); con_out(" -std=standard select one of the following standards\n" " -std=qcc original QuakeC\n" @@ -71,8 +73,10 @@ static int usage() { " -fhelp list possible flags\n"); con_out(" -W enable a warning\n" " -Wno- disable a warning\n" - " -Wall enable all warnings\n" - " -Werror treat warnings as errors\n"); + " -Wall enable all warnings\n"); + con_out(" -Werror treat warnings as errors\n" + " -Werror- treat a warning as error\n" + " -Wno-error- opposite of the above\n"); con_out(" -Whelp list possible warnings\n"); con_out(" -O optimization level\n" " -O enable specific optimization\n" @@ -137,8 +141,8 @@ static bool options_parse(int argc, char **argv) { bool argend = false; size_t itr; char buffer[1024]; - char *redirout = (char*)stdout; - char *redirerr = (char*)stderr; + char *redirout = NULL; + char *redirerr = NULL; char *config = NULL; while (!argend && argc > 1) { @@ -154,7 +158,11 @@ static bool options_parse(int argc, char **argv) { if (options_long_gcc("std", &argc, &argv, &argarg)) { if (!strcmp(argarg, "gmqcc") || !strcmp(argarg, "default")) { - opts_set(opts.flags, ADJUST_VECTOR_FIELDS, true); + opts_set(opts.flags, ADJUST_VECTOR_FIELDS, true); + opts_set(opts.flags, CORRECT_LOGIC, true); + opts_set(opts.flags, FALSE_EMPTY_STRINGS, false); + opts_set(opts.flags, TRUE_EMPTY_STRINGS, true); + opts_set(opts.flags, LOOP_LABELS, true); opts.standard = COMPILER_GMQCC; } else if (!strcmp(argarg, "qcc")) { @@ -204,8 +212,6 @@ static bool options_parse(int argc, char **argv) { /* show defaults (like pathscale) */ if (!strcmp(argv[0]+1, "show-defaults")) { - size_t itr; - char buffer[1024]; for (itr = 0; itr < COUNT_FLAGS; ++itr) { if (!OPTS_FLAG(itr)) continue; @@ -261,6 +267,7 @@ static bool options_parse(int argc, char **argv) { case 'E': opts.pp_only = true; + opts_set(opts.flags, FTEPP_PREDEFS, true); /* predefs on for -E */ break; /* debug turns on -flno */ @@ -269,6 +276,10 @@ static bool options_parse(int argc, char **argv) { opts.g = true; break; + case 'q': + opts.quiet = true; + break; + case 'D': if (!strlen(argv[0]+2)) { con_err("expected name after -D\n"); @@ -318,12 +329,18 @@ static bool options_parse(int argc, char **argv) { } exit(0); } - else if (!strcmp(argv[0]+2, "NO_ERROR")) { - opts.werror = false; + else if (!strcmp(argv[0]+2, "NO_ERROR") || + !strcmp(argv[0]+2, "NO_ERROR_ALL")) + { + for (itr = 0; itr < sizeof(opts.werror)/sizeof(opts.werror[0]); ++itr) + opts.werror[itr] = 0; break; } - else if (!strcmp(argv[0]+2, "ERROR")) { - opts.werror = true; + else if (!strcmp(argv[0]+2, "ERROR") || + !strcmp(argv[0]+2, "ERROR_ALL")) + { + for (itr = 0; itr < sizeof(opts.werror)/sizeof(opts.werror[0]); ++itr) + opts.werror[itr] = 0xFFFFFFFFL; break; } else if (!strcmp(argv[0]+2, "NONE")) { @@ -336,7 +353,19 @@ static bool options_parse(int argc, char **argv) { opts.warn[itr] = 0xFFFFFFFFL; break; } - if (!strncmp(argv[0]+2, "NO_", 3)) { + else if (!strncmp(argv[0]+2, "ERROR_", 6)) { + if (!opts_setwerror(argv[0]+8, true)) { + con_out("unknown warning: %s\n", argv[0]+2); + return false; + } + } + else if (!strncmp(argv[0]+2, "NO_ERROR_", 9)) { + if (!opts_setwerror(argv[0]+11, false)) { + con_out("unknown warning: %s\n", argv[0]+2); + return false; + } + } + else if (!strncmp(argv[0]+2, "NO_", 3)) { if (!opts_setwarn(argv[0]+5, false)) { con_out("unknown warning: %s\n", argv[0]+2); return false; @@ -419,6 +448,10 @@ static bool options_parse(int argc, char **argv) { version(); exit(0); } + else if (!strcmp(argv[0]+2, "quiet")) { + opts.quiet = true; + break; + } else { /* All long options with arguments */ if (options_long_witharg("output", &argc, &argv, &argarg)) { @@ -456,7 +489,7 @@ static bool progs_nextline(char **out, size_t *alen,FILE *src) { char *end; line = *out; - len = util_getline(&line, alen, src); + len = file_getline(&line, alen, src); if (len == -1) return false; @@ -486,10 +519,17 @@ int main(int argc, char **argv) { con_init (); opts_init("progs.dat", COMPILER_GMQCC, (1024 << 3)); + util_seed(time(0)); + if (!options_parse(argc, argv)) { return usage(); } + if (OPTS_FLAG(TRUE_EMPTY_STRINGS) && OPTS_FLAG(FALSE_EMPTY_STRINGS)) { + con_err("-ftrue-empty-strings and -ffalse-empty-strings are mutually exclusive"); + exit(1); + } + /* the standard decides which set of operators to use */ if (opts.standard == COMPILER_GMQCC) { operators = c_operators; @@ -513,7 +553,7 @@ int main(int argc, char **argv) { exit(1); } operators_free = true; - newops = mem_a(sizeof(operators[0]) * operator_count); + newops = (oper_info*)mem_a(sizeof(operators[0]) * operator_count); memcpy(newops, operators, sizeof(operators[0]) * operator_count); memcpy(&newops[operator_count-2], &operators[operator_count-1], sizeof(newops[0])); memcpy(&newops[operator_count-1], &operators[operator_count-2], sizeof(newops[0])); @@ -535,15 +575,16 @@ int main(int argc, char **argv) { if (opts.pp_only) { if (opts_output_wasset) { - outfile = util_fopen(opts.output, "wb"); + outfile = file_open(opts.output, "wb"); if (!outfile) { con_err("failed to open `%s` for writing\n", opts.output); retval = 1; goto cleanup; } } - else - outfile = stdout; + else { + outfile = con_default_out(); + } } if (!opts.pp_only) { @@ -562,6 +603,9 @@ int main(int argc, char **argv) { } } + if (OPTS_FLAG(TRUE_EMPTY_STRINGS)) + type_not_instr[TYPE_STRING] = INSTR_NOT_F; + util_debug("COM", "starting ...\n"); /* add macros */ @@ -583,7 +627,7 @@ int main(int argc, char **argv) { progs_src = true; - src = util_fopen("progs.src", "rb"); + src = file_open("progs.src", "rb"); if (!src) { con_err("failed to open `progs.src` for reading\n"); retval = 1; @@ -612,7 +656,7 @@ int main(int argc, char **argv) { } srcdone: - fclose(src); + file_close(src); mem_d(line); } @@ -620,12 +664,12 @@ srcdone: goto cleanup; if (vec_size(items)) { - if (!opts.pp_only) { + if (!opts.quiet && !opts.pp_only) { 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) { - if (!opts.pp_only) { + if (!opts.quiet && !opts.pp_only) { con_out(" item: %s (%s)\n", items[itr].filename, ( (items[itr].type == TYPE_QC ? "qc" : @@ -642,7 +686,7 @@ srcdone: } out = ftepp_get(); if (out) - fprintf(outfile, "%s", out); + file_printf(outfile, "%s", out); ftepp_flush(); } else { @@ -654,7 +698,7 @@ srcdone: } data = ftepp_get(); if (vec_size(data)) { - if (!parser_compile_string_len(items[itr].filename, data, vec_size(data))) { + if (!parser_compile_string(items[itr].filename, data, vec_size(data))) { retval = 1; goto cleanup; } @@ -685,7 +729,7 @@ srcdone: } /* stuff */ - if (!opts.pp_only) { + if (!opts.quiet && !opts.pp_only) { for (itr = 0; itr < COUNT_OPTIMIZATIONS; ++itr) { if (opts_optimizationcount[itr]) { con_out("%s: %u\n", opts_opt_list[itr].name, (unsigned int)opts_optimizationcount[itr]);