66 lines
1.2 KiB
C++
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;
|
|
}
|