diff src/fileio.c @ 41595:3a10e73aa1c1

(Ffind_file_name_handler): Give precedence to handlers which match the end of the file-name. (Fsubstitute_in_file_name): Don't signal an error if $ENVVAR is not a valid env var, but leave it as is instead.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Mon, 26 Nov 2001 22:54:37 +0000
parents 1d1183771c4f
children fccc74affd73
line wrap: on
line diff
--- a/src/fileio.c	Mon Nov 26 22:32:52 2001 +0000
+++ b/src/fileio.c	Mon Nov 26 22:54:37 2001 +0000
@@ -336,7 +336,8 @@
      Lisp_Object filename, operation;
 {
   /* This function must not munge the match data.  */
-  Lisp_Object chain, inhibited_handlers;
+  Lisp_Object chain, inhibited_handlers, result = Qnil;
+  int pos = -1;
 
   CHECK_STRING (filename);
 
@@ -353,21 +354,26 @@
       if (CONSP (elt))
 	{
 	  Lisp_Object string;
+	  int match_pos;
 	  string = XCAR (elt);
-	  if (STRINGP (string) && fast_string_match (string, filename) >= 0)
+	  if (STRINGP (string)
+	      && (match_pos = fast_string_match (string, filename)) > pos)
 	    {
 	      Lisp_Object handler, tem;
 
 	      handler = XCDR (elt);
 	      tem = Fmemq (handler, inhibited_handlers);
 	      if (NILP (tem))
-		return handler;
+		{
+		  result = handler;
+		  pos = match_pos;
+		}
 	    }
 	}
 
       QUIT;
     }
-  return Qnil;
+  return result;
 }
 
 DEFUN ("file-name-directory", Ffile_name_directory, Sfile_name_directory,
@@ -2101,9 +2107,13 @@
 
 	/* Get variable value */
 	o = (unsigned char *) egetenv (target);
-	if (!o) goto badvar;
-	total += strlen (o);
-	substituted = 1;
+	if (o)
+	  {
+	    total += strlen (o);
+	    substituted = 1;
+	  }
+	else if (*p == '}')
+	  goto badvar;
       }
 
   if (!substituted)
@@ -2153,9 +2163,11 @@
 	/* Get variable value */
 	o = (unsigned char *) egetenv (target);
 	if (!o)
-	  goto badvar;
-
-	if (STRING_MULTIBYTE (filename))
+	  {
+	    *x++ = '$';
+	    strcpy (x, target); x+= strlen (target);
+	  }
+	else if (STRING_MULTIBYTE (filename))
 	  {
 	    /* If the original string is multibyte,
 	       convert what we substitute into multibyte.  */