From 4593a526a91d40d26cf6799e6150bda6769f9bed Mon Sep 17 00:00:00 2001 From: katherine 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: */ 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