From: Zachary T Welch Date: Mon, 23 Nov 2009 20:00:31 +0000 (-0800) Subject: improve usage and help command output X-Git-Tag: v0.4.0-rc1~336 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=c297a14f7072d98bdad6bd7b9bac3a3069de9ed9 improve usage and help command output Rewrite formatting code in C, removing last remenants of TCL help code. Sinificantly improves the readability by using smarter indent and wrap. --- diff --git a/src/helper/command.c b/src/helper/command.c index 1263a93142..a1ba358500 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -811,20 +811,48 @@ static COMMAND_HELPER(command_help_show_list, struct command *head, unsigned n, CALL_COMMAND_HANDLER(command_help_show, c, n, show_help); return ERROR_OK; } + +#define HELP_LINE_WIDTH(_n) (int)(76 - (2 * _n)) + +static void command_help_show_indent(unsigned n) +{ + for (unsigned i = 0; i < n; i++) + LOG_USER_N(" "); +} +static void command_help_show_wrap(const char *str, unsigned n, unsigned n2) +{ + const char *cp = str, *last = str; + while (*cp) + { + const char *next = last; + do { + cp = next; + do { + next++; + } while (*next != ' ' && *next != '\t' && *next != '\0'); + } while ((next - last < HELP_LINE_WIDTH(n)) && *next != '\0'); + if (next - last < HELP_LINE_WIDTH(n)) + cp = next; + command_help_show_indent(n); + LOG_USER_N("%.*s", (int)(cp - last), last); + LOG_USER_N("\n"); + last = cp + 1; + n = n2; + } +} static COMMAND_HELPER(command_help_show, struct command *c, unsigned n, bool show_help) { - const char *usage = c->usage ? : ""; - const char *help = ""; - const char *sep = ""; - if (show_help && c->help) - { - help = c->help ? : ""; - sep = c->usage ? " | " : ""; + command_help_show_indent(n); + LOG_USER_N("%s", command_name(c, ' ')); + if (c->usage) { + LOG_USER_N(" "); + command_help_show_wrap(c->usage, 0, n + 5); } - command_run_linef(CMD_CTX, "cmd_help {%s} {%s%s%s} %d", - command_name(c, ' '), usage, sep, help, n); - + else + LOG_USER_N("\n"); + if (show_help && c->help) + command_help_show_wrap(c->help, n + 3, n + 3); if (++n >= 2) return ERROR_OK; diff --git a/src/helper/startup.tcl b/src/helper/startup.tcl index 5969cfec7a..f11d5b6838 100644 --- a/src/helper/startup.tcl +++ b/src/helper/startup.tcl @@ -10,40 +10,6 @@ proc exit {} { ocd_throw exit } -# Help text list. A list of command + help text pairs. -proc cmd_help {cmdname h indent} { - set indent [expr $indent * 2] - - set fmt_str [format "%%%ds%%-%ds %%s" $indent [expr 25 - $indent]] - set w [expr 50 - $indent] - set n 0 - - while 1 { - if {$n > [string length $h]} {break} - - set next_a [expr $n + $w] - if {[string length $h] > $n + $w} \ - { - set xxxx [string range $h $n [expr $n + $w]] - for {set lastpos [expr [string length $xxxx] - 1]} \ - {$lastpos >= 0 && [string compare \ - [string range $xxxx $lastpos $lastpos] " "] != 0} \ - {set lastpos [expr $lastpos - 1]} \ - { - } - #set next_a -1 - if {$lastpos != -1} { - set next_a [expr $lastpos + $n + 1] - } - } - - puts [format $fmt_str "" $cmdname \ - [string range $h $n [expr $next_a - 1]] ] - set cmdname "" - set n [expr $next_a] - } -} - # Try flipping / and \ to find file if the filename does not # match the precise spelling proc find {filename} {