=== modified file 'ChangeLog' --- ChangeLog 2009-12-26 23:43:21 +0000 +++ ChangeLog 2009-12-27 17:06:29 +0000 @@ -1,5 +1,10 @@ 2009-12-27 Carles Pina i Estany + * lib/arg.c (AVAILABLE_CHARS_LINE): New macro. + (grub_arg_show_help): Cut the help string dynamically. + +2009-12-27 Carles Pina i Estany + * normal/cmdline.c (grub_cmdline_get): Print a space after prompt. * normal/main.c (grub_normal_read_line): Remove a space from the default prompt. === modified file 'lib/arg.c' --- lib/arg.c 2009-12-25 23:50:59 +0000 +++ lib/arg.c 2009-12-27 18:36:58 +0000 @@ -144,7 +144,48 @@ grub_arg_show_help (grub_extcmd_t cmd) } } - const char *doc = _(opt->doc); + char *doc_orig = grub_strdup (_(opt->doc)); + char *doc = doc_orig; + + char* next_newline = doc; + char* line; + char* doc_last = doc + grub_strlen (doc); + #ifndef GRUB_UTIL + const int terminal_width = GRUB_TERM_WIDTH; + #else + const int terminal_width = 80; + #endif + + const int chars_line = terminal_width - 25; + + while (next_newline + chars_line < doc_last) + { + line = next_newline; + + /* Move forward. */ + while (*next_newline != '\n' && + next_newline - line < chars_line && + *next_newline != '\0') + { + next_newline++; + } + + /* Move backward. */ + while (*next_newline != '\n' && + *next_newline != ' ' && next_newline != line && + *next_newline != '\0') + { + next_newline--; + } + + *next_newline = '\n'; + if (next_newline == line) + { + break; + } + next_newline++; + } + for (;;) { while (spacing-- > 0) @@ -159,6 +200,8 @@ grub_arg_show_help (grub_extcmd_t cmd) doc++; spacing = 4 + 20; } + + grub_free (doc_orig); switch (opt->shortarg) {