+static bool options_setflag_all(const char *name, bool on, uint32_t *flags, const opts_flag_def *list, size_t listsize) {
+ size_t i;
+
+ for (i = 0; i < listsize; ++i) {
+ if (!strcmp(name, list[i].name)) {
+ longbit lb = list[i].bit;
+#if 0
+ if (on)
+ flags[lb.idx] |= (1<<(lb.bit));
+ else
+ flags[lb.idx] &= ~(1<<(lb.bit));
+#else
+ if (on)
+ flags[0] |= (1<<lb);
+ else
+ flags[0] &= ~(1<<(lb));
+#endif
+ return true;
+ }
+ }
+ return false;
+}
+static bool options_setflag(const char *name, bool on) {
+ return options_setflag_all(name, on, opts_flags, opts_flag_list, COUNT_FLAGS);
+}
+static bool options_setwarn(const char *name, bool on) {
+ return options_setflag_all(name, on, opts_warn, opts_warn_list, COUNT_WARNINGS);
+}
+
+static bool options_witharg(int *argc_, char ***argv_, char **out) {
+ int argc = *argc_;
+ char **argv = *argv_;
+
+ if (argv[0][2]) {
+ *out = argv[0]+2;
+ return true;
+ }
+ /* eat up the next */
+ if (argc < 2) /* no parameter was provided */
+ return false;
+
+ *out = argv[1];
+ --*argc_;
+ ++*argv_;
+ return true;
+}
+
+static bool options_long_witharg_all(const char *optname, int *argc_, char ***argv_, char **out, int ds, bool split) {
+ int argc = *argc_;
+ char **argv = *argv_;
+
+ size_t len = strlen(optname);
+
+ if (strncmp(argv[0]+ds, optname, len))
+ return false;
+
+ /* it's --optname, check how the parameter is supplied */
+ if (argv[0][ds+len] == '=') {
+ /* using --opt=param */
+ *out = argv[0]+ds+len+1;
+ return true;
+ }
+
+ if (!split || argc < ds) /* no parameter was provided, or only single-arg form accepted */
+ return false;
+
+ /* using --opt param */
+ *out = argv[1];
+ --*argc_;
+ ++*argv_;
+ return true;
+}
+static bool options_long_witharg(const char *optname, int *argc_, char ***argv_, char **out) {
+ return options_long_witharg_all(optname, argc_, argv_, out, 2, true);
+}
+static bool options_long_gcc(const char *optname, int *argc_, char ***argv_, char **out) {
+ return options_long_witharg_all(optname, argc_, argv_, out, 1, false);
+}
+
+static bool options_parse(int argc, char **argv) {
+ bool argend = false;
+ size_t itr;
+ char buffer[1024];
+ while (!argend && argc > 1) {
+ char *argarg;
+ argitem item;
+
+ ++argv;
+ --argc;
+
+ 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, "dump")) {
+ opts_dump = true;
+ continue;