From 4593a526a91d40d26cf6799e6150bda6769f9bed Mon Sep 17 00:00:00 2001
From: katherine <shmibs@shmibbles.me>
Date: Mon, 19 Mar 2018 19:37:12 -0700
Subject: fix usage printing correctness

---
 doc/example.c    |  9 +++-----
 src/simple-opt.h | 63 ++++++++++++++++++++++++--------------------------------
 2 files changed, 30 insertions(+), 42 deletions(-)

diff --git a/doc/example.c b/doc/example.c
index 08a9d7f..1f2708c 100644
--- a/doc/example.c
+++ b/doc/example.c
@@ -2,7 +2,7 @@
 
 int main(int argc, char **argv)
 {
-	const char *set[] = { "choice_a", "choice_b", NULL };
+	const char *set[] = { "str_a", "str_b", NULL };
 
 	/* array containing all options and their types / attributes */
 	struct simple_opt options[] = {
@@ -21,11 +21,8 @@ int main(int argc, char **argv)
 		{ SIMPLE_OPT_STRING, 's', NULL, true,
 			"this one doesn't have a long_name version" },
 		{ SIMPLE_OPT_STRING_SET, '\0', "set-choice", true,
-			"a choice of one string from a NULL-terminated array."
-				" note that, in order to maintain redability, the description"
-				" indentation does not accomodate the full width of an"
-				" overly-wide custom_arg_string like (choice_a|choice_b)",
-			"(choice_a|choice_b)", set },
+			"a choice of one string from a NULL-terminated array",
+			"(str_a|str_b)", set },
 		{ SIMPLE_OPT_CHAR, 'c', "char", false,
 			"(optionally) takes a character argument" },
 		{ SIMPLE_OPT_END },
diff --git a/src/simple-opt.h b/src/simple-opt.h
index 7bbb8b8..e6f329d 100644
--- a/src/simple-opt.h
+++ b/src/simple-opt.h
@@ -411,7 +411,7 @@ opt_copy_and_return:
 static int sub_simple_opt_wrap_print(FILE *f, unsigned width, int col,
 		int line_start, const char *s)
 {
-	bool add_newline = false, first_word = true;
+	bool add_newline = false, first_word = true, first_line = true;;
 	int i, j, word_start, word_end;
 
 	if (width != 0 && line_start >= width) {
@@ -419,25 +419,19 @@ static int sub_simple_opt_wrap_print(FILE *f, unsigned width, int col,
 		add_newline = true;
 	}
 
-	if (width != 0 && col >= width) {
-		col = line_start;
+	if (width != 0 && col >= width)
 		add_newline = true;
-	}
 
 	if (add_newline) {
 		fprintf(f, "\n");
 		col = 0;
-
-		if (width > 20) {
-			fprintf(f, "  ");
-			col += 2;
-		}
+		first_line = false;
 	}
 
 	/* print out the message, trying to wrap at words */
 	word_start = 0;
 	while (1) {
-		/* get the next word */
+		/* find the next word */
 		while ( isspace(s[word_start]) )
 			word_start++;
 
@@ -450,7 +444,7 @@ static int sub_simple_opt_wrap_print(FILE *f, unsigned width, int col,
 			word_end++;
 
 		/* buffer up to line_start with spaces */
-		while (col < line_start) {
+		while (col < line_start + 2 * !first_line * (width > 40)) {
 			fprintf(f, " ");
 			col++;
 		}
@@ -459,20 +453,13 @@ static int sub_simple_opt_wrap_print(FILE *f, unsigned width, int col,
 		if (width != 0 && col + (word_end - word_start) + (first_word ? 0 : 1)
 				> width && first_word == false) {
 			fprintf(f, "\n");
-			col = 0;
-
+			first_line = false;
 			/* buffer up to line_start with spaces */
-			while (col < line_start) {
+			col = 0;
+			while (col < line_start + 2 * !first_line * (width > 40)) {
 				fprintf(f, " ");
 				col++;
 			}
-
-			/* newline indentation, for readability */
-			if (width > 20) {
-				fprintf(f, "  ");
-				col += 2;
-			}
-
 			first_word = true;
 		} 
 		
@@ -481,11 +468,12 @@ static int sub_simple_opt_wrap_print(FILE *f, unsigned width, int col,
 			col++;
 		}
 
-		/* if too long for whole line, print piecemeal */
-		if (width != 0 && line_start + (word_end - word_start) > width) {
+		/* if too long, print piecemeal */
+		if (width != 0 && (line_start + (word_end - word_start) > width
+					|| (first_word && col + (word_end - word_start) > width)) ) {
 			j = word_start;
 			while (1) {
-				for (i = 0; line_start + i < width && j < word_end; i++, j++) {
+				for (i = 0; col < width && j < word_end; i++, j++) {
 					fprintf(f, "%c", s[j]);
 					col++;
 				}
@@ -495,7 +483,8 @@ static int sub_simple_opt_wrap_print(FILE *f, unsigned width, int col,
 
 				col = 0;
 				fprintf(f, "\n");
-				while (col < line_start) {
+				first_line = false;
+				while (col < line_start + 2 * !first_line * (width > 40)) {
 					fprintf(f, " ");
 					col++;
 				}
@@ -570,10 +559,8 @@ static void simple_opt_print_usage(FILE *f, unsigned width, char *usage_name,
 					j += 4;
 					break;
 				case SIMPLE_OPT_STRING:
-					j += 6;
-					break;
 				case SIMPLE_OPT_STRING_SET:
-					j += 10;
+					j += 6;
 					break;
 				default:
 					break;
@@ -598,6 +585,7 @@ static void simple_opt_print_usage(FILE *f, unsigned width, char *usage_name,
 		desc_line_start = (width / 2 < 30 ? width / 2 : 30);
 
 
+
 	/* 
 	 * printing 
 	 *
@@ -605,9 +593,9 @@ static void simple_opt_print_usage(FILE *f, unsigned width, char *usage_name,
 
 	/* print "Usage: <exec> <options> */
 	if (usage_name != NULL && usage_options != NULL) {
-		fprintf(f, "Usage:");
+		col = sub_simple_opt_wrap_print(f, width, 0, 0, "Usage:");
 
-		col = sub_simple_opt_wrap_print(f, width, 6, 7, usage_name);
+		col = sub_simple_opt_wrap_print(f, width, col, 7, usage_name);
 
 		if (usage_options != NULL)
 			sub_simple_opt_wrap_print(f, width, col,
@@ -695,13 +683,10 @@ static void simple_opt_print_usage(FILE *f, unsigned width, char *usage_name,
 					print_buffer_offset += 4;
 					break;
 				case SIMPLE_OPT_STRING:
+				case SIMPLE_OPT_STRING_SET:
 					sprintf(print_buffer + print_buffer_offset, "STRING");
 					print_buffer_offset += 6;
 					break;
-				case SIMPLE_OPT_STRING_SET:
-					sprintf(print_buffer + print_buffer_offset, "STRING-SET");
-					print_buffer_offset += 10;
-					break;
 				default:
 					break;
 				}
@@ -717,8 +702,14 @@ static void simple_opt_print_usage(FILE *f, unsigned width, char *usage_name,
 
 		/* print option description */
 		if (options[i].description != NULL) {
-			fprintf(f, "  ");
-			col += 2;
+			if (col < width) {
+				fprintf(f, " ");;
+				col++;
+			}
+			if (col < width) {
+				fprintf(f, " ");;
+				col++;
+			}
 			sub_simple_opt_wrap_print(f, width, col, desc_line_start,
 					options[i].description);
 		}
-- 
cgit v1.2.3