aboutsummaryrefslogtreecommitdiff
path: root/gdb/cli/cli-decode.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2017-09-09 20:51:33 -0600
committerTom Tromey <tom@tromey.com>2017-09-27 08:44:14 -0600
commit0450cc4ce8b4775c47e9aaa1c5a34e181b10ae98 (patch)
treef72a3f6796ac10fe11c3ca341aaf22aea3a8b693 /gdb/cli/cli-decode.c
parenta9bbfbd85fddfea2db30810c33c4bb130a2ef773 (diff)
downloadgdb-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.c73
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));
}