2023-05-29 19:49:49 +01:00

66 lines
1.2 KiB
C++

#include "argparser.h"
#include <argp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
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;
}