#include kcli_cond kcli_parse(kcli_set prg) { bool no_more_opts = false; const kcli_param* param = prg.params; for (sz i = 0; (i < prg.argc) && (prg.args[i] != null); ++i) { if (no_more_opts) goto is_param; const char* const arg = prg.args[i]; if (arg[0] == '-') { if(arg[1] == '-') { if (arg[2] == 0) { no_more_opts = true; continue; } else if (arg[2] == '@') { // TODO: implement reading parameters from files continue; } else goto is_long_opt; } else if (arg[1] == '@') { // TODO: implement newline-separated file reading behavior continue; } else if (arg[1] == 0) { goto is_param; } else { goto is_short_opt; } } else if (arg[0] == '@') { // TODO: implement parsing file for options and parameters continue; } else { goto is_param; } is_short_opt: { continue; } is_long_opt: { continue; } is_param: { void* val = param -> val; if (param -> kind & kcli_param_int) { ubyte base = param->kind & ~kcli_param_int; /* TODO: parse integer */ } else switch (param -> kind) { case kcli_param_none: continue; case kcli_param_string: *(char const**)val = arg; break; case kcli_param_enum: /* TODO */ break; default: return kcli_cond_spec; } } } }