diff --git a/haversine_02/argparser.cpp b/haversine_02/argparser.cpp index 2481c9d..d94270e 100644 --- a/haversine_02/argparser.cpp +++ b/haversine_02/argparser.cpp @@ -1,60 +1,65 @@ #include "argparser.h" +#include #include #include #include #include -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; } diff --git a/haversine_02/argparser.h b/haversine_02/argparser.h index 4c6acc0..219875c 100644 --- a/haversine_02/argparser.h +++ b/haversine_02/argparser.h @@ -2,6 +2,7 @@ #define ARGPARSER_H #include "aliases.h" +#include 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 diff --git a/haversine_02/main.cpp b/haversine_02/main.cpp index d9e975c..e2c030f 100644 --- a/haversine_02/main.cpp +++ b/haversine_02/main.cpp @@ -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");