[Crash-utility] [PATCH] help screen indication of extension commands
Paul Sanders
pms at csd.sgi.com
Mon Sep 15 14:35:53 UTC 2008
On Mon, 15 Sep 2008, Dave Anderson wrote:
> Cliff Wickman wrote:
> > From: Cliff Wickman <cpw at sgi.com>
> >
> > It would be nice if the help screen differentiated between built-in
> > commands and extension commands.
> > Particularly in the case of sial extensions, as you can edit them
> > in your crash session. If you know that the command is sial you
> > can fix or enhance it if necessary.
>
> Why? The whole point of extension command support is to seamlessly
> integrate them into the help command menu as if they were native
> commands.
>
> Secondly, if you're sophisticated enough to actually be utilizing
> the sial facility, then you should know which commands are sial or
> not -- especially if you then plan to dynamically fix/enhance the
> command.
Actually, the sial facility lets sophisticated folks create scripts for
the less sophisticated folks to use. Otherwise we'd just dump out the info
from the structures...over, and over, and over again :-)
>
> Third, if you *really* need to know whether a command is an extension
> command, the "extend" command entered without args should show it.
>
> Plus it's kind of ugly. I'm sorry, I just can't buy into this
> one at all...
>
> Dave
>
>
> >
> > This patch implements that by changing the pc->cmdlist from a list
> > of name pointers to a list of struct command_table_entry pointers.
> > Then the help screen can highlight those containing a new flag:
> > if (cp->flags & EXTENSION)
> >
> > Diffed against crash-4.0-4.7
> >
> > Signed-off-by: Cliff Wickman <cpw at sgi.com>
> > ---
> > defs.h | 4 ++-
> > help.c | 66 ++++++++++++++++++++++++++++++++++++++++-------------------------
> > 2 files changed, 44 insertions(+), 26 deletions(-)
> >
> > Index: crash-4.0-4.7/help.c
> > ===================================================================
> > --- crash-4.0-4.7.orig/help.c
> > +++ crash-4.0-4.7/help.c
> > @@ -154,19 +154,23 @@ help_init(void)
> > for (cp = ext->command_table; cp->name; cp++) {
> > if (!(cp->flags & (CLEANUP|HIDDEN_COMMAND)))
> > pc->ncmds++;
> > + cp->flags |= EXTENSION;
> > }
> > }
> >
> > if (!pc->cmdlist) {
> > pc->cmdlistsz = pc->ncmds;
> > - if ((pc->cmdlist = (char **)
> > - malloc(sizeof(char *) * pc->cmdlistsz)) == NULL)
> > + if ((pc->cmdlist = (struct command_table_entry **)
> > + malloc(sizeof(struct command_table_entry *) *
> > + pc->cmdlistsz)) == NULL)
> > error(FATAL,
> > "cannot malloc command list space\n");
> > } else if (pc->ncmds > pc->cmdlistsz) {
> > pc->cmdlistsz = pc->ncmds;
> > - if ((pc->cmdlist = (char **)realloc(pc->cmdlist,
> > - sizeof(char *) * pc->cmdlistsz)) == NULL)
> > + if ((pc->cmdlist = (struct command_table_entry **)
> > + realloc(pc->cmdlist,
> > + sizeof(struct command_table_entry *) *
> > + pc->cmdlistsz)) == NULL)
> > error(FATAL,
> > "cannot realloc command list space\n");
> > }
> > @@ -190,13 +194,13 @@ reshuffle_cmdlist(void)
> >
> > for (cnt = 0, cp = pc->cmd_table; cp->name; cp++) {
> > if (!(cp->flags & HIDDEN_COMMAND))
> > - pc->cmdlist[cnt++] = cp->name;
> > + pc->cmdlist[cnt++] = cp;
> > }
> >
> > for (ext = extension_table; ext; ext = ext->next) {
> > for (cp = ext->command_table; cp->name; cp++) {
> > if (!(cp->flags & (CLEANUP|HIDDEN_COMMAND)))
> > - pc->cmdlist[cnt++] = cp->name;
> > + pc->cmdlist[cnt++] = cp;
> > }
> > }
> >
> > @@ -212,19 +216,21 @@ reshuffle_cmdlist(void)
> > * The help list is in alphabetical order, with exception of the "q" command,
> > * which has historically always been the last command in the list.
> > */
> > -
> > +/*
> > + * the pointers are pointers to struct command_table_entry
> > + */
> > static int
> > -sort_command_name(const void *name1, const void *name2)
> > +sort_command_name(const void *struct1, const void *struct2)
> > {
> > - char **s1, **s2;
> > + char *s1, *s2;
> >
> > - s1 = (char **)name1;
> > - s2 = (char **)name2;
> > + s1 = (*(struct command_table_entry **)struct1)->name;
> > + s2 = (*(struct command_table_entry **)struct2)->name;
> >
> > - if (STREQ(*s1, "q"))
> > + if (STREQ(s1, "q"))
> > return 1;
> >
> > - return strcmp(*s1, *s2);
> > + return strcmp(s1, s2);
> > }
> >
> >
> > @@ -408,8 +414,9 @@ cmd_help(void)
> > void
> > display_help_screen(char *indent)
> > {
> > - int i, j, rows;
> > + int i, j, rows, ext_count=0;
> > char **namep;
> > + struct command_table_entry **cpp, *cp;
> >
> > help_init();
> >
> > @@ -418,15 +425,23 @@ display_help_screen(char *indent)
> > rows = (pc->ncmds + (HELP_COLUMNS-1)) / HELP_COLUMNS;
> >
> > for (i = 0; i < rows; i++) {
> > - namep = &pc->cmdlist[i];
> > + cpp = &(pc->cmdlist[i]);
> > for (j = 0; j < HELP_COLUMNS; j++) {
> > - fprintf(fp,"%-15s", *namep);
> > - namep += rows;
> > - if ((namep - pc->cmdlist) >= pc->ncmds)
> > + cp = *cpp;
> > + if (cp->flags & EXTENSION) {
> > + fprintf(fp,"+%-15s", cp->name);
> > + ext_count++;
> > + } else {
> > + fprintf(fp," %-15s", cp->name);
> > + }
> > + cpp += rows;
> > + if ((cpp - pc->cmdlist) >= pc->ncmds)
> > break;
> > }
> > fprintf(fp,"\n%s", indent);
> > }
> > + if (ext_count)
> > + fprintf(fp,"+ denotes an extension command\n%s", indent);
> >
> > fprintf(fp, "\n%s%s version: %-6s gdb version: %s\n", indent,
> > pc->program_name, pc->program_version, pc->gdb_version);
> > @@ -454,17 +469,16 @@ static void
> > display_commands(void)
> > {
> > int i, j, rows;
> > - char **namep;
> > + struct command_table_entry **cp;
> >
> > help_init();
> > rows = (pc->ncmds + (HELP_COLUMNS-1)) / HELP_COLUMNS;
> >
> > for (i = 0; i < rows; i++) {
> > - namep = &pc->cmdlist[i];
> > + cp = &pc->cmdlist[i];
> > for (j = 0; j < HELP_COLUMNS; j++) {
> > - fprintf(fp,"%s\n", *namep);
> > - namep += rows;
> > - if ((namep - pc->cmdlist) >= pc->ncmds) {
> > + cp += rows;
> > + if ((cp - pc->cmdlist) >= pc->ncmds) {
> > fprintf(fp, "BREAK\n");
> > break;
> > }
> > @@ -4957,8 +4971,10 @@ cmd_usage(char *cmd, int helpflag)
> > display_input_info();
> > display_output_info();
> > help_init();
> > - for (i = 0; i < pc->ncmds; i++)
> > - cmd_usage(pc->cmdlist[i], COMPLETE_HELP);
> > + for (i = 0; i < pc->ncmds; i++) {
> > + cp = *(&(pc->cmdlist[i]));
> > + cmd_usage(cp->name, COMPLETE_HELP);
> > + }
> > display_warranty_info();
> > display_copying_info();
> > goto done_usage;
> > Index: crash-4.0-4.7/defs.h
> > ===================================================================
> > --- crash-4.0-4.7.orig/defs.h
> > +++ crash-4.0-4.7/defs.h
> > @@ -383,7 +383,8 @@ struct program_context {
> > struct termios termios_orig; /* non-raw settings */
> > struct termios termios_raw; /* while gathering command input */
> > int ncmds; /* number of commands in menu */
> > - char **cmdlist; /* current list of available commands */
> > + struct command_table_entry **cmdlist;
> > + /* current list of available commands */
> > int cmdlistsz; /* space available in cmdlist */
> > unsigned output_radix; /* current gdb output_radix */
> > void *sbrk; /* current sbrk value */
> > @@ -409,6 +410,7 @@ struct command_table_entry {
> > #define REFRESH_TASK_TABLE (0x1) /* command_table_entry flags */
> > #define HIDDEN_COMMAND (0x2)
> > #define CLEANUP (0x4) /* for extensions only */
> > +#define EXTENSION (0x8) /* is an extension */
> >
> > /*
> > * A linked list of extension table structures keeps track of the current
> >
> > --
> > Crash-utility mailing list
> > Crash-utility at redhat.com
> > https://www.redhat.com/mailman/listinfo/crash-utility
>
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
>
More information about the Crash-utility
mailing list