void getenv_setargv(const char *envvar, int *pargc, char** *pargv) { char *p; int instring; int slash; char c; char *env = getenv(envvar); if (!env) return; env = mem.strdup(env); // create our own writable copy int argc = *pargc; Strings *argv = new Strings(); argv->setDim(argc); int argc_left = 0; for (int i = 0; i < argc; i++) { if (!strcmp((*pargv)[i], "-run") || !strcmp((*pargv)[i], "--run")) { // HACK: set flag to indicate we saw '-run' here global.params.run = true; // Don't eat -run yet so the program arguments don't get changed argc_left = argc - i; argc = i; *pargv = &(*pargv)[i]; argv->setDim(i); break; } else { } } // HACK to stop required values from command line being drawn from DFLAGS argv->push((char*)""); argc++; size_t j = 1; // leave argv[0] alone while (1) { int wildcard = 1; // do wildcard expansion switch (*env) { case ' ': case '\t': env++; break; case 0: goto Ldone; case '"': wildcard = 0; default: argv->push(env); // append //argv->insert(j, env); // insert at position j j++; argc++; p = env; slash = 0; instring = 0; c = 0; while (1) { c = *env++; switch (c) { case '"': p -= (slash >> 1); if (slash & 1) { p--; goto Laddc; } instring ^= 1; slash = 0; continue; case ' ': case '\t': if (instring) goto Laddc; *p = 0; //if (wildcard) //wildcardexpand(); // not implemented break; case '\\': slash++; *p++ = c; continue; case 0: *p = 0; //if (wildcard) //wildcardexpand(); // not implemented goto Ldone; default: Laddc: slash = 0; *p++ = c; continue; } break; } } } Ldone: assert(argc == argv->dim); argv->reserve(argc_left); for (int i = 0; i < argc_left; i++) argv->data[argc++] = (void *)(*pargv)[i]; *pargc = argc; *pargv = argv->tdata(); }