Mercurial > emacs
changeset 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 | 452efff38a6e |
children | 3c035e37d086 |
files | src/fileio.c |
diffstat | 1 files changed, 22 insertions(+), 10 deletions(-) [+] |
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. */