X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=main.c;h=850ce0e933f15ddb53b9112256ac89f394d5d2af;hp=107098a6e582acf312b9663b2511ec651c2500aa;hb=056779d3b88bf77190baa2b40d0f59f6d3c5f0f6;hpb=6bc29a1601b6326dad807ac4f1d6db9e37adb3b6 diff --git a/main.c b/main.c index 107098a..850ce0e 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 + * Copyright (C) 2012, 2013 * Dale Weiler * Wolfgang Bumiller * @@ -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" @@ -156,7 +158,14 @@ 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_set(opts.flags, INITIALIZED_NONCONSTANTS, true); + opts_set(opts.werror, WARN_INVALID_PARAMETER_COUNT, true); + opts_set(opts.werror, WARN_MISSING_RETURN_VALUES, true); opts.standard = COMPILER_GMQCC; } else if (!strcmp(argarg, "qcc")) { @@ -261,6 +270,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 +279,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"); @@ -437,6 +451,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)) { @@ -504,13 +522,15 @@ 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); + exit(EXIT_FAILURE); } /* the standard decides which set of operators to use */ @@ -533,10 +553,10 @@ int main(int argc, char **argv) { operators[operator_count-1].id != opid2(':','?')) { con_err("internal error: operator precedence table wasn't updated correctly!\n"); - exit(1); + exit(EXIT_FAILURE); } 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])); @@ -550,7 +570,7 @@ int main(int argc, char **argv) { con_out("Flag %s = %i\n", opts_flag_list[itr].name, OPTS_FLAG(itr)); for (itr = 0; itr < COUNT_WARNINGS; ++itr) con_out("Warning %s = %i\n", opts_warn_list[itr].name, OPTS_WARN(itr)); - + con_out("output = %s\n", opts.output); con_out("optimization level = %d\n", opts.O); con_out("standard = %i\n", opts.standard); @@ -566,7 +586,7 @@ int main(int argc, char **argv) { } } else { - /* TODO: stdout without stdout .. */ + outfile = con_default_out(); } } @@ -647,12 +667,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" : @@ -681,7 +701,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; } @@ -712,7 +732,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]);