[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