From 88fc89479b339b01bee77c0467cefe05017f4909 Mon Sep 17 00:00:00 2001
From: David Phillips <dbphillipsnz@gmail.com>
Date: Mon, 4 Apr 2016 18:26:40 +1200
Subject: Use getopt(3) to parse arguments instead

---
 fractal-gen.c | 66 +++++++++++++++++++++++++++++++++++++----------------------
 fractal-gen.h |  4 ++--
 2 files changed, 44 insertions(+), 26 deletions(-)

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);
+}
diff --git a/fractal-gen.h b/fractal-gen.h
index e0b69a8..a25063f 100644
--- a/fractal-gen.h
+++ b/fractal-gen.h
@@ -50,9 +50,9 @@ double power;
 
 typedef void* (*generator_func)(void *);
 
-bool args_parse_okay(const int argc, const char **argv);
+bool args_parse_okay(int argc, char **argv);
 generator_func select_generator(const char* name);
-
+void show_help();
 
 #include "algorithms.h"
 
-- 
cgit v1.1