diff src/dired.c @ 4778:76f267188bbd

(file_name_completion): Install case-preserving changes from Emacs 18 for completion_ignore_case. (completion_ignore_case): Declare.
author Brian Fox <bfox@gnu.org>
date Wed, 22 Sep 1993 18:25:03 +0000
parents 1fc792473491
children c3677267e74d
line wrap: on
line diff
--- a/src/dired.c	Wed Sep 22 18:16:37 1993 +0000
+++ b/src/dired.c	Wed Sep 22 18:25:03 1993 +0000
@@ -80,6 +80,7 @@
 #define lstat stat
 #endif
 
+extern int completion_ignore_case;
 extern Lisp_Object Ffind_file_name_handler ();
 
 Lisp_Object Vcompletion_ignored_extensions;
@@ -392,14 +393,43 @@
 		  matchsize = scmp(p1, p2, compare);
 		  if (matchsize < 0)
 		    matchsize = compare;
-		  /* If this dirname all matches,
-		     see if implicit following slash does too.  */
+		  if (completion_ignore_case)
+		    {
+		      /* If this is an exact match except for case,
+			 use it as the best match rather than one that is not
+			 an exact match.  This way, we get the case pattern
+			 of the actual match.  */
+		      if ((matchsize == len
+			   && matchsize + !!directoryp 
+			      < XSTRING (bestmatch)->size)
+			  ||
+			  /* If there is no exact match ignoring case,
+			     prefer a match that does not change the case
+			     of the input.  */
+			  (((matchsize == len)
+			    ==
+			    (matchsize + !!directoryp 
+			     == XSTRING (bestmatch)->size))
+			   /* If there is more than one exact match aside from
+			      case, and one of them is exact including case,
+			      prefer that one.  */
+			   && !bcmp (p2, XSTRING (file)->data, XSTRING (file)->size)
+			   && bcmp (p1, XSTRING (file)->data, XSTRING (file)->size)))
+			{
+			  bestmatch = make_string (dp->d_name, len);
+			  if (directoryp)
+			    bestmatch = Ffile_name_as_directory (bestmatch);
+			}
+		    }
+
+		  /* If this dirname all matches, see if implicit following
+		     slash does too.  */
 		  if (directoryp
 		      && compare == matchsize
 		      && bestmatchsize > matchsize
 		      && p1[matchsize] == '/')
 		    matchsize++;
-		  bestmatchsize = min (matchsize, bestmatchsize);
+		  bestmatchsize = matchsize;
 		}
 	    }
 	}