From dc92e16124ca764e536f2457635749e5431c4765 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 17 Jan 2011 16:50:42 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 10 ++++++++++ gdb/cli/cli-cmds.c | 20 ++++++++++++++------ gdb/gdb_regex.h | 4 ++++ gdb/utils.c | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 6 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5a814c4d8b7..136bb1d8ee2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2011-01-17 Tom Tromey + + * 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 * cli/cli-cmds.c (apropos_command): Fix formatting. Don't call diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index e1d8174f6ad..c11b257eeae 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -1254,18 +1254,26 @@ void apropos_command (char *searchstr, int from_tty) { regex_t pattern; - char errorbuffer[512]; + int code; if (searchstr == NULL) error (_("REGEXP string is empty")); - if (regcomp (&pattern, searchstr, REG_ICASE) == 0) - apropos_cmd (gdb_stdout, cmdlist, &pattern, ""); + code = regcomp (&pattern, searchstr, REG_ICASE); + if (code == 0) + { + struct cleanup *cleanups; + + cleanups = make_regfree_cleanup (&pattern); + apropos_cmd (gdb_stdout, cmdlist, &pattern, ""); + do_cleanups (cleanups); + } else { - regerror (regcomp (&pattern, searchstr, REG_ICASE), NULL, - errorbuffer, 512); - error (_("Error in regular expression: %s"), errorbuffer); + char *err = get_regcomp_error (code, &pattern); + + make_cleanup (xfree, err); + error (_("Error in regular expression: %s"), err); } } diff --git a/gdb/gdb_regex.h b/gdb/gdb_regex.h index ccdf9c360b9..835cb09694c 100644 --- a/gdb/gdb_regex.h +++ b/gdb/gdb_regex.h @@ -28,4 +28,8 @@ # include #endif +/* From utils.c. */ +struct cleanup *make_regfree_cleanup (regex_t *); +char *get_regcomp_error (int, regex_t *); + #endif /* not GDB_REGEX_H */ diff --git a/gdb/utils.c b/gdb/utils.c index c23c4d490e7..82e3adbafb7 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -73,6 +73,7 @@ #include "gdb_usleep.h" #include "interps.h" +#include "gdb_regex.h" #if !HAVE_DECL_MALLOC 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. 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 -- 2.30.2