diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6c112a8832..405ab22169 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2010-04-26 Tom Tromey + + * cli/cli-decode.c (complete_on_cmdlist): Make two passes over the + command list. + 2010-04-26 Pierre Muller Removal of config/i386/nm-i386sol2.h native configuration file. diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c index de261fa1e3..1655e0a99c 100644 --- a/gdb/cli/cli-decode.c +++ b/gdb/cli/cli-decode.c @@ -1597,43 +1597,65 @@ complete_on_cmdlist (struct cmd_list_element *list, char *text, char *word) int sizeof_matchlist; int matches; int textlen = strlen (text); + int pass; + int saw_deprecated_match = 0; sizeof_matchlist = 10; matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *)); matches = 0; - for (ptr = list; ptr; ptr = ptr->next) - if (!strncmp (ptr->name, text, textlen) - && !ptr->abbrev_flag - && (ptr->func - || ptr->prefixlist)) - { - if (matches == sizeof_matchlist) + /* We do one or two passes. In the first pass, we skip deprecated + commands. If we see no matching commands in the first pass, and + if we did happen to see a matching deprecated command, we do + another loop to collect those. */ + for (pass = 0; matches == 0 && pass < 2; ++pass) + { + for (ptr = list; ptr; ptr = ptr->next) + if (!strncmp (ptr->name, text, textlen) + && !ptr->abbrev_flag + && (ptr->func + || ptr->prefixlist)) { - sizeof_matchlist *= 2; - matchlist = (char **) xrealloc ((char *) matchlist, - (sizeof_matchlist - * sizeof (char *))); - } + if (pass == 0) + { + if ((ptr->flags & CMD_DEPRECATED) != 0) + { + saw_deprecated_match = 1; + continue; + } + } - matchlist[matches] = (char *) - xmalloc (strlen (word) + strlen (ptr->name) + 1); - if (word == text) - strcpy (matchlist[matches], ptr->name); - else if (word > text) - { - /* Return some portion of ptr->name. */ - strcpy (matchlist[matches], ptr->name + (word - text)); + if (matches == sizeof_matchlist) + { + sizeof_matchlist *= 2; + matchlist = (char **) xrealloc ((char *) matchlist, + (sizeof_matchlist + * sizeof (char *))); + } + + matchlist[matches] = (char *) + xmalloc (strlen (word) + strlen (ptr->name) + 1); + if (word == text) + strcpy (matchlist[matches], ptr->name); + else if (word > text) + { + /* Return some portion of ptr->name. */ + strcpy (matchlist[matches], ptr->name + (word - text)); + } + else + { + /* Return some of text plus ptr->name. */ + strncpy (matchlist[matches], word, text - word); + matchlist[matches][text - word] = '\0'; + strcat (matchlist[matches], ptr->name); + } + ++matches; } - else - { - /* Return some of text plus ptr->name. */ - strncpy (matchlist[matches], word, text - word); - matchlist[matches][text - word] = '\0'; - strcat (matchlist[matches], ptr->name); - } - ++matches; - } + /* If we saw no matching deprecated commands in the first pass, + just bail out. */ + if (!saw_deprecated_match) + break; + } if (matches == 0) { diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 7aee1ec5ac..4c3bf836b6 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-04-26 Tom Tromey + + * gdb.base/completion.exp: Add tests for completion and deprecated + commands. + 2010-04-26 Jan Kratochvil * gdb.pascal/gdb11492.exp (print integer_array, print /d char_array) diff --git a/gdb/testsuite/gdb.base/completion.exp b/gdb/testsuite/gdb.base/completion.exp index fbd8599866..5f836b601f 100644 --- a/gdb/testsuite/gdb.base/completion.exp +++ b/gdb/testsuite/gdb.base/completion.exp @@ -847,6 +847,12 @@ gdb_expect { eof { fail "(eof) Completing non-existing component #2" } } +# If there is a non-deprecated completion, it should be returned. +gdb_test "complete sav" "save" "test non-deprecated completion" +# If there is only a deprecated completion, then it should be returned. +gdb_test "complete save-t" "save-tracepoints" "test deprecated completion" + + # Restore globals modified in this test... set timeout $oldtimeout1