diff options
author | Tom Tromey <tom@tromey.com> | 2017-09-09 20:51:33 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2017-09-27 08:44:14 -0600 |
commit | 0450cc4ce8b4775c47e9aaa1c5a34e181b10ae98 (patch) | |
tree | f72a3f6796ac10fe11c3ca341aaf22aea3a8b693 /gdb/cli/cli-decode.c | |
parent | a9bbfbd85fddfea2db30810c33c4bb130a2ef773 (diff) | |
download | gdb-0450cc4ce8b4775c47e9aaa1c5a34e181b10ae98.zip gdb-0450cc4ce8b4775c47e9aaa1c5a34e181b10ae98.tar.gz gdb-0450cc4ce8b4775c47e9aaa1c5a34e181b10ae98.tar.bz2 |
Add add_cmd function overloads
This adds two add_cmd overloads: one whose callback takes a const char *,
and one that doesn't accept a function at all. The no-function overload
was introduced to avoid ambiguity when NULL was passed as the function.
Long term the goal is for all commands to take const arguments, and
for the non-const variants to be removed entirely.
gdb/ChangeLog
2017-09-27 Tom Tromey <tom@tromey.com>
* cli/cli-decode.c (add_cmd, set_cmd_cfunc): New function
overloads.
(do_add_cmd): Rename from add_cmd. Don't call set_cmd_cfunc.
(do_const_cfunc): New function.
(cmd_cfunc_eq): New overload.
(cli_user_command_p): Check do_const_cfunc.
* cli/cli-decode.h (struct cmd_list_element) <function>: New field
const_cfunc.
* command.h (add_cmd): Add const overload and no-function
overload.
(set_cmd_cfunc): Add const overload.
(cmd_const_cfunc_ftype): Declare.
(cmd_cfunc_eq): Add const overload.
* breakpoint.c, cli-cmds.c, cli-dump.c, guile/scm-cmd.c,
python/py-cmd.c, target.c, tracepoint.c: Use no-function add_cmd
overload.
Diffstat (limited to 'gdb/cli/cli-decode.c')
-rw-r--r-- | gdb/cli/cli-decode.c | 73 |
1 files changed, 62 insertions, 11 deletions
diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c index 1bbbe46..257a9c4 100644 --- a/gdb/cli/cli-decode.c +++ b/gdb/cli/cli-decode.c @@ -103,7 +103,7 @@ print_help_for_command (struct cmd_list_element *c, const char *prefix, static void do_cfunc (struct cmd_list_element *c, char *args, int from_tty) { - c->function.cfunc (args, from_tty); /* Ok. */ + c->function.cfunc (args, from_tty); } void @@ -113,13 +113,29 @@ set_cmd_cfunc (struct cmd_list_element *cmd, cmd_cfunc_ftype *cfunc) cmd->func = NULL; else cmd->func = do_cfunc; - cmd->function.cfunc = cfunc; /* Ok. */ + cmd->function.cfunc = cfunc; +} + +static void +do_const_cfunc (struct cmd_list_element *c, char *args, int from_tty) +{ + c->function.const_cfunc (args, from_tty); +} + +void +set_cmd_cfunc (struct cmd_list_element *cmd, cmd_const_cfunc_ftype *cfunc) +{ + if (cfunc == NULL) + cmd->func = NULL; + else + cmd->func = do_const_cfunc; + cmd->function.const_cfunc = cfunc; } static void do_sfunc (struct cmd_list_element *c, char *args, int from_tty) { - c->function.sfunc (args, from_tty, c); /* Ok. */ + c->function.sfunc (args, from_tty, c); } void @@ -129,7 +145,7 @@ set_cmd_sfunc (struct cmd_list_element *cmd, cmd_sfunc_ftype *sfunc) cmd->func = NULL; else cmd->func = do_sfunc; - cmd->function.sfunc = sfunc; /* Ok. */ + cmd->function.sfunc = sfunc; } int @@ -138,6 +154,12 @@ cmd_cfunc_eq (struct cmd_list_element *cmd, cmd_cfunc_ftype *cfunc) return cmd->func == do_cfunc && cmd->function.cfunc == cfunc; } +int +cmd_cfunc_eq (struct cmd_list_element *cmd, cmd_const_cfunc_ftype *cfunc) +{ + return cmd->func == do_const_cfunc && cmd->function.const_cfunc == cfunc; +} + void set_cmd_context (struct cmd_list_element *cmd, void *context) { @@ -189,9 +211,9 @@ set_cmd_completer_handle_brkchars (struct cmd_list_element *cmd, Returns a pointer to the added command (not necessarily the head of *LIST). */ -struct cmd_list_element * -add_cmd (const char *name, enum command_class theclass, cmd_cfunc_ftype *fun, - const char *doc, struct cmd_list_element **list) +static struct cmd_list_element * +do_add_cmd (const char *name, enum command_class theclass, + const char *doc, struct cmd_list_element **list) { struct cmd_list_element *c = XNEW (struct cmd_list_element); struct cmd_list_element *p, *iter; @@ -229,7 +251,6 @@ add_cmd (const char *name, enum command_class theclass, cmd_cfunc_ftype *fun, c->name = name; c->theclass = theclass; - set_cmd_cfunc (c, fun); set_cmd_context (c, NULL); c->doc = doc; c->cmd_deprecated = 0; @@ -259,6 +280,35 @@ add_cmd (const char *name, enum command_class theclass, cmd_cfunc_ftype *fun, return c; } +struct cmd_list_element * +add_cmd (const char *name, enum command_class theclass, cmd_cfunc_ftype *fun, + const char *doc, struct cmd_list_element **list) +{ + cmd_list_element *result = do_add_cmd (name, theclass, doc, list); + set_cmd_cfunc (result, fun); + return result; +} + +struct cmd_list_element * +add_cmd (const char *name, enum command_class theclass, + const char *doc, struct cmd_list_element **list) +{ + cmd_list_element *result = do_add_cmd (name, theclass, doc, list); + result->func = NULL; + result->function.cfunc = NULL; /* Ok. */ + return result; +} + +struct cmd_list_element * +add_cmd (const char *name, enum command_class theclass, + cmd_const_cfunc_ftype *fun, + const char *doc, struct cmd_list_element **list) +{ + cmd_list_element *result = do_add_cmd (name, theclass, doc, list); + set_cmd_cfunc (result, fun); + return result; +} + /* Deprecates a command CMD. REPLACEMENT is the name of the command which should be used in place of this command, or NULL if no such command exists. @@ -301,7 +351,7 @@ add_alias_cmd (const char *name, cmd_list_element *old, return 0; } - struct cmd_list_element *c = add_cmd (name, theclass, NULL, old->doc, list); + struct cmd_list_element *c = add_cmd (name, theclass, old->doc, list); /* If OLD->DOC can be freed, we should make another copy. */ if (old->doc_allocated) @@ -419,7 +469,7 @@ add_set_or_show_cmd (const char *name, const char *doc, struct cmd_list_element **list) { - struct cmd_list_element *c = add_cmd (name, theclass, NULL, doc, list); + struct cmd_list_element *c = add_cmd (name, theclass, doc, list); gdb_assert (type == set_cmd || type == show_cmd); c->type = type; @@ -1909,5 +1959,6 @@ int cli_user_command_p (struct cmd_list_element *cmd) { return (cmd->theclass == class_user - && (cmd->func == do_cfunc || cmd->func == do_sfunc)); + && (cmd->func == do_cfunc || cmd->func == do_sfunc + || cmd->func == do_const_cfunc)); } |