+
+ 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_standard = COMPILER_GMQCC;
+ else if (!strcmp(argarg, "qcc"))
+ opts_standard = COMPILER_QCC;
+ else if (!strcmp(argarg, "fte") || !strcmp(argarg, "fteqcc"))
+ opts_standard = COMPILER_FTEQCC;
+ else if (!strcmp(argarg, "qccx"))
+ opts_standard = COMPILER_QCCX;
+ else {
+ printf("Unknown standard: %s\n", argarg);
+ return false;
+ }
+ continue;
+ }
+ if (!strcmp(argv[0]+1, "debug")) {
+ opts_debug = true;
+ continue;
+ }
+ if (!strcmp(argv[0]+1, "memchk")) {
+ opts_memchk = true;
+ continue;
+ }
+
+ switch (argv[0][1]) {
+ /* -h, show usage but exit with 0 */
+ case 'h':
+ usage();
+ exit(0);
+ 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")) {
+ printf("Possible flags:\n");
+ for (itr = 0; itr < COUNT_FLAGS; ++itr) {
+ util_strtononcmd(opts_flag_list[itr].name, buffer, sizeof(buffer));
+ printf(" -f%s\n", buffer);
+ }
+ exit(0);
+ }
+ else if (!strncmp(argv[0]+2, "NO_", 3)) {
+ if (!options_setflag(argv[0]+5, false)) {
+ printf("unknown flag: %s\n", argv[0]+2);
+ return false;
+ }
+ }
+ else if (!options_setflag(argv[0]+2, true)) {
+ printf("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")) {
+ printf("Possible warnings:\n");
+ for (itr = 0; itr < COUNT_WARNINGS; ++itr) {
+ util_strtononcmd(opts_warn_list[itr].name, buffer, sizeof(buffer));
+ printf(" -W%s\n", buffer);
+ }
+ exit(0);
+ }
+ else if (!strcmp(argv[0]+2, "ALL")) {
+ for (itr = 0; itr < sizeof(opts_warn)/sizeof(opts_warn[0]); ++itr)
+ opts_warn[itr] = 0xFFFFFFFFL;
+ break;
+ }
+ if (!strncmp(argv[0]+2, "NO_", 3)) {
+ if (!options_setwarn(argv[0]+5, false)) {
+ printf("unknown warning: %s\n", argv[0]+2);
+ return false;
+ }
+ }
+ else if (!options_setwarn(argv[0]+2, true)) {
+ printf("unknown warning: %s\n", argv[0]+2);
+ return false;
+ }
+ break;
+
+ case 'O':
+ if (!options_witharg(&argc, &argv, &argarg)) {
+ printf("option -O requires a numerical argument\n");
+ return false;
+ }
+ opts_O = atoi(argarg);
+ break;
+
+ case 'o':
+ if (!options_witharg(&argc, &argv, &argarg)) {
+ printf("option -o requires an argument: the output file name\n");
+ return false;
+ }
+ opts_output = argarg;
+ break;
+
+ case 'a':
+ case 's':
+ item.type = argv[0][1] == 'a' ? TYPE_ASM : TYPE_SRC;
+ if (!options_witharg(&argc, &argv, &argarg)) {
+ printf("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;
+ items_add(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 {
+ /* All long options with arguments */
+ if (options_long_witharg("output", &argc, &argv, &argarg))
+ opts_output = argarg;
+ else
+ {
+ printf("Unknown parameter: %s\n", argv[0]);
+ return false;
+ }
+ }
+ break;
+
+ default:
+ printf("Unknown parameter: %s\n", argv[0]);
+ return false;
+ }
+ }
+ else
+ {
+ /* it's a QC filename */
+ argitem item;
+ item.filename = argv[0];
+ item.type = TYPE_QC;
+ items_add(item);
+ }
+ }
+ return true;
+}
+
+int main(int argc, char **argv) {
+ size_t itr;
+ app_name = argv[0];
+
+ if (!options_parse(argc, argv)) {
+ return usage();