* command.h command.c: Add var_enum command type. It's like
authorStu Grossman <grossman@cygnus>
Tue, 7 Mar 1995 08:32:55 +0000 (08:32 +0000)
committerStu Grossman <grossman@cygnus>
Tue, 7 Mar 1995 08:32:55 +0000 (08:32 +0000)
var_string but allows only only one of the specified strings.

gdb/ChangeLog
gdb/command.c

index 43ed8593b46ee27d1a5a968c894aeef11da96c62..605b52a3d350036e4f42562b46cd7cb2d0027f95 100644 (file)
@@ -1,3 +1,8 @@
+Tue Mar  7 00:23:47 1995  Stu Grossman  (grossman@cygnus.com)
+
+       * command.h command.c:  Add var_enum command type.  It's like
+       var_string but allows only only one of the specified strings.
+
 Mon Mar  6 15:03:59 1995  Jim Kingdon  (kingdon@lioth.cygnus.com)
 
        * valops.c (value_cast): Don't use backslash newline--pre-ANSI
index 8a3419c6a46e4021648608d944317f409b3e4eea..b112d730b5e5a93cfbf4e36c4d2acc3f444ce3ed 100644 (file)
@@ -237,6 +237,31 @@ add_set_cmd (name, class, var_type, var, doc, list)
   return c;
 }
 
+/* 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).
+   DOC is the documentation string.  */
+
+struct cmd_list_element *
+add_set_enum_cmd (name, class, enumlist, var, doc, list)
+     char *name;
+     enum command_class class;
+     char *enumlist[];
+     char *var;
+     char *doc;
+     struct cmd_list_element **list;
+{
+  struct cmd_list_element *c
+    = add_set_cmd (name, class, var_enum, var, doc, list);
+
+  c->enums = enumlist;
+
+  return c;
+}
+
 /* Where SETCMD has already been added, add the corresponding show
    command to LIST and return a pointer to it.  */
 struct cmd_list_element *
@@ -992,6 +1017,78 @@ complete_on_cmdlist (list, text, word)
   return matchlist;
 }
 
+/* Helper function for SYMBOL_COMPLETION_FUNCTION.  */
+
+/* Return a vector of char pointers which point to the different
+   possible completions in CMD of TEXT.  
+
+   WORD points in the same buffer as TEXT, and completions should be
+   returned relative to this position.  For example, suppose TEXT is "foo"
+   and we want to complete to "foobar".  If WORD is "oo", return
+   "oobar"; if WORD is "baz/foo", return "baz/foobar".  */
+
+char **
+complete_on_enum (enumlist, text, word)
+     char **enumlist;
+     char *text;
+     char *word;
+{
+  char **matchlist;
+  int sizeof_matchlist;
+  int matches;
+  int textlen = strlen (text);
+  int i;
+  char *name;
+
+  sizeof_matchlist = 10;
+  matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
+  matches = 0;
+
+  for (i = 0; name = enumlist[i]; i++)
+    if (strncmp (name, text, textlen) == 0)
+      {
+       if (matches == sizeof_matchlist)
+         {
+           sizeof_matchlist *= 2;
+           matchlist = (char **) xrealloc ((char *)matchlist,
+                                           (sizeof_matchlist
+                                            * sizeof (char *)));
+         }
+
+       matchlist[matches] = (char *) 
+         xmalloc (strlen (word) + strlen (name) + 1);
+       if (word == text)
+         strcpy (matchlist[matches], name);
+       else if (word > text)
+         {
+           /* Return some portion of name.  */
+           strcpy (matchlist[matches], name + (word - text));
+         }
+       else
+         {
+           /* Return some of text plus name.  */
+           strncpy (matchlist[matches], word, text - word);
+           matchlist[matches][text - word] = '\0';
+           strcat (matchlist[matches], name);
+         }
+       ++matches;
+      }
+
+  if (matches == 0)
+    {
+      free ((PTR)matchlist);
+      matchlist = 0;
+    }
+  else
+    {
+      matchlist = (char **) xrealloc ((char *)matchlist, ((matches + 1)
+                                               * sizeof (char *)));
+      matchlist[matches] = (char *) 0;
+    }
+
+  return matchlist;
+}
+
 static int
 parse_binary_operation (arg)
      char *arg;
@@ -1123,6 +1220,38 @@ do_setshow_command (arg, from_tty, c)
            error_no_arg ("integer to set it to.");
          *(int *) c->var = parse_and_eval_address (arg);
          break;
+       case var_enum:
+         {
+           int i;
+           int len;
+           int nmatches;
+           char *match;
+           char *p;
+
+           p = strchr (arg, ' ');
+
+           if (p)
+             len = p - arg;
+           else
+             len = strlen (arg);
+
+           nmatches = 0;
+           for (i = 0; c->enums[i]; i++)
+             if (strncmp (arg, c->enums[i], len) == 0)
+               {
+                 match = c->enums[i];
+                 nmatches++;
+               }
+
+           if (nmatches <= 0)
+             error ("Undefined item: \"%s\".", arg);
+
+           if (nmatches > 1)
+             error ("Ambiguous item \"%s\".", arg);
+
+           *(char **)c->var = match;
+         }
+         break;
        default:
          error ("gdb internal error: bad var_type in do_setshow_command");
        }
@@ -1147,6 +1276,7 @@ do_setshow_command (arg, from_tty, c)
        break;
       case var_string_noescape:
       case var_filename:
+      case var_enum:
        fputs_filtered ("\"", gdb_stdout);
        fputs_filtered (*(char **) c->var, gdb_stdout);
        fputs_filtered ("\"", gdb_stdout);