+
+ if (argv[0][0] == '-') {
+ /* All gcc-type long options */
+ if (options_long_gcc("std", &argc, &argv, &argarg)) {
+ if (!strcmp(argarg, "gmqcc") || !strcmp(argarg, "default")) {
+
+ opts_set(opts.flags, ADJUST_VECTOR_FIELDS, true);
+ opts.standard = COMPILER_GMQCC;
+
+ } else if (!strcmp(argarg, "qcc")) {
+
+ opts_set(opts.flags, ADJUST_VECTOR_FIELDS, false);
+ opts_set(opts.flags, ASSIGN_FUNCTION_TYPES, true);
+ opts.standard = COMPILER_QCC;
+
+ } else if (!strcmp(argarg, "fte") || !strcmp(argarg, "fteqcc")) {
+
+ opts_set(opts.flags, FTEPP, true);
+ opts_set(opts.flags, TRANSLATABLE_STRINGS, true);
+ opts_set(opts.flags, ADJUST_VECTOR_FIELDS, false);
+ opts_set(opts.flags, ASSIGN_FUNCTION_TYPES, true);
+ opts_set(opts.warn, WARN_TERNARY_PRECEDENCE, true);
+ opts_set(opts.flags, CORRECT_TERNARY, false);
+ opts.standard = COMPILER_FTEQCC;
+
+ } else if (!strcmp(argarg, "qccx")) {
+
+ opts_set(opts.flags, ADJUST_VECTOR_FIELDS, false);
+ opts.standard = COMPILER_QCCX;
+
+ } else {
+ con_out("Unknown standard: %s\n", argarg);
+ return false;
+ }
+ continue;
+ }
+ if (options_long_gcc("force-crc", &argc, &argv, &argarg)) {
+ opts.forcecrc = true;
+ opts.forced_crc = strtol(argarg, NULL, 0);
+ continue;
+ }
+ if (options_long_gcc("redirout", &argc, &argv, &redirout)) {
+ con_change(redirout, redirerr);
+ continue;
+ }
+ if (options_long_gcc("redirerr", &argc, &argv, &redirerr)) {
+ con_change(redirout, redirerr);
+ continue;
+ }
+ if (options_long_gcc("config", &argc, &argv, &argarg)) {
+ config = argarg;
+ continue;
+ }
+
+ /* show defaults (like pathscale) */
+ if (!strcmp(argv[0]+1, "show-defaults")) {
+ for (itr = 0; itr < COUNT_FLAGS; ++itr) {
+ if (!OPTS_FLAG(itr))
+ continue;
+
+ memset(buffer, 0, sizeof(buffer));
+ util_strtononcmd(opts_flag_list[itr].name, buffer, strlen(opts_flag_list[itr].name) + 1);
+
+ con_out("-f%s ", buffer);
+ }
+ for (itr = 0; itr < COUNT_WARNINGS; ++itr) {
+ if (!OPTS_WARN(itr))
+ continue;
+
+ memset(buffer, 0, sizeof(buffer));
+ util_strtononcmd(opts_warn_list[itr].name, buffer, strlen(opts_warn_list[itr].name) + 1);
+ con_out("-W%s ", buffer);
+ }
+ con_out("\n");
+ exit(0);
+ }
+
+ if (!strcmp(argv[0]+1, "debug")) {
+ opts.debug = true;
+ continue;
+ }
+ if (!strcmp(argv[0]+1, "dump")) {
+ opts.dump = true;
+ continue;
+ }
+ if (!strcmp(argv[0]+1, "dumpfin")) {
+ opts.dumpfin = true;
+ continue;
+ }
+ if (!strcmp(argv[0]+1, "memchk")) {
+ opts.memchk = true;
+ continue;
+ }
+ if (!strcmp(argv[0]+1, "nocolor")) {
+ con_color(0);
+ continue;
+ }
+
+ switch (argv[0][1]) {
+ /* -h, show usage but exit with 0 */
+ case 'h':
+ usage();
+ exit(0);
+ /* break; never reached because of exit(0) */
+
+ case 'v':
+ version();
+ exit(0);
+
+ case 'E':
+ opts.pp_only = true;
+ opts_set(opts.flags, FTEPP_PREDEFS, true); /* predefs on for -E */
+ break;
+
+ /* debug turns on -flno */
+ case 'g':
+ opts_setflag("LNO", true);
+ opts.g = true;
+ break;
+
+ case 'q':
+ opts.quiet = true;
+ break;
+
+ case 'D':
+ if (!strlen(argv[0]+2)) {
+ con_err("expected name after -D\n");
+ exit(0);
+ }
+
+ if (!(argarg = strchr(argv[0] + 2, '='))) {
+ macro.name = util_strdup(argv[0]+2);
+ macro.value = NULL;
+ } else {
+ *argarg='\0'; /* terminate for name */
+ macro.name = util_strdup(argv[0]+2);
+ macro.value = util_strdup(argarg+1);
+ }
+ vec_push(ppems, macro);
+ break;
+
+ /* handle all -fflags */
+ case 'f':
+ util_strtocmd(argv[0]+2, argv[0]+2, strlen(argv[0]+2)+1);
+ if (!strcmp(argv[0]+2, "HELP") || *(argv[0]+2) == '?') {
+ con_out("Possible flags:\n");
+ for (itr = 0; itr < COUNT_FLAGS; ++itr) {
+ util_strtononcmd(opts_flag_list[itr].name, buffer, sizeof(buffer));
+ con_out(" -f%s\n", buffer);
+ }
+ exit(0);
+ }
+ else if (!strncmp(argv[0]+2, "NO_", 3)) {
+ if (!opts_setflag(argv[0]+5, false)) {
+ con_out("unknown flag: %s\n", argv[0]+2);
+ return false;
+ }
+ }
+ else if (!opts_setflag(argv[0]+2, true)) {
+ con_out("unknown flag: %s\n", argv[0]+2);
+ return false;
+ }
+ break;
+ case 'W':
+ util_strtocmd(argv[0]+2, argv[0]+2, strlen(argv[0]+2)+1);
+ if (!strcmp(argv[0]+2, "HELP") || *(argv[0]+2) == '?') {
+ con_out("Possible warnings:\n");
+ for (itr = 0; itr < COUNT_WARNINGS; ++itr) {
+ util_strtononcmd(opts_warn_list[itr].name, buffer, sizeof(buffer));
+ con_out(" -W%s\n", buffer);
+ }
+ exit(0);
+ }
+ 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") ||
+ !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")) {
+ for (itr = 0; itr < sizeof(opts.warn)/sizeof(opts.warn[0]); ++itr)
+ opts.warn[itr] = 0;
+ break;
+ }
+ else if (!strcmp(argv[0]+2, "ALL")) {
+ for (itr = 0; itr < sizeof(opts.warn)/sizeof(opts.warn[0]); ++itr)
+ opts.warn[itr] = 0xFFFFFFFFL;
+ break;
+ }
+ 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;
+ }
+ }
+ else if (!opts_setwarn(argv[0]+2, true)) {
+ con_out("unknown warning: %s\n", argv[0]+2);
+ return false;
+ }
+ break;
+
+ case 'O':
+ if (!options_witharg(&argc, &argv, &argarg)) {
+ con_out("option -O requires a numerical argument, or optimization name with an optional 'no-' prefix\n");
+ return false;
+ }
+ if (isdigit(argarg[0])) {
+ opts.O = atoi(argarg);
+ opts_setoptimlevel(opts.O);
+ } else {
+ util_strtocmd(argarg, argarg, strlen(argarg)+1);
+ if (!strcmp(argarg, "HELP")) {
+ con_out("Possible optimizations:\n");
+ for (itr = 0; itr < COUNT_OPTIMIZATIONS; ++itr) {
+ util_strtononcmd(opts_opt_list[itr].name, buffer, sizeof(buffer));
+ con_out(" -O%-20s (-O%u)\n", buffer, opts_opt_oflag[itr]);
+ }
+ exit(0);
+ }
+ else if (!strcmp(argarg, "ALL"))
+ opts_setoptimlevel(opts.O = 9999);
+ else if (!strncmp(argarg, "NO_", 3)) {
+ if (!opts_setoptim(argarg+3, false)) {
+ con_out("unknown optimization: %s\n", argarg+3);
+ return false;
+ }
+ }
+ else {
+ if (!opts_setoptim(argarg, true)) {
+ con_out("unknown optimization: %s\n", argarg);
+ return false;
+ }
+ }
+ }
+ break;
+
+ case 'o':
+ if (!options_witharg(&argc, &argv, &argarg)) {
+ con_out("option -o requires an argument: the output file name\n");
+ return false;
+ }
+ opts.output = argarg;
+ opts_output_wasset = true;
+ break;
+
+ case 'a':
+ case 's':
+ item.type = argv[0][1] == 'a' ? TYPE_ASM : TYPE_SRC;
+ if (!options_witharg(&argc, &argv, &argarg)) {
+ con_out("option -a requires a filename %s\n",
+ (argv[0][1] == 'a' ? "containing QC-asm" : "containing a progs.src formatted list"));
+ return false;
+ }
+ item.filename = argarg;
+ vec_push(items, item);
+ break;
+
+ case '-':
+ if (!argv[0][2]) {
+ /* anything following -- is considered a non-option argument */
+ argend = true;
+ break;
+ }
+ /* All long options without arguments */
+ else if (!strcmp(argv[0]+2, "help")) {
+ usage();
+ exit(0);
+ }
+ else if (!strcmp(argv[0]+2, "version")) {
+ 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)) {
+ opts.output = argarg;
+ opts_output_wasset = true;
+ } else {
+ con_out("Unknown parameter: %s\n", argv[0]);
+ return false;
+ }
+ }
+ break;
+
+ default:
+ con_out("Unknown parameter: %s\n", argv[0]);
+ return false;
+ }
+ }
+ else
+ {
+ /* it's a QC filename */
+ item.filename = argv[0];
+ item.type = TYPE_QC;
+ vec_push(items, item);
+ }