gdb: add cmd_list_element::is_command_class_help
authorSimon Marchi <simon.marchi@polymtl.ca>
Mon, 17 May 2021 18:01:32 +0000 (14:01 -0400)
committerSimon Marchi <simon.marchi@polymtl.ca>
Mon, 17 May 2021 18:01:32 +0000 (14:01 -0400)
Same idea as the previous patches, but for whether a command is a
"command class help" command.  I think this one is particularly useful,
because it's not obvious when reading code what "c->func == NULL" means.

Remove the cmd_func_p function, which does kind of the same thing as
cmd_list_element::is_command_class_help (except it doesn't give a clue
about the semantic of a NULL func value).

gdb/ChangeLog:

* cli/cli-decode.h (cmd_list_element) <is_command_class_help>:
New, use it.
* command.h (cmd_func_p): Remove.
* cli/cli-decode.c (cmd_func_p): Remove.

Change-Id: I521a3e1896dc93a5babe1493d18f5eb071e1b3b7

gdb/ChangeLog
gdb/cli/cli-decode.c
gdb/cli/cli-decode.h
gdb/command.h
gdb/top.c

index b39879fcd5b81f5ce47502dcc792261b1c649b79..1e6b52ad19d99befc0528c5740de72a62ad8ceab 100644 (file)
@@ -1,3 +1,10 @@
+2021-05-17  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * cli/cli-decode.h (cmd_list_element) <is_command_class_help>:
+       New, use it.
+       * command.h (cmd_func_p): Remove.
+       * cli/cli-decode.c (cmd_func_p): Remove.
+
 2021-05-17  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * cli/cli-decode.h (cmd_list_element) <is_alias>: New, use it.
index 785e726a81f6903522605546e13f9663c12e0a07..fbead7004ed4f1b076b5809226550b17daec9d6d 100644 (file)
@@ -1250,7 +1250,7 @@ help_cmd (const char *command, struct ui_file *stream)
   fputs_filtered (c->doc, stream);
   fputs_filtered ("\n", stream);
 
-  if (!c->is_prefix () && c->func != NULL)
+  if (!c->is_prefix () && !c->is_command_class_help ())
     return;
 
   fprintf_filtered (stream, "\n");
@@ -1261,7 +1261,7 @@ help_cmd (const char *command, struct ui_file *stream)
               all_commands, stream);
 
   /* If this is a class name, print all of the commands in the class.  */
-  if (c->func == NULL)
+  if (c->is_command_class_help ())
     help_list (cmdlist, "", c->theclass, stream);
 
   if (c->hook_pre || c->hook_post)
@@ -1362,7 +1362,7 @@ help_all (struct ui_file *stream)
       /* If this is a class name, print all of the commands in the
         class.  */
 
-      if (c->func == NULL)
+      if (c->is_command_class_help ())
        {
          fprintf_filtered (stream, "\nCommand class: %s\n\n", c->name);
          help_cmd_list (cmdlist, c->theclass, true, stream);
@@ -1498,8 +1498,8 @@ help_cmd_list (struct cmd_list_element *list, enum command_class theclass,
        }
 
       if (theclass == all_commands
-         || (theclass == all_classes && c->func == NULL)
-         || (theclass == c->theclass && c->func != NULL))
+         || (theclass == all_classes && c->is_command_class_help ())
+         || (theclass == c->theclass && !c->is_command_class_help ()))
        {
          /* show C when
             - showing all commands
@@ -1545,7 +1545,7 @@ find_cmd (const char *command, int len, struct cmd_list_element *clist,
   *nfound = 0;
   for (c = clist; c; c = c->next)
     if (!strncmp (command, c->name, len)
-       && (!ignore_help_classes || c->func))
+       && (!ignore_help_classes || !c->is_command_class_help ()))
       {
        found = c;
        (*nfound)++;
@@ -2124,7 +2124,7 @@ complete_on_cmdlist (struct cmd_list_element *list,
       for (ptr = list; ptr; ptr = ptr->next)
        if (!strncmp (ptr->name, text, textlen)
            && !ptr->abbrev_flag
-           && (!ignore_help_classes || ptr->func
+           && (!ignore_help_classes || !ptr->is_command_class_help ()
                || ptr->is_prefix ()))
          {
            if (pass == 0)
@@ -2174,20 +2174,11 @@ complete_on_enum (completion_tracker &tracker,
       tracker.add_completion (make_completion_match_str (name, text, word));
 }
 
-
-/* Check function pointer.  */
-int
-cmd_func_p (struct cmd_list_element *cmd)
-{
-  return (cmd->func != NULL);
-}
-
-
 /* Call the command function.  */
 void
 cmd_func (struct cmd_list_element *cmd, const char *args, int from_tty)
 {
-  if (cmd_func_p (cmd))
+  if (!cmd->is_command_class_help ())
     {
       gdb::optional<scoped_restore_tmpl<int>> restore_suppress;
 
index 6204ed745e00a6c02ee034dd5a3bb7d91938330a..9328659775ca83fa8e09c8a7881bc81323cf7ee1 100644 (file)
@@ -87,6 +87,12 @@ struct cmd_list_element
   bool is_prefix () const
   { return this->subcommands != nullptr; }
 
+  /* Return true if this command is a "command class help" command.  For
+     instance, a "stack" dummy command is registered so that one can do
+     "help stack" and show help for all commands of the "stack" class.  */
+  bool is_command_class_help () const
+  { return this->func == nullptr; }
+
   /* Points to next command in this list.  */
   struct cmd_list_element *next = nullptr;
 
index fe3c7b482f04b809577da73957c02014873b20df..685038716a4194d8506dcbc5fecbf3cd83a3f8fc 100644 (file)
@@ -595,9 +595,6 @@ extern void save_command_line (const char *cmd);
 
 extern void not_just_help_class_command (const char *, int);
 
-/* Check function pointer.  */
-extern int cmd_func_p (struct cmd_list_element *cmd);
-
 /* Call the command function.  */
 extern void cmd_func (struct cmd_list_element *cmd,
                      const char *args, int from_tty);
index a1a932ae93e96c2a566553cd6b52a56cbbf81c95..b9635368cacb37100bae87d3a41bd22001c10e59 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -666,7 +666,7 @@ execute_command (const char *p, int from_tty)
        do_set_command (arg, from_tty, c);
       else if (c->type == show_cmd)
        do_show_command (arg, from_tty, c);
-      else if (!cmd_func_p (c))
+      else if (c->is_command_class_help ())
        error (_("That is not a command, just a help topic."));
       else if (deprecated_call_command_hook)
        deprecated_call_command_hook (c, arg, from_tty);