2005-02-11 H.J. Lu <hongjiu.lu@intel.com>
[deliverable/binutils-gdb.git] / gdb / cli / cli-decode.c
index 87349ef9f5a2648ad50b44a749e2065b6474bdd6..883f7d09a05e04b31387655a26fd120ed6c42185 100644 (file)
@@ -1,6 +1,6 @@
 /* Handle lists of commands, their decoding and documentation, for GDB.
 
-   Copyright 1986, 1989, 1990, 1991, 1998, 2000, 2001, 2002 Free
+   Copyright 1986, 1989, 1990, 1991, 1998, 2000, 2001, 2002, 2004 Free
    Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
 #include "symtab.h"
 #include <ctype.h>
 #include "gdb_regex.h"
+#include "gdb_string.h"
 
 #include "ui-out.h"
 
 #include "cli/cli-cmds.h"
 #include "cli/cli-decode.h"
 
+#ifdef TUI
+#include "tui/tui.h"           /* For tui_active et.al.   */
+#endif
+
 #include "gdb_assert.h"
 
 /* Prototypes for local functions */
@@ -53,8 +58,7 @@ do_cfunc (struct cmd_list_element *c, char *args, int from_tty)
 }
 
 void
-set_cmd_cfunc (struct cmd_list_element *cmd,
-              void (*cfunc) (char *args, int from_tty))
+set_cmd_cfunc (struct cmd_list_element *cmd, cmd_cfunc_ftype *cfunc)
 {
   if (cfunc == NULL)
     cmd->func = NULL;
@@ -70,9 +74,7 @@ do_sfunc (struct cmd_list_element *c, char *args, int from_tty)
 }
 
 void
