X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fcommand.c;h=b112d730b5e5a93cfbf4e36c4d2acc3f444ce3ed;hb=73dab896d406ce96df17d78204c84c5a5c477075;hp=c302caca020b997390638d1e01ac1522b068b42b;hpb=5b3591ab5c099ca985e8aac0ff538dfe36141072;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/command.c b/gdb/command.c index c302caca02..b112d730b5 100644 --- a/gdb/command.c +++ b/gdb/command.c @@ -190,7 +190,7 @@ add_abbrev_prefix_cmd (name, class, fun, doc, prefixlist, prefixname, return c; } -/* ARGSUSED */ +/* This is an empty "cfunc". */ void not_just_help_class_command (args, from_tty) char *args; @@ -198,6 +198,17 @@ not_just_help_class_command (args, from_tty) { } +/* This is an empty "sfunc". */ +static void empty_sfunc PARAMS ((char *, int, struct cmd_list_element *)); + +static void +empty_sfunc (args, from_tty, c) + char *args; + int from_tty; + struct cmd_list_element *c; +{ +} + /* Add element named NAME to command list LIST (the list for set or some sublist thereof). CLASS is as in add_cmd. @@ -214,17 +225,40 @@ add_set_cmd (name, class, var_type, var, doc, list) char *doc; struct cmd_list_element **list; { - /* For set/show, we have to call do_setshow_command - differently than an ordinary function (take commandlist as - well as arg), so the function field isn't helpful. However, - function == NULL means that it's a help class, so set the function - to not_just_help_class_command. */ struct cmd_list_element *c - = add_cmd (name, class, not_just_help_class_command, doc, list); + = add_cmd (name, class, NO_FUNCTION, doc, list); c->type = set_cmd; c->var_type = var_type; c->var = var; + /* This needs to be something besides NO_FUNCTION so that this isn't + treated as a help class. */ + c->function.sfunc = empty_sfunc; + 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; } @@ -675,12 +709,15 @@ lookup_cmd (line, list, cmdtype, allow_unknown, ignore_help_classes) struct cmd_list_element *last_list = 0; struct cmd_list_element *c = lookup_cmd_1 (line, list, &last_list, ignore_help_classes); +#if 0 + /* This is wrong for complete_command. */ char *ptr = (*line) + strlen (*line) - 1; /* Clear off trailing whitespace. */ while (ptr >= *line && (*ptr == ' ' || *ptr == '\t')) ptr--; *(ptr + 1) = '\0'; +#endif if (!c) { @@ -980,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; @@ -1041,6 +1150,11 @@ do_setshow_command (arg, from_tty, c) { /* \ at end of argument is used after spaces so they won't be lost. */ + /* This is obsolete now that we no longer strip + trailing whitespace and actually, the backslash + didn't get here in my test, readline or + something did something funky with a backslash + right before a newline. */ if (*p == 0) break; ch = parse_escape (&p); @@ -1052,8 +1166,10 @@ do_setshow_command (arg, from_tty, c) else *q++ = ch; } +#if 0 if (*(p - 1) != '\\') *q++ = ' '; +#endif *q++ = '\0'; new = (char *) xrealloc (new, q - new); if (*(char **)c->var != NULL) @@ -1104,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"); } @@ -1128,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); @@ -1262,10 +1411,10 @@ show_user_1 (c, stream) fputs_filtered ("User command ", stream); fputs_filtered (c->name, stream); fputs_filtered (":\n", stream); + while (cmdlines) { - fputs_filtered (cmdlines->line, stream); - fputs_filtered ("\n", stream); + print_command_line (cmdlines, 4); cmdlines = cmdlines->next; } fputs_filtered ("\n", stream);