]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
menuconfig: wrap long help lines
authorVadim Bendebury (вб) <vbendeb@google.com>
Sun, 20 Dec 2009 08:29:49 +0000 (00:29 -0800)
committerMichal Marek <mmarek@suse.cz>
Tue, 2 Feb 2010 13:33:55 +0000 (14:33 +0100)
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: Vadim Bendebury <vbendeb@google.com>
Signed-off-by: Michal Marek <mmarek@suse.cz>
scripts/kconfig/expr.c
scripts/kconfig/lkc.h
scripts/kconfig/mconf.c
scripts/kconfig/util.c

index edd3f39a080a422175bf512c94dd1d5bf87e059b..d83f2322893a8adb10f027e2c4fa4757a33e26f0 100644 (file)
@@ -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)
 {
-       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)
-               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)
index f379b0bf8c9e7b8d45a6bd9a7f689af7165fcec6..e59dd0c5787ad315862659704f2794180ed33797 100644 (file)
@@ -106,6 +106,11 @@ int file_write_dep(const char *name);
 struct gstr {
        size_t len;
        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_assign(const char *s);
index 8413cf38ed277ea0061efb708c9db881ab4b6a12..ac1e9dacde976e036306d9789512817c5cffb7ce 100644 (file)
@@ -638,6 +638,7 @@ static void show_help(struct menu *menu)
 {
        struct gstr help = str_new();
 
+       help.max_width = getmaxx(stdscr) - 10;
        menu_get_ext_help(menu, &help);
 
        show_helptext(_(menu_get_prompt(menu)), str_get(&help));
index b6b2a46af14c400b556b61c3f6e1caeed792a87a..81c100d953ef401954ad57d4b9768c544b821033 100644 (file)
@@ -78,6 +78,7 @@ struct gstr str_new(void)
        struct gstr gs;
        gs.s = malloc(sizeof(char) * 64);
        gs.len = 64;
+       gs.max_width = 0;
        strcpy(gs.s, "\0");
        return gs;
 }
@@ -88,6 +89,7 @@ struct gstr str_assign(const char *s)
        struct gstr gs;
        gs.s = strdup(s);
        gs.len = strlen(s) + 1;
+       gs.max_width = 0;
        return gs;
 }