Commit da60fbbc authored by Vadim Bendebury (вб)'s avatar Vadim Bendebury (вб) Committed by Michal Marek

menuconfig: wrap long help lines

Help text for certain config options is very extensive (the text
includes the names of all  other options the option in question depends
on). Long lines are not wrapped, making it impossible to see the list
without scrolling horizontally.

This patch adds some logic which wraps help screen lines at word
boundaries to prevent truncating.

Tested by running

  ARCH=powerpc make menuconfig O=/tmp/build

which shows that the long lines are now wrapped, and

 ARCH=powerpc make xconfig O=/tmp/build

to demonstrate that it still compiles and operates as expected.
Signed-off-by: default avatarVadim Bendebury <vbendeb@google.com>
Signed-off-by: default avatarMichal Marek <mmarek@suse.cz>
parent 5358db0b
...@@ -1097,9 +1097,32 @@ void expr_fprint(struct expr *e, FILE *out) ...@@ -1097,9 +1097,32 @@ void expr_fprint(struct expr *e, FILE *out)
static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str) static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str)
{ {
str_append((struct gstr*)data, str); struct gstr *gs = (struct gstr*)data;
const char *sym_str = NULL;
if (sym)
sym_str = sym_get_string_value(sym);
if (gs->max_width) {
unsigned extra_length = strlen(str);
const char *last_cr = strrchr(gs->s, '\n');
unsigned last_line_length;
if (sym_str)
extra_length += 4 + strlen(sym_str);
if (!last_cr)
last_cr = gs->s;
last_line_length = strlen(gs->s) - (last_cr - gs->s);
if ((last_line_length + extra_length) > gs->max_width)
str_append(gs, "\\\n");
}
str_append(gs, str);
if (sym) if (sym)
str_printf((struct gstr*)data, " [=%s]", sym_get_string_value(sym)); str_printf(gs, " [=%s]", sym_str);
} }
void expr_gstr_print(struct expr *e, struct gstr *gs) void expr_gstr_print(struct expr *e, struct gstr *gs)
......
...@@ -106,6 +106,11 @@ int file_write_dep(const char *name); ...@@ -106,6 +106,11 @@ int file_write_dep(const char *name);
struct gstr { struct gstr {
size_t len; size_t len;
char *s; char *s;
/*
* when max_width is not zero long lines in string s (if any) get
* wrapped not to exceed the max_width value
*/
int max_width;
}; };
struct gstr str_new(void); struct gstr str_new(void);
struct gstr str_assign(const char *s); struct gstr str_assign(const char *s);
......
...@@ -638,6 +638,7 @@ static void show_help(struct menu *menu) ...@@ -638,6 +638,7 @@ static void show_help(struct menu *menu)
{ {
struct gstr help = str_new(); struct gstr help = str_new();
help.max_width = getmaxx(stdscr) - 10;
menu_get_ext_help(menu, &help); menu_get_ext_help(menu, &help);
show_helptext(_(menu_get_prompt(menu)), str_get(&help)); show_helptext(_(menu_get_prompt(menu)), str_get(&help));
......
...@@ -78,6 +78,7 @@ struct gstr str_new(void) ...@@ -78,6 +78,7 @@ struct gstr str_new(void)
struct gstr gs; struct gstr gs;
gs.s = malloc(sizeof(char) * 64); gs.s = malloc(sizeof(char) * 64);
gs.len = 64; gs.len = 64;
gs.max_width = 0;
strcpy(gs.s, "\0"); strcpy(gs.s, "\0");
return gs; return gs;
} }
...@@ -88,6 +89,7 @@ struct gstr str_assign(const char *s) ...@@ -88,6 +89,7 @@ struct gstr str_assign(const char *s)
struct gstr gs; struct gstr gs;
gs.s = strdup(s); gs.s = strdup(s);
gs.len = strlen(s) + 1; gs.len = strlen(s) + 1;
gs.max_width = 0;
return gs; return gs;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment