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