#include "argparser.h" #include #include #include #include #include static error_t argp_parser(i32 key, char *arg, argp_state *state); static argp parser = {}; static argp_option options[] = { {.name = "seed", .key = 's', .arg = "SEED"}, {.name = "cluster", .key = 'c'}, {0}, }; GeneratorArgs parse_args(i32 argc, char *argv[]) { GeneratorArgs args = {}; parser.options = options; parser.parser = argp_parser; parser.args_doc = "COUNT"; argp_parse(&parser, argc, argv, 0, 0, &args); if (args.seed == 0) { args.seed = time(NULL); } return args; } error_t argp_parser(i32 key, char *arg, argp_state *state) { GeneratorArgs *args = (GeneratorArgs *)state->input; switch (key) { case 's': args->seed = strtoul(arg, NULL, 10); break; case 'c': args->clustered = true; break; case ARGP_KEY_ARG: if (state->arg_num >= 1) { argp_usage(state); } args->count = strtoull(arg, NULL, 10); break; case ARGP_KEY_END: if (state->arg_num < 1) { argp_usage(state); } break; default: return ARGP_ERR_UNKNOWN; } return 0; }