diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2017-09-07 17:46:12 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2017-09-07 17:47:24 -0700 |
commit | aedc566a94116191d3a8b3f7f9955058316f9fdc (patch) | |
tree | 02c7082bfcfa23ce2b89393a382ba7112e47ba52 /src/fileio.c | |
parent | 53830c6336b52d58c315c7e11405181e01ee9a53 (diff) | |
download | emacs-aedc566a94116191d3a8b3f7f9955058316f9fdc.tar.gz emacs-aedc566a94116191d3a8b3f7f9955058316f9fdc.tar.bz2 emacs-aedc566a94116191d3a8b3f7f9955058316f9fdc.zip |
Fix bug: (directory-file-name "///") returned "//"
* src/fileio.c (directory_file_name): For "///" and longer,
return "/", not "//", as per POSIX.
* test/src/fileio-tests.el (fileio-tests--directory-file-name)
(fileio-tests--file-name-as-directory): New tests.
Diffstat (limited to 'src/fileio.c')
-rw-r--r-- | src/fileio.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/src/fileio.c b/src/fileio.c index 0a52982291d..9df3b1bedae 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -566,15 +566,16 @@ is already present. */) static ptrdiff_t directory_file_name (char *dst, char *src, ptrdiff_t srclen, bool multibyte) { - /* Process as Unix format: just remove any final slash. - But leave "/" and "//" unchanged. */ - while (srclen > 1 + /* In Unix-like systems, just remove any final slashes. However, if + they are all slashes, leave "/" and "//" alone, and treat "///" + and longer as if they were "/". */ + if (! (srclen == 2 && IS_DIRECTORY_SEP (src[0]))) + while (srclen > 1 #ifdef DOS_NT - && !IS_ANY_SEP (src[srclen - 2]) + && !IS_ANY_SEP (src[srclen - 2]) #endif - && IS_DIRECTORY_SEP (src[srclen - 1]) - && ! (srclen == 2 && IS_DIRECTORY_SEP (src[0]))) - srclen--; + && IS_DIRECTORY_SEP (src[srclen - 1])) + srclen--; memcpy (dst, src, srclen); dst[srclen] = 0; |