#include <k/cli.h>
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;
}
}
}
}