-set_cmd_sfunc (struct cmd_list_element *cmd,
-              void (*sfunc) (char *args, int from_tty,
-                             struct cmd_list_element * c))
+set_cmd_sfunc (struct cmd_list_element *cmd, cmd_sfunc_ftype *sfunc)
 {
   if (sfunc == NULL)
     cmd->func = NULL;
@@ -135,7 +137,7 @@ struct cmd_list_element *
 add_cmd (char *name, enum command_class class, void (*fun) (char *, int),
         char *doc, struct cmd_list_element **list)
 {
-  register struct cmd_list_element *c
+  struct cmd_list_element *c
   = (struct cmd_list_element *) xmalloc (sizeof (struct cmd_list_element));
   struct cmd_list_element *p;
 
@@ -185,20 +187,6 @@ add_cmd (char *name, enum command_class class, void (*fun) (char *, int),
   return c;
 }
 
-/* Same as above, except that the abbrev_flag is set. */
-/* Note: Doesn't seem to be used anywhere currently. */
-
-struct cmd_list_element *
-add_abbrev_cmd (char *name, enum command_class class, void (*fun) (char *, int),
-               char *doc, struct cmd_list_element **list)
-{
-  register struct cmd_list_element *c
-  = add_cmd (name, class, fun, doc, list);
-
-  c->abbrev_flag = 1;
-  return c;
-}
-
 /* 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.
@@ -228,8 +216,8 @@ add_alias_cmd (char *name, char *oldname, enum command_class class,
 {
   /* Must do this since lookup_cmd tries to side-effect its first arg */
   char *copied_name;
-  register struct cmd_list_element *old;
-  register struct cmd_list_element *c;
+  struct cmd_list_element *old;
+  struct cmd_list_element *c;
   copied_name = (char *) alloca (strlen (oldname) + 1);
   strcpy (copied_name, oldname);
   old = lookup_cmd (&copied_name, *list, "", 1, 1);
@@ -263,7 +251,7 @@ add_prefix_cmd (char *name, enum command_class class, void (*fun) (char *, int),
                char *prefixname, int allow_unknown,
                struct cmd_list_element **list)
 {
-  register struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
+  struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
   c->prefixlist = prefixlist;
   c->prefixname = prefixname;
   c->allow_unknown = allow_unknown;
@@ -278,7 +266,7 @@ add_abbrev_prefix_cmd (char *name, enum command_class class,
                       struct cmd_list_element **prefixlist, char *prefixname,
                       int allow_unknown, struct cmd_list_element **list)
 {
-  register struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
+  struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
   c->prefixlist = prefixlist;
   c->prefixname = prefixname;
   c->allow_unknown = allow_unknown;
@@ -328,6 +316,60 @@ add_set_or_show_cmd (char *name,
   return c;
 }
 
+/* Add element named NAME to both the command SET_LIST and SHOW_LIST.
+   CLASS is as in add_cmd.  VAR_TYPE is the kind of thing we are
+   setting.  VAR is address of the variable being controlled by this
+   command.  SET_FUNC and SHOW_FUNC are the callback functions (if
+   non-NULL).  SET_DOC, SHOW_DOC and HELP_DOC are the documentation
+   strings.  PRINT the format string to print the value.  SET_RESULT
+   and SHOW_RESULT, if not NULL, are set to the resulting command
+   structures.  */
+
+static void
+add_setshow_cmd_full (char *name,
+                     enum command_class class,
+                     var_types var_type, void *var,
+                     const char *set_doc, const char *show_doc,
+                     const char *help_doc,
+                     fprint_setshow_ftype *fprint_setshow,
+                     cmd_sfunc_ftype *set_func,
+                     cmd_sfunc_ftype *show_func,
+                     struct cmd_list_element **set_list,
+                     struct cmd_list_element **show_list,
+                     struct cmd_list_element **set_result,
+                     struct cmd_list_element **show_result)
+{
+  struct cmd_list_element *set;
+  struct cmd_list_element *show;
+  char *full_set_doc;
+  char *full_show_doc;
+
+  if (help_doc != NULL)
+    {
+      full_set_doc = xstrprintf ("%s\n%s", set_doc, help_doc);
+      full_show_doc = xstrprintf ("%s\n%s", show_doc, help_doc);
+    }
+  else
+    {
+      full_set_doc = xstrdup (set_doc);
+      full_show_doc = xstrdup (show_doc);
+    }
+  set = add_set_or_show_cmd (name, set_cmd, class, var_type, var,
+                            full_set_doc, set_list);
+  if (set_func != NULL)
+    set_cmd_sfunc (set, set_func);
+  show = add_set_or_show_cmd (name, show_cmd, class, var_type, var,
+                             full_show_doc, show_list);
+  show->fprint_setshow = fprint_setshow;
+
+  if (show_func != NULL)
+    set_cmd_sfunc (show, show_func);
+
+  if (set_result != NULL)
+    *set_result = set;
+  if (show_result != NULL)
+    *show_result = show;
+}
 
 struct cmd_list_element *
 add_set_cmd (char *name,
@@ -363,57 +405,182 @@ add_set_enum_cmd (char *name,
   return c;
 }
 
-/* Add element named NAME to command list LIST (the list for set
-   or some sublist thereof).
-   CLASS is as in add_cmd.
-   VAR is address of the variable which will contain the value.
-   DOC is the documentation string.  */
-struct cmd_list_element *
-add_set_auto_boolean_cmd (char *name,
-                         enum command_class class,
-                         enum cmd_auto_boolean *var,
-                         char *doc,
-                         struct cmd_list_element **list)
+/* Add element named NAME to command list LIST (the list for set or
+   some sublist thereof).  CLASS is as in add_cmd.  ENUMLIST is a list
+   of strings which may follow NAME.  VAR is address of the variable
+   which will contain the matching string (from ENUMLIST).  */
+
+void
+add_setshow_enum_cmd (char *name,
+                     enum command_class class,
+                     const char *enumlist[],
+                     const char **var,
+                     const char *set_doc,
+                     const char *show_doc,
+                     const char *help_doc,
+                     fprint_setshow_ftype *fprint_setshow,
+                     cmd_sfunc_ftype *set_func,
+                     cmd_sfunc_ftype *show_func,
+                     struct cmd_list_element **set_list,
+                     struct cmd_list_element **show_list)
+{
+  struct cmd_list_element *c;
+  add_setshow_cmd_full (name, class, var_enum, var,
+                       set_doc, show_doc, help_doc,
+                       fprint_setshow,
+                       set_func, show_func,
+                       set_list, show_list,
+                       &c, NULL);
+  c->enums = enumlist;
+}
+
+/* Add an auto-boolean command named NAME to both the set and show
+   command list lists.  CLASS is as in add_cmd.  VAR is address of the
+   variable which will contain the value.  DOC is the documentation
+   string.  FUNC is the corresponding callback.  */
+void
+add_setshow_auto_boolean_cmd (char *name,
+                             enum command_class class,
+                             enum auto_boolean *var,
+                             const char *set_doc, const char *show_doc,
+                             const char *help_doc,
+                             fprint_setshow_ftype *fprint_setshow,
+                             cmd_sfunc_ftype *set_func,
+                             cmd_sfunc_ftype *show_func,
+                             struct cmd_list_element **set_list,
+                             struct cmd_list_element **show_list)
 {
   static const char *auto_boolean_enums[] = { "on", "off", "auto", NULL };
   struct cmd_list_element *c;
-  c = add_set_cmd (name, class, var_auto_boolean, var, doc, list);
+  add_setshow_cmd_full (name, class, var_auto_boolean, var,
+                       set_doc, show_doc, help_doc, fprint_setshow,
+                       set_func, show_func,
+                       set_list, show_list,
+                       &c, NULL);
   c->enums = auto_boolean_enums;
-  return c;
 }
 
-/* Add element named NAME to command list LIST (the list for set
-   or some sublist thereof).
-   CLASS is as in add_cmd.
-   VAR is address of the variable which will contain the value.
-   DOC is the documentation string.  */
-struct cmd_list_element *
-add_set_boolean_cmd (char *name,
-                    enum command_class class,
-                    int *var,
-                    char *doc,
-                    struct cmd_list_element **list)
+/* Add element named NAME to both the set and show command LISTs (the
+   list for set/show or some sublist thereof).  CLASS is as in
+   add_cmd.  VAR is address of the variable which will contain the
+   value.  SET_DOC and SHOW_DOC are the documentation strings.  */
+void
+add_setshow_boolean_cmd (char *name, enum command_class class, int *var,
+                        const char *set_doc, const char *show_doc,
+                        const char *help_doc,
+                        fprint_setshow_ftype *fprint_setshow,
+                        cmd_sfunc_ftype *set_func,
+                        cmd_sfunc_ftype *show_func,
+                        struct cmd_list_element **set_list,
+                        struct cmd_list_element **show_list)
 {
   static const char *boolean_enums[] = { "on", "off", NULL };
   struct cmd_list_element *c;
-  c = add_set_cmd (name, class, var_boolean, var, doc, list);
+  add_setshow_cmd_full (name, class, var_boolean, var,
+                       set_doc, show_doc, help_doc, fprint_setshow,
+                       set_func, show_func,
+                       set_list, show_list,
+                       &c, NULL);
   c->enums = boolean_enums;
-  return c;
+}
+
+/* Add element named NAME to both the set and show command LISTs (the
+   list for set/show or some sublist thereof).  */
+void
+add_setshow_filename_cmd (char *name, enum command_class class,
+                         char **var,
+                         const char *set_doc, const char *show_doc,
+                         const char *help_doc,
+                         fprint_setshow_ftype *fprint_setshow,
+                         cmd_sfunc_ftype *set_func,
+                         cmd_sfunc_ftype *show_func,
+                         struct cmd_list_element **set_list,
+                         struct cmd_list_element **show_list)
+{
+  add_setshow_cmd_full (name, class, var_filename, var,
+                       set_doc, show_doc, help_doc, fprint_setshow,
+                       set_func, show_func,
+                       set_list, show_list,
+                       NULL, NULL);
+}
+
+/* Add element named NAME to both the set and show command LISTs (the
+   list for set/show or some sublist thereof).  */
+void
+add_setshow_string_cmd (char *name, enum command_class class,
+                         char **var,
+                         const char *set_doc, const char *show_doc,
+                         const char *help_doc,
+                       fprint_setshow_ftype *fprint_setshow,
+                         cmd_sfunc_ftype *set_func,
+                         cmd_sfunc_ftype *show_func,
+                         struct cmd_list_element **set_list,
+                         struct cmd_list_element **show_list)
+{
+  add_setshow_cmd_full (name, class, var_string, var,
+                       set_doc, show_doc, help_doc, fprint_setshow,
+                       set_func, show_func,
+                       set_list, show_list,
+                       NULL, NULL);
+}
+
+/* Add element named NAME to both the set and show command LISTs (the
+   list for set/show or some sublist thereof).  CLASS is as in
+   add_cmd.  VAR is address of the variable which will contain the
+   value.  SET_DOC and SHOW_DOC are the documentation strings.  */
+void
+add_setshow_uinteger_cmd (char *name, enum command_class class,
+                         unsigned int *var,
+                         const char *set_doc, const char *show_doc,
+                         const char *help_doc,
+                         fprint_setshow_ftype *fprint_setshow,
+                         cmd_sfunc_ftype *set_func,
+                         cmd_sfunc_ftype *show_func,
+                         struct cmd_list_element **set_list,
+                         struct cmd_list_element **show_list)
+{
+  add_setshow_cmd_full (name, class, var_uinteger, var,
+                       set_doc, show_doc, help_doc, fprint_setshow,
+                       set_func, show_func,
+                       set_list, show_list,
+                       NULL, NULL);
+}
+
+/* Add element named NAME to both the set and show command LISTs (the
+   list for set/show or some sublist thereof).  CLASS is as in
+   add_cmd.  VAR is address of the variable which will contain the
+   value.  SET_DOC and SHOW_DOC are the documentation strings.  */
+void
+add_setshow_zinteger_cmd (char *name, enum command_class class,
+                         int *var,
+                         const char *set_doc, const char *show_doc,
+                         const char *help_doc,
+                         fprint_setshow_ftype *fprint_setshow,
+                         cmd_sfunc_ftype *set_func,
+                         cmd_sfunc_ftype *show_func,
+                         struct cmd_list_element **set_list,
+                         struct cmd_list_element **show_list)
+{
+  add_setshow_cmd_full (name, class, var_zinteger, var,
+                       set_doc, show_doc, help_doc, fprint_setshow,
+                       set_func, show_func,
+                       set_list, show_list,
+                       NULL, NULL);
 }
 
 /* Where SETCMD has already been added, add the corresponding show
    command to LIST and return a pointer to the added command (not
    necessarily the head of LIST).  */
-/* NOTE: cagney/2002-03-17: The original version of add_show_from_set
-   used memcpy() to clone `set' into `show'.  This ment that in
-   addition to all the needed fields (var, name, et.al.) some
-   unnecessary fields were copied (namely the callback function).  The
-   function explictly copies relevant fields.  For a `set' and `show'
-   command to share the same callback, the caller must set both
-   explicitly.  */
+/* NOTE: cagney/2002-03-17: The original version of
+   deprecated_add_show_from_set used memcpy() to clone `set' into
+   `show'.  This meant that in addition to all the needed fields (var,
+   name, et.al.) some unnecessary fields were copied (namely the
+   callback function).  The function explictly copies relevant fields.
+   For a `set' and `show' command to share the same callback, the
+   caller must set both explicitly.  */
 struct cmd_list_element *
-add_show_from_set (struct cmd_list_element *setcmd,
-                  struct cmd_list_element **list)
+deprecated_add_show_from_set (struct cmd_list_element *setcmd,
+                             struct cmd_list_element **list)
 {
   char *doc;
   const static char setstring[] = "Set ";
@@ -433,10 +600,10 @@ add_show_from_set (struct cmd_list_element *setcmd,
 void
 delete_cmd (char *name, struct cmd_list_element **list)
 {
-  register struct cmd_list_element *c;
+  struct cmd_list_element *c;
   struct cmd_list_element *p;
 
-  while (*list && STREQ ((*list)->name, name))
+  while (*list && strcmp ((*list)->name, name) == 0)
     {
       if ((*list)->hookee_pre)
       (*list)->hookee_pre->hook_pre = 0;   /* Hook slips out of its mouth */
@@ -450,7 +617,7 @@ delete_cmd (char *name, struct cmd_list_element **list)
   if (*list)
     for (c = *list; c->next;)
       {
-       if (STREQ (c->next->name, name))
+       if (strcmp (c->next->name, name) == 0)
          {
           if (c->next->hookee_pre)
             c->next->hookee_pre->hook_pre = 0; /* hooked cmd gets away.  */
@@ -510,7 +677,7 @@ void
 apropos_cmd (struct ui_file *stream, struct cmd_list_element *commandlist,
                         struct re_pattern_buffer *regex, char *prefix)
 {
-  register struct cmd_list_element *c;
+  struct cmd_list_element *c;
   int returnvalue=1; /*Needed to avoid double printing*/
   /* Walk through the commands */
   for (c=commandlist;c;c=c->next)
@@ -673,14 +840,24 @@ help_list (struct cmd_list_element *list, char *cmdtype,
   help_cmd_list (list, class, cmdtype, (int) class >= 0, stream);
 
   if (class == all_classes)
-    fprintf_filtered (stream, "\n\
-Type \"help%s\" followed by a class name for a list of commands in that class.",
-                     cmdtype1);
+    {
+      fprintf_filtered (stream, "\n\
+Type \"help%s\" followed by a class name for a list of commands in ",
+                       cmdtype1);
+      wrap_here ("");
+      fprintf_filtered (stream, "that class.");
+    }
 
-  fprintf_filtered (stream, "\n\
-Type \"help%s\" followed by %scommand name for full documentation.\n\
-Command name abbreviations are allowed if unambiguous.\n",
+  fprintf_filtered (stream, "\nType \"help%s\" followed by %scommand name ",
                    cmdtype1, cmdtype2);
+  wrap_here ("");
+  fputs_filtered ("for ", stream);
+  wrap_here ("");
+  fputs_filtered ("full ", stream);
+  wrap_here ("");
+  fputs_filtered ("documentation.\n", stream);
+  fputs_filtered ("Command name abbreviations are allowed if unambiguous.\n",
+                 stream);
 }
 
 static void
@@ -709,7 +886,7 @@ print_doc_line (struct ui_file *stream, char *str)
 {
   static char *line_buffer = 0;
   static int line_size;
-  register char *p;
+  char *p;
 
   if (!line_buffer)
     {
@@ -753,7 +930,7 @@ void
 help_cmd_list (struct cmd_list_element *list, enum command_class class,
               char *prefix, int recurse, struct ui_file *stream)
 {
-  register struct cmd_list_element *c;
+  struct cmd_list_element *c;
 
   for (c = list; c; c = c->next)
     {
@@ -852,10 +1029,14 @@ lookup_cmd_1 (char **text, struct cmd_list_element *clist,
   /* Treating underscores as part of command words is important
      so that "set args_foo()" doesn't get interpreted as
      "set args _foo()".  */
+  /* NOTE: cagney/2003-02-13 The `tui_active' was previously
+     `tui_version'.  */
   for (p = *text;
        *p && (isalnum (*p) || *p == '-' || *p == '_' ||
-             (tui_version &&
+#if defined(TUI)
+             (tui_active &&
               (*p == '+' || *p == '<' || *p == '>' || *p == '$')) ||
+#endif
              (xdb_commands && (*p == '!' || *p == '/' || *p == '?')));
        p++)
     ;
@@ -973,7 +1154,7 @@ lookup_cmd_1 (char **text, struct cmd_list_element *clist,
 static void
 undef_cmd_error (char *cmdtype, char *q)
 {
-  error ("Undefined %scommand: \"%s\".  Try \"help%s%.*s\".",
+  error (_("Undefined %scommand: \"%s\".  Try \"help%s%.*s\"."),
         cmdtype,
         q,
         *cmdtype ? " " : "",
@@ -1011,7 +1192,7 @@ lookup_cmd (char **line, struct cmd_list_element *list, char *cmdtype,
       if (!allow_unknown)
        {
          if (!*line)
-           error ("Lack of needed %scommand", cmdtype);
+           error (_("Lack of needed %scommand"), cmdtype);
          else
            {
              char *p = *line, *q;
@@ -1073,7 +1254,7 @@ lookup_cmd (char **line, struct cmd_list_element *list, char *cmdtype,
                    break;
                  }
              }
-         error ("Ambiguous %scommand \"%s\": %s.", local_cmdtype,
+         error (_("Ambiguous %scommand \"%s\": %s."), local_cmdtype,
                 *line, ambbuf);
          return 0;             /* lint */
        }
@@ -1124,7 +1305,7 @@ deprecated_cmd_warning (char **text)
   struct cmd_list_element *cmd = NULL;
   struct cmd_list_element *c;
   char *type;
+
   if (!lookup_cmd_composition (*text, &alias, &prefix_cmd, &cmd))
     /* return if text doesn't evaluate to a command */
     return;
@@ -1222,10 +1403,14 @@ lookup_cmd_composition (char *text,
       /* Treating underscores as part of command words is important
        so that "set args_foo()" doesn't get interpreted as
        "set args _foo()".  */
+      /* NOTE: cagney/2003-02-13 The `tui_active' was previously
+        `tui_version'.  */
       for (p = text;
          *p && (isalnum (*p) || *p == '-' || *p == '_' ||
-                (tui_version &&
+#if defined(TUI)
+                (tui_active &&
                  (*p == '+' || *p == '<' || *p == '>' || *p == '$')) ||
+#endif
                 (xdb_commands && (*p == '!' || *p == '/' || *p == '?')));
          p++)
       ;
@@ -1435,3 +1620,23 @@ complete_on_enum (const char *enumlist[],
   return matchlist;
 }
 
+
+/* 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, char *args, int from_tty)
+{
+  if (cmd_func_p (cmd))
+    (*cmd->func) (cmd, args, from_tty);
+  else
+    error (_("Invalid command"));
+}
+
+
This page took 0.029722 seconds and 4 git commands to generate.