diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2000-03-23 23:21:27 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@dberlin.org> | 2000-03-23 23:21:27 +0000 |
commit | 6837a0a2a98f17adfd4b3723b6130d3ae4ae258e (patch) | |
tree | a963196cc70581c8324fbe357bc92bc868295e0f /gdb/command.c | |
parent | 0f4db1a1596363685d1d8b466479d75203a286b9 (diff) | |
download | gdb-6837a0a2a98f17adfd4b3723b6130d3ae4ae258e.zip gdb-6837a0a2a98f17adfd4b3723b6130d3ae4ae258e.tar.gz gdb-6837a0a2a98f17adfd4b3723b6130d3ae4ae258e.tar.bz2 |
Added the apropos command
Diffstat (limited to 'gdb/command.c')
-rw-r--r-- | gdb/command.c | 88 |
1 files changed, 87 insertions, 1 deletions
diff --git a/gdb/command.c b/gdb/command.c index e0b7ad7..826cc46 100644 --- a/gdb/command.c +++ b/gdb/command.c @@ -27,7 +27,7 @@ #endif #include "gdb_wait.h" - +#include "gnu-regex.h" /* FIXME: this should be auto-configured! */ #ifdef __MSDOS__ # define CANT_FORK @@ -54,6 +54,10 @@ static struct cmd_list_element *find_cmd PARAMS ((char *command, struct cmd_list_element * clist, int ignore_help_classes, int *nfound)); +static void apropos_cmd_helper (struct ui_file *, struct cmd_list_element *, + struct re_pattern_buffer *, char *); + +void apropos_command (char *, int); void _initialize_command PARAMS ((void)); @@ -370,6 +374,87 @@ delete_cmd (name, list) c = c->next; } } +/* Recursively walk the commandlist structures, and print out the + documentation of commands that match our regex in either their + name, or their documentation. +*/ +static void +apropos_cmd_helper (struct ui_file *stream, struct cmd_list_element *commandlist, + struct re_pattern_buffer *regex, char *prefix) +{ + register struct cmd_list_element *c; + int returnvalue=1; /*Needed to avoid double printing*/ + /* Walk through the commands */ + for (c=commandlist;c;c=c->next) + { + if (c->name != NULL) + { + /* Try to match against the name*/ + returnvalue=re_search(regex,c->name,strlen(c->name),0,strlen(c->name),NULL); + if (returnvalue >= 0) + { + /* Stolen from help_cmd_list. We don't directly use + * help_cmd_list because it doesn't let us print out + * single commands + */ + fprintf_filtered (stream, "%s%s -- ", prefix, c->name); + print_doc_line (stream, c->doc); + fputs_filtered ("\n", stream); + returnvalue=0; /*Set this so we don't print it again.*/ + } + } + if (c->doc != NULL && returnvalue != 0) + { + /* Try to match against documentation */ + if (re_search(regex,c->doc,strlen(c->doc),0,strlen(c->doc),NULL) >=0) + { + /* Stolen from help_cmd_list. We don't directly use + * help_cmd_list because it doesn't let us print out + * single commands + */ + fprintf_filtered (stream, "%s%s -- ", prefix, c->name); + print_doc_line (stream, c->doc); + fputs_filtered ("\n", stream); + } + } + /* Check if this command has subcommands */ + if (c->prefixlist != NULL) + { + /* Recursively call ourselves on the subcommand list, + passing the right prefix in. + */ + apropos_cmd_helper(stream,*c->prefixlist,regex,c->prefixname); + } + } +} +/* Search through names of commands and documentations for a certain + regular expression. +*/ +void +apropos_command (char *searchstr, int from_tty) +{ + extern struct cmd_list_element *cmdlist; /*This is the main command list*/ + regex_t pattern; + char *pattern_fastmap; + char errorbuffer[512]; + pattern_fastmap=calloc(256,sizeof(char)); + if (searchstr == NULL) + error("REGEXP string is empty"); + + if (regcomp(&pattern,searchstr,REG_ICASE) == 0) + { + pattern.fastmap=pattern_fastmap; + re_compile_fastmap(&pattern); + apropos_cmd_helper(gdb_stdout,cmdlist,&pattern,""); + } + else + { + regerror(regcomp(&pattern,searchstr,REG_ICASE),NULL,errorbuffer,512); + error("Error in regular expression:%s",errorbuffer); + } + free(pattern_fastmap); +} + /* This command really has to deal with two things: * 1) I want documentation on *this string* (usually called by @@ -1693,4 +1778,5 @@ With no arguments, run an inferior shell."); "Show definitions of user defined commands.\n\ Argument is the name of the user defined command.\n\ With no argument, show definitions of all user defined commands.", &showlist); + add_com ("apropos", class_support, apropos_command, "Search for commands matching a REGEXP"); } |