Re: [PATCH} wrap long help lines

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Ah, I did not know that the arrow keys worked, thank you for pointing
that out. But it is still so much more comfortable to see the entire
help text on one screen.

cheers,
/vb


On Thu, Dec 10, 2009 at 8:57 AM, Randy Dunlap <randy.dunlap@xxxxxxxxxx> wrote:
> On Thu, 10 Dec 2009 08:36:21 -0800 (PST) Vadim Bendebury wrote:
>
>> Help text for certain config options is very extensive (the text includes all
>> config options which the option in question depends on). Long lines are not
>> wrapped, making it impossible to see the list.
>
> It's possible to see the list by using the right arrow key to
> scroll/pan the screen side-to-side.
> But I'm not objecting to the patch.
>
>> This patch adds a function to wrap long lines to fit the screen width and
>> makes sure the function is invoked after help text is prepared.
>>
>> Tested by running
>>
>> mkdir ../build/powerpc
>> ARCH=powerpc make menuconfig O=../build/powerpc
>>
>> in the kernel sorce tree. Once menu is displayed, hitting c<cr>cc? brings up
>> the help message for CONFIG_CRYPTO_MANAGER, now properly wrapped.
>>
>>
>> Signed-off-by: Vadim Bendebury <vbendeb@xxxxxxxxxx>
>> ---
>>  scripts/kconfig/expr.c |    2 +
>>  scripts/kconfig/lkc.h  |    1 +
>>  scripts/kconfig/util.c |   52 ++++++++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 55 insertions(+), 0 deletions(-)
>>
>> diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c
>> index edd3f39..2aa49e8 100644
>> --- a/scripts/kconfig/expr.c
>> +++ b/scripts/kconfig/expr.c
>> @@ -1083,6 +1083,8 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *
>>       }
>>       if (expr_compare_type(prevtoken, e->type) > 0)
>>               fn(data, NULL, ")");
>> +
>> +     str_screen_wrap(data, "||");
>>  }
>>
>>  static void expr_print_file_helper(void *data, struct symbol *sym, const char *str)
>> diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h
>> index f379b0b..8fc69a3 100644
>> --- a/scripts/kconfig/lkc.h
>> +++ b/scripts/kconfig/lkc.h
>> @@ -112,6 +112,7 @@ struct gstr str_assign(const char *s);
>>  void str_free(struct gstr *gs);
>>  void str_append(struct gstr *gs, const char *s);
>>  void str_printf(struct gstr *gs, const char *fmt, ...);
>> +void str_screen_wrap(struct gstr *gs, const char *break_point);
>>  const char *str_get(struct gstr *gs);
>>
>>  /* symbol.c */
>> diff --git a/scripts/kconfig/util.c b/scripts/kconfig/util.c
>> index b6b2a46..f6c8930 100644
>> --- a/scripts/kconfig/util.c
>> +++ b/scripts/kconfig/util.c
>> @@ -7,6 +7,7 @@
>>
>>  #include <string.h>
>>  #include "lkc.h"
>> +#include <curses.h>
>>
>>  /* file already present in list? If not add it */
>>  struct file *file_lookup(const char *name)
>> @@ -131,3 +132,54 @@ const char *str_get(struct gstr *gs)
>>       return gs->s;
>>  }
>>
>> +static const char string_breaker[] = { '\\', '\n' };
>> +#define STRING_BREAKER_SIZE sizeof(string_breaker)
>> +/*
>> + * wrap long lines in the passed in strings. The lines are wrapped to fit into
>> + * the current screen width. The lines can be broken only at 'break points' -
>> + * passed in as the second parameter. A \<cr> (two characters) sequence is
>> + * instered after the appropriate break points to get the line wrapped to fit
>> + * the screen.
>> +*/
>> +void str_screen_wrap(struct gstr *data, const char *break_point)
>> +{
>> +     char *eol_location;
>> +     int total_length;
>> +     int screen_width = getmaxx(stdscr) - 10;
>> +     int break_point_size = strlen(break_point);
>> +
>> +     eol_location = strrchr(data->s, '\n');
>> +     if (!eol_location)
>> +             eol_location = data->s;
>> +
>> +     total_length = strlen(data->s) + 1; /* include trailing zero */
>> +
>> +     /* while last line's length exceeds screen width */
>> +     while ((total_length - (eol_location - data->s) - 1) > screen_width) {
>> +             char *prev_breakp;
>> +             char *breakp = eol_location;
>> +             do {
>> +                     prev_breakp = breakp;
>> +                     breakp = strstr(breakp + 1, break_point);
>> +             } while (breakp &&
>> +                      ((breakp - eol_location) < screen_width));
>> +
>> +             if (prev_breakp == eol_location) {
>> +                     /* no break_points found */
>> +                     return;
>> +             }
>> +
>> +             total_length += STRING_BREAKER_SIZE;
>> +             if (data->len < total_length) {
>> +                     data->s = realloc(data->s, total_length);
>> +                     data->len = total_length;
>> +             }
>> +             prev_breakp += break_point_size;
>> +
>> +             eol_location = prev_breakp + STRING_BREAKER_SIZE;
>> +             /* move the remainder of the string including trailing zero */
>> +             memmove(eol_location, prev_breakp, strlen(prev_breakp) + 1);
>> +             /* insert the line break */
>> +             memcpy(prev_breakp, string_breaker, STRING_BREAKER_SIZE);
>> +     }
>> +}
>> --
>
>
> ---
> ~Randy
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux&nblp;USB Development]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite Secrets]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux