X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=main.c;h=1ffcd998927a437459041cd79a53195b72a38465;hb=9e7143d93437ce450b5ef814e6ce5932ff775f16;hp=210d3d730a6585133c3288d778ccf22d51ef2836;hpb=1b13c86cc9ff71c482650e434118bf676d956634;p=xonotic%2Fgmqcc.git diff --git a/main.c b/main.c index 210d3d7..1ffcd99 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 + * Copyright (C) 2012 * Dale Weiler * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -21,39 +21,32 @@ * SOFTWARE. */ #include "gmqcc.h" -// todo CLEANUP this argitem thing typedef struct { char *name, type; } argitem; VECTOR_MAKE(argitem, items); -/* global options */ -bool opts_debug = false; -bool opts_memchk = false; -bool opts_darkplaces_stringtablebug = false; -bool opts_omit_nullcode = false; -int opts_compiler = COMPILER_GMQCC; - -static const int usage(const char *const app) { +static int usage(const char *app) { printf("usage:\n" " %s -c -oprog.dat -- compile file\n" " %s -a -oprog.dat -- assemble file\n" " %s -c -i -oprog.dat -- compile together (allowed multiple -i)\n" " %s -a -i -oprog.dat -- assemble together(allowed multiple -i)\n" " example:\n" - " %s -cfoo.qc -ibar.qc -oqc.dat -afoo.qs -ibar.qs -oqs.dat\n" - " additional flags:\n" + " %s -cfoo.qc -ibar.qc -oqc.dat -afoo.qs -ibar.qs -oqs.dat\n", app, app, app, app, app); + + printf(" additional flags:\n" " -debug -- turns on compiler debug messages\n" " -memchk -- turns on compiler memory leak check\n" " -help -- prints this help/usage text\n" - " -std -- select the QuakeC compile type (types below):\n" - " -std=qcc -- original QuakeC\n" + " -std -- select the QuakeC compile type (types below):\n"); + + printf(" -std=qcc -- original QuakeC\n" " -std=ftqecc -- fteqcc QuakeC\n" " -std=qccx -- qccx QuakeC\n" - " -std=gmqcc -- this compiler QuakeC (default selection)\n" - " codegen flags:\n" + " -std=gmqcc -- this compiler QuakeC (default selection)\n"); + + printf(" codegen flags:\n" " -fdarkplaces-string-table-bug -- patches the string table to work with bugged versions of darkplaces\n" - " -fomit-nullcode -- omits the generation of null code (will break everywhere see propsal.txt)\n", - app,app,app,app,app - ); + " -fomit-nullcode -- omits the generation of null code (will break everywhere see propsal.txt)\n"); return -1; } @@ -87,33 +80,38 @@ int main(int argc, char **argv) { return 0; } #define param_argument(argtype) do { \ - if (argv[1][2]) \ - items_add((argitem){util_strdup(&argv[1][2]), argtype}); \ - else { \ - ++argv; --argc; \ + argitem item; \ + if (argv[1][2]) { \ + item.name = util_strdup(&argv[1][2]); \ + item.type = argtype; \ + items_add(item); \ + } else { \ + ++argv; \ + --argc; \ if (argc <= 1) \ goto clean_params_usage; \ - items_add((argitem){util_strdup(&argv[1][0]), argtype}); \ + item.name = util_strdup(argv[1]); \ + item.type = argtype; \ + items_add(item); \ } \ } while (0) - case 'c': param_argument(0); break; /* compile */ - case 'a': param_argument(1); break; /* assemble */ - case 'i': param_argument(2); break; /* includes */ + case 'c': { param_argument(0); break; } /* compile */ + case 'a': { param_argument(1); break; } /* assemble */ + case 'i': { param_argument(2); break; } /* includes */ #undef parm_argument default: - if (!strncmp(&argv[1][1], "debug" , 5)) { opts_debug = true; break; } - if (!strncmp(&argv[1][1], "memchk", 6)) { opts_memchk = true; break; } - if (!strncmp(&argv[1][1], "help", 4)) { + if (util_strncmpexact(&argv[1][1], "debug" , 5)) { opts_debug = true; break; } + if (util_strncmpexact(&argv[1][1], "memchk", 6)) { opts_memchk = true; break; } + if (util_strncmpexact(&argv[1][1], "help", 4)) { return usage(app); - break; } /* compiler type selection */ - if (!strncmp(&argv[1][1], "std=qcc" , 7 )) { opts_compiler = COMPILER_QCC; break; } - if (!strncmp(&argv[1][1], "std=fteqcc", 10)) { opts_compiler = COMPILER_FTEQCC; break; } - if (!strncmp(&argv[1][1], "std=qccx", 8 )) { opts_compiler = COMPILER_QCCX; break; } - if (!strncmp(&argv[1][1], "std=gmqcc", 9 )) { opts_compiler = COMPILER_GMQCC; break; } - if (!strncmp(&argv[1][1], "std=", 4 )) { + if (util_strncmpexact(&argv[1][1], "std=qcc" , 7 )) { opts_compiler = COMPILER_QCC; break; } + if (util_strncmpexact(&argv[1][1], "std=fteqcc", 10)) { opts_compiler = COMPILER_FTEQCC; break; } + if (util_strncmpexact(&argv[1][1], "std=qccx", 8 )) { opts_compiler = COMPILER_QCCX; break; } + if (util_strncmpexact(&argv[1][1], "std=gmqcc", 9 )) { opts_compiler = COMPILER_GMQCC; break; } + if (util_strncmpexact(&argv[1][1], "std=", 4 )) { printf("invalid std selection, supported types:\n" " -std=qcc -- original QuakeC\n" " -std=ftqecc -- fteqcc QuakeC\n" @@ -123,53 +121,57 @@ int main(int argc, char **argv) { } /* code specific switches */ - if (!strcmp(&argv[1][1], "fdarkplaces-stringtablebug")) { + if (util_strncmpexact(&argv[1][1], "fdarkplaces-stringtablebug", 26)) { opts_darkplaces_stringtablebug = true; break; } - if (!strcmp(&argv[1][1], "fomit-nullcode")) { + if (util_strncmpexact(&argv[1][1], "fomit-nullcode", 14)) { opts_omit_nullcode = true; break; } - return usage(app); - + return printf("invalid command line argument: %s\n",argv[1]); + } ++argv; --argc; } - /* * options could depend on another option, this is where option * validity checking like that would take place. */ - if (opts_memchk && !opts_debug) + if (opts_memchk && !opts_debug) printf("Warning: cannot enable -memchk, without -debug.\n"); - + util_debug("COM", "starting ...\n"); /* multi file multi path compilation system */ for (; itr < items_elements; itr++) { switch (items_data[itr].type) { case 0: lex_init (items_data[itr].name, &lex); - lex_parse(lex); - lex_close(lex); + if (lex) { + lex_parse(lex); + lex_close(lex); + } break; case 1: asm_init (items_data[itr].name, &fpp); - asm_parse(fpp); - asm_close(fpp); + if (fpp) { + asm_parse(fpp); + asm_close(fpp); + } break; } } - util_debug("COM", "cleaning ...\n"); + util_debug("COM", "cleaning ...\n"); /* clean list */ for (itr = 0; itr < items_elements; itr++) mem_d(items_data[itr].name); mem_d(items_data); - + util_meminfo(); return 0; + clean_params_usage: for (itr = 0; itr < items_elements; itr++) mem_d(items_data[itr].name);