From: Stu Grossman Date: Tue, 7 Mar 1995 08:32:55 +0000 (+0000) Subject: * command.h command.c: Add var_enum command type. It's like X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=236274b9f8702183dc674bc53e4e09fc7beb9d0b;p=binutils-gdb.git * command.h command.c: Add var_enum command type. It's like var_string but allows only only one of the specified strings. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 43ed8593b46..605b52a3d35 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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 diff --git a/gdb/command.c b/gdb/command.c index 8a3419c6a46..b112d730b5e 100644 --- a/gdb/command.c +++ b/gdb/command.c @@ -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);