Switch to using argp
This commit is contained in:
parent
5c742fe1f7
commit
5ff93f61d7
@ -1,60 +1,65 @@
|
||||
#include "argparser.h"
|
||||
#include <argp.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
void print_usage();
|
||||
static error_t argp_parser(i32 key, char *arg, argp_state *state);
|
||||
|
||||
bool strequals(const char *str1, const char *str2);
|
||||
static argp parser = {};
|
||||
|
||||
ParseResult parse_args(i32 argc, char *argv[]) {
|
||||
static argp_option options[] = {
|
||||
{.name = "seed", .key = 's', .arg = "SEED"},
|
||||
{.name = "cluster", .key = 'c'},
|
||||
{0},
|
||||
};
|
||||
|
||||
GeneratorArgs parse_args(i32 argc, char *argv[]) {
|
||||
GeneratorArgs args = {};
|
||||
|
||||
if (argc < 2) {
|
||||
print_usage();
|
||||
parser.options = options;
|
||||
parser.parser = argp_parser;
|
||||
parser.args_doc = "COUNT";
|
||||
|
||||
return {PARSE_STATUS_FAILED, args};
|
||||
}
|
||||
argp_parse(&parser, argc, argv, 0, 0, &args);
|
||||
|
||||
bool seeded = false;
|
||||
bool positional_complete = false;
|
||||
|
||||
for (i32 i = 1; i < argc; ++i) {
|
||||
if (strequals(argv[i], "-h") || strequals(argv[i], "--help")) {
|
||||
print_usage();
|
||||
|
||||
return {PARSE_STATUS_HELP, {}};
|
||||
} else if (strequals(argv[i], "--seed")) {
|
||||
if (i + 1 < argc) {
|
||||
args.seed = strtoul(argv[++i], NULL, 10);
|
||||
seeded = true;
|
||||
}
|
||||
} else if (strequals(argv[i], "--cluster")) {
|
||||
args.clustered = true;
|
||||
} else {
|
||||
args.count = strtoull(argv[i], NULL, 10);
|
||||
positional_complete = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!seeded) {
|
||||
if (args.seed == 0) {
|
||||
args.seed = time(NULL);
|
||||
}
|
||||
|
||||
if (!positional_complete) {
|
||||
print_usage();
|
||||
|
||||
return {PARSE_STATUS_FAILED, args};
|
||||
return args;
|
||||
}
|
||||
|
||||
return {PARSE_STATUS_SUCCEEDED, 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);
|
||||
}
|
||||
|
||||
void print_usage() {
|
||||
printf("Usage: main [-h] [--seed SEED] [--cluster] COUNT\n");
|
||||
args->count = strtoull(arg, NULL, 10);
|
||||
|
||||
break;
|
||||
case ARGP_KEY_END:
|
||||
if (state->arg_num < 1) {
|
||||
argp_usage(state);
|
||||
}
|
||||
|
||||
bool strequals(const char *str1, const char *str2) {
|
||||
return strcmp(str1, str2) == 0;
|
||||
break;
|
||||
default:
|
||||
return ARGP_ERR_UNKNOWN;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
#define ARGPARSER_H
|
||||
|
||||
#include "aliases.h"
|
||||
#include <argp.h>
|
||||
|
||||
struct GeneratorArgs {
|
||||
u32 seed;
|
||||
@ -9,17 +10,6 @@ struct GeneratorArgs {
|
||||
u64 count;
|
||||
};
|
||||
|
||||
enum ParseStatus {
|
||||
PARSE_STATUS_FAILED,
|
||||
PARSE_STATUS_HELP,
|
||||
PARSE_STATUS_SUCCEEDED,
|
||||
};
|
||||
|
||||
struct ParseResult {
|
||||
ParseStatus status;
|
||||
GeneratorArgs args;
|
||||
};
|
||||
|
||||
ParseResult parse_args(i32 argc, char *argv[]);
|
||||
GeneratorArgs parse_args(i32 argc, char *argv[]);
|
||||
|
||||
#endif // !ARGPARSER_H
|
||||
|
@ -10,20 +10,14 @@
|
||||
#define EARTH_RADIUS_KM 6371.0
|
||||
|
||||
i32 main(i32 argc, char *argv[]) {
|
||||
ParseResult result = parse_args(argc, argv);
|
||||
GeneratorArgs args = parse_args(argc, argv);
|
||||
|
||||
if (result.status == PARSE_STATUS_FAILED) {
|
||||
return -1;
|
||||
} else if (result.status == PARSE_STATUS_HELP) {
|
||||
return 0;
|
||||
}
|
||||
srand(args.seed);
|
||||
|
||||
srand(result.args.seed);
|
||||
|
||||
PairArray arr = {result.args.count, NULL};
|
||||
PairArray arr = {args.count, NULL};
|
||||
arr.pairs = (PointPair *)malloc(arr.count * sizeof(PointPair));
|
||||
|
||||
fill_pairs_array(&arr, result.args.clustered);
|
||||
fill_pairs_array(&arr, args.clustered);
|
||||
|
||||
write_pairs_to_json(arr, "pairs.json");
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user