Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "Pierre Muller" <muller@ics.u-strasbg.fr>
To: "'Daniel Jacobowitz'" <drow@false.org>
Cc: "'Pedro Alves'" <pedro@codesourcery.com>, <gdb-patches@sourceware.org>
Subject: [RFA-updated] fix annoying completion bug on directories
Date: Sat, 12 Jul 2008 19:10:00 -0000	[thread overview]
Message-ID: <000001c8e452$cd129f20$6737dd60$@u-strasbg.fr> (raw)
In-Reply-To: <20080708223110.GA1784@caradoc.them.org>

 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  <muller@ics.u-strasbg.fr>

	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 ();



  parent reply	other threads:[~2008-07-12 19:10 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-05 23:37 [RFC] " Pierre Muller
2008-07-06  3:57 ` Pedro Alves
2008-07-08 22:16   ` [RFA] " Pierre Muller
2008-07-08 22:31     ` Daniel Jacobowitz
2008-07-08 22:49       ` Pierre Muller
2008-07-12 19:10       ` Pierre Muller [this message]
2008-07-14 22:51     ` Eli Zaretskii
2008-07-08 22:16   ` Spurius results for cygwin selftest.exp(was Re: [RFC] fix annoying completion bug on directories) Pierre Muller
2008-07-10 21:18     ` Christopher Faylor
2008-07-10 21:48       ` Daniel Jacobowitz
2008-07-10 22:08         ` Pedro Alves

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='000001c8e452$cd129f20$6737dd60$@u-strasbg.fr' \
    --to=muller@ics.u-strasbg.fr \
    --cc=drow@false.org \
    --cc=gdb-patches@sourceware.org \
    --cc=pedro@codesourcery.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox