* cli/cli-cmds.c (apropos_command): Free the compiled regex. Use

get_regcomp_error.
	* utils.c: Include gdb_regex.h.
	(do_regfree_cleanup): New function.
	(make_regfree_cleanup): Likewise.
	(get_regcomp_error): Likewise.
	* gdb_regex.h (make_regfree_cleanup, get_regcomp_error): Declare.
This commit is contained in:
Tom Tromey
2011-01-17 16:50:42 +00:00
parent da17376b70
commit dc92e16124
4 changed files with 60 additions and 6 deletions

View File

@@ -1,3 +1,13 @@
2011-01-17 Tom Tromey <tromey@redhat.com>
* cli/cli-cmds.c (apropos_command): Free the compiled regex. Use
get_regcomp_error.
* utils.c: Include gdb_regex.h.
(do_regfree_cleanup): New function.
(make_regfree_cleanup): Likewise.
(get_regcomp_error): Likewise.
* gdb_regex.h (make_regfree_cleanup, get_regcomp_error): Declare.
2011-01-17 Tom Tromey <tromey@redhat.com> 2011-01-17 Tom Tromey <tromey@redhat.com>
* cli/cli-cmds.c (apropos_command): Fix formatting. Don't call * cli/cli-cmds.c (apropos_command): Fix formatting. Don't call

View File

@@ -1254,18 +1254,26 @@ void
apropos_command (char *searchstr, int from_tty) apropos_command (char *searchstr, int from_tty)
{ {
regex_t pattern; regex_t pattern;
char errorbuffer[512]; int code;
if (searchstr == NULL) if (searchstr == NULL)
error (_("REGEXP string is empty")); error (_("REGEXP string is empty"));
if (regcomp (&pattern, searchstr, REG_ICASE) == 0) code = regcomp (&pattern, searchstr, REG_ICASE);
apropos_cmd (gdb_stdout, cmdlist, &pattern, ""); if (code == 0)
{
struct cleanup *cleanups;
cleanups = make_regfree_cleanup (&pattern);
apropos_cmd (gdb_stdout, cmdlist, &pattern, "");
do_cleanups (cleanups);
}
else else
{ {
regerror (regcomp (&pattern, searchstr, REG_ICASE), NULL, char *err = get_regcomp_error (code, &pattern);
errorbuffer, 512);
error (_("Error in regular expression: %s"), errorbuffer); make_cleanup (xfree, err);
error (_("Error in regular expression: %s"), err);
} }
} }

View File

@@ -28,4 +28,8 @@
# include <regex.h> # include <regex.h>
#endif #endif
/* From utils.c. */
struct cleanup *make_regfree_cleanup (regex_t *);
char *get_regcomp_error (int, regex_t *);
#endif /* not GDB_REGEX_H */ #endif /* not GDB_REGEX_H */

View File

@@ -73,6 +73,7 @@
#include "gdb_usleep.h" #include "gdb_usleep.h"
#include "interps.h" #include "interps.h"
#include "gdb_regex.h"
#if !HAVE_DECL_MALLOC #if !HAVE_DECL_MALLOC
extern PTR malloc (); /* ARI: PTR */ extern PTR malloc (); /* ARI: PTR */
@@ -1643,6 +1644,37 @@ gdb_print_host_address (const void *addr, struct ui_file *stream)
} }
/* A cleanup function that calls regfree. */
static void
do_regfree_cleanup (void *r)
{
regfree (r);
}
/* Create a new cleanup that frees the compiled regular expression R. */
struct cleanup *
make_regfree_cleanup (regex_t *r)
{
return make_cleanup (do_regfree_cleanup, r);
}
/* Return an xmalloc'd error message resulting from a regular
expression compilation failure. */
char *
get_regcomp_error (int code, regex_t *rx)
{
size_t length = regerror (code, rx, NULL, 0);
char *result = xmalloc (length);
regerror (code, rx, result, length);
return result;
}
/* This function supports the query, nquery, and yquery functions. /* This function supports the query, nquery, and yquery functions.
Ask user a y-or-n question and return 0 if answer is no, 1 if Ask user a y-or-n question and return 0 if answer is no, 1 if
answer is yes, or default the answer to the specified default answer is yes, or default the answer to the specified default