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@xxxxxxx>
---
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@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/crash-utility