X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=main.c;h=ab9520ade17bfbb42119d05c398aacca87e8bdf0;hp=840a6a730fe83065b663ef92875cdb1948ba8fc9;hb=fe296de42f96780b4a3c7c2647775ec3d8a5e59d;hpb=1dce501b7058000e19421af246ec14fd98aceab9 diff --git a/main.c b/main.c index 840a6a7..ab9520a 100644 --- a/main.c +++ b/main.c @@ -21,9 +21,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ +#include +#include +#include +#include + #include "gmqcc.h" #include "lexer.h" -#include /* TODO: cleanup this whole file .. it's a fuckign mess */ @@ -44,7 +48,7 @@ static ppitem *ppems = NULL; static const char *app_name; -static void version() { +static void version(void) { con_out("GMQCC %d.%d.%d Built %s %s\n" GMQCC_DEV_VERSION_STRING, GMQCC_VERSION_MAJOR, GMQCC_VERSION_MINOR, @@ -54,7 +58,7 @@ static void version() { ); } -static int usage() { +static int usage(void) { con_out("usage: %s [options] [files...]", app_name); con_out("options:\n" " -h, --help show this help message\n" @@ -170,9 +174,11 @@ static bool options_parse(int argc, char **argv) { opts_set(opts.werror, WARN_INVALID_PARAMETER_COUNT, true); opts_set(opts.werror, WARN_MISSING_RETURN_VALUES, true); opts_set(opts.flags, EXPRESSIONS_FOR_BUILTINS, true); + opts_set(opts.warn, WARN_BREAKDEF, true); OPTS_OPTION_U32(OPTION_STANDARD) = COMPILER_GMQCC; + OPTS_OPTION_BOOL(OPTION_STATISTICS) = true; } else if (!strcmp(argarg, "qcc")) { @@ -189,6 +195,7 @@ static bool options_parse(int argc, char **argv) { opts_set(opts.flags, ASSIGN_FUNCTION_TYPES, true); opts_set(opts.flags, CORRECT_TERNARY, false); opts_set(opts.warn, WARN_TERNARY_PRECEDENCE, true); + opts_set(opts.warn, WARN_BREAKDEF, true); OPTS_OPTION_U32(OPTION_STANDARD) = COMPILER_FTEQCC; @@ -404,7 +411,7 @@ static bool options_parse(int argc, char **argv) { con_out("option -O requires a numerical argument, or optimization name with an optional 'no-' prefix\n"); return false; } - if (isdigit(argarg[0])) { + if (util_isdigit(argarg[0])) { uint32_t val = (uint32_t)strtol(argarg, NULL, 10); OPTS_OPTION_U32(OPTION_O) = val; opts_setoptimlevel(val); @@ -529,9 +536,9 @@ static bool progs_nextline(char **out, size_t *alen,FILE *src) { return false; /* start at first non-blank */ - for (start = line; isspace(*start); ++start) {} + for (start = line; util_isspace(*start); ++start) {} /* end at the first non-blank */ - for (end = start; *end && !isspace(*end); ++end) {} + for (end = start; *end && !util_isspace(*end); ++end) {} *out = line; /* move the actual filename to the beginning */ @@ -655,9 +662,10 @@ int main(int argc, char **argv) { } if (!vec_size(items)) { - FILE *src; - char *line; + FILE *src; + char *line = NULL; size_t linelen = 0; + bool hasline = false; progs_src = true; @@ -668,28 +676,23 @@ int main(int argc, char **argv) { goto cleanup; } - line = NULL; - if (!progs_nextline(&line, &linelen, src) || !line[0]) { - con_err("illformatted progs.src file: expected output filename in first line\n"); - retval = 1; - goto srcdone; - } - - if (!opts_output_wasset) { - OPTS_OPTION_STR(OPTION_OUTPUT) = util_strdup(line); - opts_output_free = true; - } - while (progs_nextline(&line, &linelen, src)) { argitem item; + if (!line[0] || (line[0] == '/' && line[1] == '/')) continue; - item.filename = util_strdup(line); - item.type = TYPE_QC; - vec_push(items, item); + + if (hasline) { + item.filename = util_strdup(line); + item.type = TYPE_QC; + vec_push(items, item); + } else if (!opts_output_wasset) { + OPTS_OPTION_STR(OPTION_OUTPUT) = util_strdup(line); + opts_output_free = true; + hasline = true; + } } -srcdone: fs_file_close(src); mem_d(line); } @@ -788,13 +791,14 @@ cleanup: vec_free(ppems); if (!OPTS_OPTION_BOOL(OPTION_PP_ONLY)) - parser_cleanup(parser); + if(parser) parser_cleanup(parser); if (opts_output_free) mem_d(OPTS_OPTION_STR(OPTION_OUTPUT)); if (operators_free) mem_d((void*)operators); lex_cleanup(); - util_meminfo(); + stat_info(); + return retval; }