From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13741 invoked by alias); 12 Jul 2008 19:10:02 -0000 Received: (qmail 13674 invoked by uid 22791); 12 Jul 2008 19:09:59 -0000 X-Spam-Check-By: sourceware.org Received: from mailhost.u-strasbg.fr (HELO mailhost.u-strasbg.fr) (130.79.200.153) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sat, 12 Jul 2008 19:09:35 +0000 Received: from baal.u-strasbg.fr (baal.u-strasbg.fr [IPv6:2001:660:2402::41]) by mailhost.u-strasbg.fr (8.14.2/jtpda-5.5pre1) with ESMTP id m6CJ9Pjq039899 ; Sat, 12 Jul 2008 21:09:25 +0200 (CEST) Received: from mailserver.u-strasbg.fr (ms1.u-strasbg.fr [IPv6:2001:660:2402::141]) by baal.u-strasbg.fr (8.14.0/jtpda-5.5pre1) with ESMTP id m6CJ9Pmq016959 ; Sat, 12 Jul 2008 21:09:25 +0200 (CEST) Received: from d620muller ([130.79.244.146]) by mailserver.u-strasbg.fr (8.13.8/jtpda-5.5pre1) with ESMTP id m6CJ9Kv9091550 ; Sat, 12 Jul 2008 21:09:25 +0200 (CEST) From: "Pierre Muller" To: "'Daniel Jacobowitz'" Cc: "'Pedro Alves'" , References: <000901c8def8$137b1bf0$3a7153d0$@u-strasbg.fr> <200807060456.49298.pedro@codesourcery.com> <000001c8e148$375ac690$a61053b0$@u-strasbg.fr> <20080708223110.GA1784@caradoc.them.org> In-Reply-To: <20080708223110.GA1784@caradoc.them.org> Subject: [RFA-updated] fix annoying completion bug on directories Date: Sat, 12 Jul 2008 19:10:00 -0000 Message-ID: <000001c8e452$cd129f20$6737dd60$@u-strasbg.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Office Outlook 12.0 Content-Language: en-us X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.0 (mailhost.u-strasbg.fr [IPv6:2001:660:2402::153]); Sat, 12 Jul 2008 21:09:25 +0200 (CEST) X-Virus-Status: Clean Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-07/txt/msg00235.txt.bz2 My patch conflicts with the last commit made by Tom Tromey yesterday to fix 'help' command completion. Here is an updated patch that should cleanly apply to current cvs HEAD. Checked on cygwin, no testsuite changes. gdb ChangeLog entry: 2008-07-12 Pierre Muller Fix completer problem for filename completion on the first try. * gdb/completer.h (gdb_completion_word_break_characters): New function. * gdb/completer.c: Include gdb_assert.h. (complete_line_internal_reason): New enum type. (complete_line_internal): Change last arg to complete_line_internal_reason type. Adapt code to that change. (complete_line, command_completer): Adapt to complete_line_internal change. (gdb_completion_word_break): New static function. Calls complete_line_internal with reason=handle_brkchars. * top.c (init_main): Set rl_completion_word_break_hook to gdb_completion_word_break_characters; * Makefile (completer.o): Add gdb_assert_h dependency. Index: gdb/Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.1035 diff -u -p -r1.1035 Makefile.in --- gdb/Makefile.in 11 Jul 2008 11:07:38 -0000 1.1035 +++ gdb/Makefile.in 12 Jul 2008 05:46:22 -0000 @@ -2009,7 +2009,7 @@ complaints.o: complaints.c $(defs_h) $(c $(command_h) $(gdbcmd_h) completer.o: completer.c $(defs_h) $(symtab_h) $(gdbtypes_h) $(expression_h) \ $(filenames_h) $(language_h) $(cli_decode_h) $(gdbcmd_h) \ - $(readline_h) $(completer_h) + $(readline_h) $(completer_h) $(gdb_assert_h) copying.o: copying.c $(defs_h) $(command_h) $(gdbcmd_h) corefile.o: corefile.c $(defs_h) $(gdb_string_h) $(inferior_h) $(symtab_h) \ $(command_h) $(gdbcmd_h) $(bfd_h) $(target_h) $(gdbcore_h) \ Index: gdb/completer.h =================================================================== RCS file: /cvs/src/src/gdb/completer.h,v retrieving revision 1.14 diff -u -p -r1.14 completer.h --- gdb/completer.h 6 Jun 2008 20:58:08 -0000 1.14 +++ gdb/completer.h 12 Jul 2008 05:46:22 -0000 @@ -33,6 +33,8 @@ extern char **command_completer (char *, extern char *get_gdb_completer_quote_characters (void); +extern char *gdb_completion_word_break_characters (void); + /* Exported to linespec.c */ extern char *skip_quoted_chars (char *, char *, char *); Index: gdb/completer.c =================================================================== RCS file: /cvs/src/src/gdb/completer.c,v retrieving revision 1.27 diff -u -p -r1.27 completer.c --- gdb/completer.c 11 Jul 2008 15:07:52 -0000 1.27 +++ gdb/completer.c 12 Jul 2008 05:46:23 -0000 @@ -22,6 +22,7 @@ #include "expression.h" #include "filenames.h" /* For DOSish file names. */ #include "language.h" +#include "gdb_assert.h" #include "cli/cli-decode.h" @@ -451,24 +452,47 @@ expression_completer (char *text, char * "file ../gdb.stabs/we" "ird" (needs to not break word at slash) */ -/* Generate completions all at once. Returns a NULL-terminated array - of strings. Both the array and each element are allocated with - xmalloc. It can also return NULL if there are no completions. +typedef enum +{ + handle_brkchars, + handle_completions, + handle_help +} +complete_line_internal_reason; + + +/* Internal function used to handle completions. + TEXT is the caller's idea of the "word" we are looking at. LINE_BUFFER is available to be looked at; it contains the entire text of the line. POINT is the offset in that line of the cursor. You should pretend that the line ends at POINT. - - FOR_HELP is true when completing a 'help' command. In this case, + + REASON is of type complete_line_internal_reason. + + if REASON is handle_brkchars: + Preliminary phase, called by gdb_completion_word_break_characters function, + is used to determine the correct set of chars that are word delimiters + depending gon the current command in line_buffer. + No completion list should be generated; the return value should be NULL. + This is checked by an assertion in that function. + + if REASON is handle_completions: + Main phase, called by complete_line function, is used to get the list + of posible completions. + + if REASON is handle_help: + Special case when completing a 'help' command. In this case, once sub-command completions are exhausted, we simply return NULL. When FOR_HELP is false, we will call a sub-command's completion - function. */ + function. + */ static char ** complete_line_internal (const char *text, char *line_buffer, int point, - int for_help) + complete_line_internal_reason reason) { char **list = NULL; char *tmp_command, *p; @@ -482,7 +506,6 @@ complete_line_internal (const char *text functions, which can be any string) then we will switch to the special word break set for command strings, which leaves out the '-' character used in some commands. */ - rl_completer_word_break_characters = current_language->la_word_break_characters(); @@ -545,12 +568,14 @@ complete_line_internal (const char *text This we can deal with. */ if (result_list) { - list = complete_on_cmdlist (*result_list->prefixlist, p, - word); + if (reason != handle_brkchars) + list = complete_on_cmdlist (*result_list->prefixlist, p, + word); } else { - list = complete_on_cmdlist (cmdlist, p, word); + if (reason != handle_brkchars) + list = complete_on_cmdlist (cmdlist, p, word); } /* Ensure that readline does the right thing with respect to inserting quotes. */ @@ -574,18 +599,20 @@ complete_line_internal (const char *text { /* It is a prefix command; what comes after it is a subcommand (e.g. "info "). */ - list = complete_on_cmdlist (*c->prefixlist, p, word); + if (reason != handle_brkchars) + list = complete_on_cmdlist (*c->prefixlist, p, word); /* Ensure that readline does the right thing with respect to inserting quotes. */ rl_completer_word_break_characters = gdb_completer_command_word_break_characters; } - else if (for_help) + else if (reason == handle_help) list = NULL; else if (c->enums) { - list = complete_on_enum (c->enums, p, word); + if (reason != handle_brkchars) + list = complete_on_enum (c->enums, p, word); rl_completer_word_break_characters = gdb_completer_command_word_break_characters; } @@ -621,7 +648,8 @@ complete_line_internal (const char *text p--) ; } - list = (*c->completer) (p, word); + if (reason != handle_brkchars) + list = (*c->completer) (p, word); } } else @@ -642,7 +670,8 @@ complete_line_internal (const char *text break; } - list = complete_on_cmdlist (result_list, q, word); + if (reason != handle_brkchars) + list = complete_on_cmdlist (result_list, q, word); /* Ensure that readline does the right thing with respect to inserting quotes. */ @@ -650,7 +679,7 @@ complete_line_internal (const char *text gdb_completer_command_word_break_characters; } } - else if (for_help) + else if (reason == handle_help) list = NULL; else { @@ -664,7 +693,8 @@ complete_line_internal (const char *text } else if (c->enums) { - list = complete_on_enum (c->enums, p, word); + if (reason != handle_brkchars) + list = complete_on_enum (c->enums, p, word); } else { @@ -689,7 +719,8 @@ complete_line_internal (const char *text p--) ; } - list = (*c->completer) (p, word); + if (reason != handle_brkchars) + list = (*c->completer) (p, word); } } } @@ -697,21 +728,43 @@ complete_line_internal (const char *text return list; } -/* Like complete_line_internal, but always passes 0 for FOR_HELP. */ +/* Generate completions all at once. Returns a NULL-terminated array + of strings. Both the array and each element are allocated with + xmalloc. It can also return NULL if there are no completions. + + TEXT is the caller's idea of the "word" we are looking at. + + LINE_BUFFER is available to be looked at; it contains the entire text + of the line. + + POINT is the offset in that line of the cursor. You + should pretend that the line ends at POINT. */ char ** complete_line (const char *text, char *line_buffer, int point) { - return complete_line_internal (text, line_buffer, point, 0); + return complete_line_internal (text, line_buffer, point, handle_completions); } /* Complete on command names. Used by "help". */ char ** command_completer (char *text, char *word) { - return complete_line_internal (word, text, strlen (text), 1); + return complete_line_internal (word, text, strlen (text), handle_help); } +/* Get the list of chars that are considered as word breaks + for the current command. */ + +char * +gdb_completion_word_break_characters (void) +{ + char ** list; + list = complete_line_internal (rl_line_buffer, rl_line_buffer, rl_point, + handle_brkchars); + gdb_assert (list == NULL); + return rl_completer_word_break_characters; +} /* Generate completions one by one for the completer. Each time we are called return another potential completion to the caller. line_completion just completes on commands or passes the buck to the Index: gdb/top.c =================================================================== RCS file: /cvs/src/src/gdb/top.c,v retrieving revision 1.146 diff -u -p -r1.146 top.c --- gdb/top.c 11 Jul 2008 11:07:39 -0000 1.146 +++ gdb/top.c 12 Jul 2008 05:46:23 -0000 @@ -1531,6 +1531,7 @@ init_main (void) write_history_p = 0; /* Setup important stuff for command line editing. */ + rl_completion_word_break_hook = gdb_completion_word_break_characters; rl_completion_entry_function = readline_line_completion_function; rl_completer_word_break_characters = default_word_break_characters (); rl_completer_quote_characters = get_gdb_completer_quote_characters ();