aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2017-09-07 17:46:12 -0700
committerPaul Eggert2017-09-07 17:47:24 -0700
commitaedc566a94116191d3a8b3f7f9955058316f9fdc (patch)
tree02c7082bfcfa23ce2b89393a382ba7112e47ba52 /src
parent53830c6336b52d58c315c7e11405181e01ee9a53 (diff)
downloademacs-aedc566a94116191d3a8b3f7f9955058316f9fdc.tar.gz
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')
-rw-r--r--src/fileio.c15
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. */)
566static ptrdiff_t 566static ptrdiff_t
567directory_file_name (char *dst, char *src, ptrdiff_t srclen, bool multibyte) 567directory_file_name (char *dst, char *src, ptrdiff_t srclen, bool multibyte)
568{ 568{
569 /* Process as Unix format: just remove any final slash. 569 /* In Unix-like systems, just remove any final slashes. However, if
570 But leave "/" and "//" unchanged. */ 570 they are all slashes, leave "/" and "//" alone, and treat "///"
571 while (srclen > 1 571 and longer as if they were "/". */
572 if (! (srclen == 2 && IS_DIRECTORY_SEP (src[0])))
573 while (srclen > 1
572#ifdef DOS_NT 574#ifdef DOS_NT
573 && !IS_ANY_SEP (src[srclen - 2]) 575 && !IS_ANY_SEP (src[srclen - 2])
574#endif 576#endif
575 && IS_DIRECTORY_SEP (src[srclen - 1]) 577 && IS_DIRECTORY_SEP (src[srclen - 1]))
576 && ! (srclen == 2 && IS_DIRECTORY_SEP (src[0]))) 578 srclen--;
577 srclen--;
578 579
579 memcpy (dst, src, srclen); 580 memcpy (dst, src, srclen);
580 dst[srclen] = 0; 581 dst[srclen] = 0;