From 88fc89479b339b01bee77c0467cefe05017f4909 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Mon, 4 Apr 2016 18:26:40 +1200 Subject: Use getopt(3) to parse arguments instead --- fractal-gen.c | 66 +++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 24 deletions(-) (limited to 'fractal-gen.c') diff --git a/fractal-gen.c b/fractal-gen.c index 25b70c1..56163ea 100644 --- a/fractal-gen.c +++ b/fractal-gen.c @@ -50,7 +50,7 @@ static struct section_generator generators[] = { /* FIXME put into header */ double thread_mult = 0.f; /* number to multiply available cores by to get thread count */ - +char *argv0 = NULL; int main(int argc, char **argv) { @@ -63,6 +63,9 @@ int main(int argc, char **argv) data_section* sections = NULL; generator_func generator = NULL; + /* who are we? */ + argv0 = argv[0]; + /* Select correct generator for the fractal type */ bname = basename(argv[0]); generator = select_generator(bname); @@ -73,8 +76,11 @@ int main(int argc, char **argv) return EXIT_FAILURE; } - if (!args_parse_okay(argc, (const char**)argv)) + if (!args_parse_okay(argc, argv)) + { + show_help(); return EXIT_FAILURE; + } /* Allocate memory for sections */ if ((sections = malloc(sizeof(data_section)*cores)) == NULL) @@ -162,31 +168,35 @@ int main(int argc, char **argv) } -/* FIXME use getopt */ -bool args_parse_okay(const int argc, const char **argv) +bool args_parse_okay(int argc, char **argv) { - if (argc < 4 || argc > 7) - { - fprintf(stderr, - "%s size iterat power [threads]\n" - "%s size iterat power thread_multiplier cluster-id cluster-total\n", - argv[0], argv[0]); - return false; - } + char opt = '\0'; - size = atoi(argv[1]); - iterat = atoi(argv[2]); - power = atof(argv[3]); + /* first things first: preload default values */ + cores = sysconf(_SC_NPROCESSORS_ONLN); + thread_mult = 1; + clust_id = 0; + clust_total = 1; - /* Fetch or use defaults for - * - num cores available - * - our ID in cluster - * - total members in cluster - * FIXME this stuff is horrible, will disappear with getopt */ - cores = (argc == 5)? atoi(argv[4]) : sysconf(_SC_NPROCESSORS_ONLN); - thread_mult = argc == 7? atof(argv[4]) : 1.f; - clust_id = argc == 7? atoi(argv[5]) : 0; - clust_total = argc == 7? atoi(argv[6]) : 1; + while ( (opt = getopt(argc, argv, "s:i:e:c:t:N:T")) != -1 ) + { + switch (opt) + { + case 's': size = atoi(optarg); break; + case 'i': iterat = atoi(optarg); break; + case 'e': power = atoi(optarg); break; + case 'c': cores = atoi(optarg); break; + case 't': thread_mult = atoi(optarg); break; + case 'N': clust_id = atoi(optarg); break; + case 'T': clust_total = atoi(optarg); break; + /* redundant case for '?', but explicitness is best */ + case '?': + default: + show_help(); + return false; + break; + } + } /* Extend number of threads to multiplier value */ cores *= thread_mult; @@ -234,3 +244,11 @@ generator_func select_generator(const char* name) return NULL; } + +void show_help() +{ + fprintf(stderr, + "%s size iterat power [threads]\n" + "%s size iterat power thread_multiplier cluster-id cluster-total\n", + argv0, argv0); +} -- cgit v1.1