From 8d2ced539740edfc3fa06298cc7411b97efcd1ea Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 26 Nov 2001 22:54:37 +0000 Subject: [PATCH] (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. --- src/fileio.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/fileio.c b/src/fileio.c index cc1c7a5a33d..2b9d87d54df 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -336,7 +336,8 @@ use the standard functions without calling themselves recursively. */) 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 @@ use the standard functions without calling themselves recursively. */) 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 @@ duplicates what `expand-file-name' does. */) /* 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 @@ duplicates what `expand-file-name' does. */) /* 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. */ -- 2.39.5