performance-aware-programming/haversine_02/argparser.cpp

61 lines
1.2 KiB
C++

#include "argparser.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void print_usage();
bool strequals(const char *str1, const char *str2);
ParseResult parse_args(i32 argc, char *argv[]) {
GeneratorArgs args = {};
if (argc < 2) {
print_usage();
return {PARSE_STATUS_FAILED, 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) {
args.seed = time(NULL);
}
if (!positional_complete) {
print_usage();
return {PARSE_STATUS_FAILED, args};
}
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;
}