Switch to using argp

This commit is contained in:
Abdelrahman Said 2023-05-29 19:49:49 +01:00
parent 5c742fe1f7
commit 5ff93f61d7
3 changed files with 52 additions and 63 deletions

View File

@ -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 args;
}
return {PARSE_STATUS_FAILED, 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 {PARSE_STATUS_SUCCEEDED, args};
}
void print_usage() {
printf("Usage: main [-h] [--seed SEED] [--cluster] COUNT\n");
}
bool strequals(const char *str1, const char *str2) {
return strcmp(str1, str2) == 0;
return 0;
}

View File

@ -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

View File

@ -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");