changeset 94407:9d03d6298e0f

(file_name_completion): Fix inappropriate mixing of encoded and decoded names.
author Andreas Schwab <schwab@suse.de>
date Sun, 27 Apr 2008 18:06:51 +0000
parents f2c9fb488f97
children e7b16891fcb0
files src/ChangeLog src/dired.c
diffstat 2 files changed, 14 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Sun Apr 27 16:39:03 2008 +0000
+++ b/src/ChangeLog	Sun Apr 27 18:06:51 2008 +0000
@@ -1,5 +1,8 @@
 2008-04-27  Andreas Schwab  <schwab@suse.de>
 
+	* dired.c (file_name_completion): Fix inappropriate mixing of
+	encoded and decoded names.
+
 	* xterm.c (XTread_socket): Fix use of uninitialized variable.
 
 	* puresize.h (BASE_PURESIZE): Increase to 1200000.
--- a/src/dired.c	Sun Apr 27 16:39:03 2008 +0000
+++ b/src/dired.c	Sun Apr 27 18:06:51 2008 +0000
@@ -539,6 +539,7 @@
 	{
 	  DIRENTRY *dp;
 	  int len;
+	  Lisp_Object decoded_name;
 
 #ifdef VMS
 	  dp = (*readfunc) (d);
@@ -640,6 +641,9 @@
 	  if (!passcount && CONSP (tem))
 	    continue;
 
+	  name = make_unibyte_string (dp->d_name, len);
+	  decoded_name = DECODE_FILE (name);
+
 	  if (!passcount)
 	    {
 	      Lisp_Object regexps;
@@ -650,8 +654,7 @@
 	      for (regexps = Vcompletion_regexp_list; CONSP (regexps);
 		   regexps = XCDR (regexps))
 		{
-		  tem = Fstring_match (XCAR (regexps),
-				       make_string (dp->d_name, len), zero);
+		  tem = Fstring_match (XCAR (regexps), decoded_name, zero);
 		  if (NILP (tem))
 		    break;
 		}
@@ -663,10 +666,8 @@
 	  if (directoryp)
 	    {
 	      /* This completion is a directory; make it end with '/' */
-	      name = Ffile_name_as_directory (make_string (dp->d_name, len));
+	      name = ENCODE_FILE (Ffile_name_as_directory (decoded_name));
 	    }
-	  else
-	    name = make_string (dp->d_name, len);
 
 	  /* Test the predicate, if any.  */
 
@@ -674,10 +675,10 @@
 	    {
 	      Lisp_Object decoded;
 	      Lisp_Object val;
-	      struct gcpro gcpro1;
+	      struct gcpro gcpro1, gcpro2;
 
-	      GCPRO1 (name);
-	      decoded = Fexpand_file_name (DECODE_FILE (name), dirname);
+	      GCPRO2 (name, decoded_name);
+	      decoded = Fexpand_file_name (decoded_name, dirname);
 	      val = call1 (predicate, decoded);
 	      UNGCPRO;
 
@@ -690,10 +691,7 @@
 	  matchcount++;
 
 	  if (all_flag)
-	    {
-	      name = DECODE_FILE (name);
-	      bestmatch = Fcons (name, bestmatch);
-	    }
+	    bestmatch = Fcons (decoded_name, bestmatch);
 	  else if (NILP (bestmatch))
 	    {
 	      bestmatch = name;
@@ -729,8 +727,7 @@
 			 either both or neither are exact.  */
 		      (((matchsize == len)
 			==
-			(matchsize + !!directoryp
-			 == SCHARS (bestmatch)))
+			(matchsize + !!directoryp == SCHARS (bestmatch)))
 		       && !bcmp (p2, SDATA (encoded_file), SCHARS (encoded_file))
 		       && bcmp (p1, SDATA (encoded_file), SCHARS (encoded_file))))
 		    bestmatch = name;