Add option priorities

For instance, filename= must come after directory= or things will
go wrong. So add a priority value to each option, so that the parser
will take that into account.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/init.c b/init.c
index a13e8b3..b192e58 100644
--- a/init.c
+++ b/init.c
@@ -614,6 +614,8 @@
 	int first_sect = 1;
 	int skip_fgets = 0;
 	int inside_skip = 0;
+	char **opts;
+	int i, alloc_opts, num_opts;
 
 	if (!strcmp(file, "-"))
 		f = stdin;
@@ -633,6 +635,9 @@
 	name = malloc(280);
 	memset(name, 0, 280);
 
+	alloc_opts = 8;
+	opts = malloc(sizeof(char *) * alloc_opts);
+
 	stonewall = stonewall_flag;
 	do {
 		/*
@@ -691,6 +696,9 @@
 			stonewall = 0;
 		}
 
+		num_opts = 0;
+		memset(opts, 0, alloc_opts * sizeof(char *));
+
 		while ((p = fgets(string, 4096, f)) != NULL) {
 			if (is_empty_or_comment(p))
 				continue;
@@ -708,27 +716,39 @@
 
 			strip_blank_end(p);
 
-			/*
-			 * Don't break here, continue parsing options so we
-			 * dump all the bad ones. Makes trial/error fixups
-			 * easier on the user.
-			 */
-			ret |= fio_option_parse(td, p);
-			if (!ret && dump_cmdline)
-				log_info("--%s ", p);
+			if (num_opts == alloc_opts) {
+				alloc_opts <<= 1;
+				opts = realloc(opts,
+						alloc_opts * sizeof(char *));
+			}
+
+			opts[num_opts] = strdup(p);
+			num_opts++;
 		}
 
-		if (!ret)
+		ret = fio_options_parse(td, opts, num_opts);
+		if (!ret) {
+			if (dump_cmdline)
+				for (i = 0; i < num_opts; i++)
+					log_info("--%s ", opts[i]);
+
 			ret = add_job(td, name, 0);
-		else {
+		} else {
 			log_err("fio: job %s dropped\n", name);
 			put_job(td);
 		}
+
+		for (i = 0; i < num_opts; i++)
+			free(opts[i]);
+		num_opts = 0;
 	} while (!ret);
 
 	if (dump_cmdline)
 		log_info("\n");
 
+	for (i = 0; i < num_opts; i++)
+		free(opts[i]);
+
 	free(string);
 	free(name);
 	if (f != stdin)