emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master aedc566: Fix bug: (directory-file-name "///") retur


From: Paul Eggert
Subject: [Emacs-diffs] master aedc566: Fix bug: (directory-file-name "///") returned "//"
Date: Thu, 7 Sep 2017 20:47:30 -0400 (EDT)

branch: master
commit aedc566a94116191d3a8b3f7f9955058316f9fdc
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>

    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.
---
 src/fileio.c             | 15 ++++++++-------
 test/src/fileio-tests.el | 19 +++++++++++++++++++
 2 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/src/fileio.c b/src/fileio.c
index 0a52982..9df3b1b 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;
diff --git a/test/src/fileio-tests.el b/test/src/fileio-tests.el
index 5103d2f..ac5d533 100644
--- a/test/src/fileio-tests.el
+++ b/test/src/fileio-tests.el
@@ -44,3 +44,22 @@
   "Check that any non-NULL ASCII character can appear in a symlink.
 Also check that an encoding error can appear in a symlink."
   (should (equal nil (fileio-tests--symlink-failure))))
+
+(ert-deftest fileio-tests--directory-file-name ()
+  (should (equal (directory-file-name "/") "/"))
+  (should (equal (directory-file-name "//") "//"))
+  (should (equal (directory-file-name "///") "/"))
+  (should (equal (directory-file-name "////") "/"))
+  (should (equal (directory-file-name "/abc") "/abc"))
+  (should (equal (directory-file-name "/abc/") "/abc"))
+  (should (equal (directory-file-name "/abc//") "/abc")))
+
+(ert-deftest fileio-tests--file-name-as-directory ()
+  (should (equal (file-name-as-directory "") "./"))
+  (should (equal (file-name-as-directory "/") "/"))
+  (should (equal (file-name-as-directory "//") "//"))
+  (should (equal (file-name-as-directory "///") "///"))
+  (should (equal (file-name-as-directory "////") "////"))
+  (should (equal (file-name-as-directory "/abc") "/abc/"))
+  (should (equal (file-name-as-directory "/abc/") "/abc/"))
+  (should (equal (file-name-as-directory "/abc//") "/abc//")))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]