Add file name joiner
authorNelson Ferreira <nelson.ferreira@ieee.org>
Sat, 9 Jan 2016 20:16:59 +0000 (15:16 -0500)
committerNelson Ferreira <nelson.ferreira@ieee.org>
Sat, 9 Jan 2016 22:56:20 +0000 (17:56 -0500)
* lisp/files.el (file-name-join): Add file-name-join to safely
join directory and filename components.

Signed-off-by: Nelson Ferreira <nelson.ferreira@ieee.org>
lisp/files.el

index 51a6d6e..3a3028e 100644 (file)
@@ -456,6 +456,30 @@ of the same functionality is available as `split-path', which see."
        (t
         (setq default-directory dir))))
 
+(defun file-name-join (dirname basename)
+  "Return the filename defined by the concatenation of DIRNAME and BASENAME.
+Only one path component separator will ever be used in the result formation.
+
+Can be use to reassemble a file name separated by `file-name-directory'
+`file-name-nondirectory' and `file-dirname' `file-basename'."
+  (when (and (or (null dirname)  (equal 0 (length dirname)))
+            (or (null basename) (equal 0 (length basename))))
+    (error "Both dirname (%S) and basename (%S) empty." dirname basename))
+  (let* ((dir  (if (and dirname (> (length dirname) 0))
+                  (if (equal "/" (substring dirname -1))
+                      (substring dirname 0 -1)
+                    dirname)
+                "."))
+        (base (if (and basename (> (length basename) 0))
+                  (if (equal "/" (substring basename 0 1))
+                      (substring basename 1)
+                    basename)
+                (if (equal dir ".") "." ""))))
+    (if (and (equal 0 (length base))
+            (> (length dir) 0))
+       (concat dir)
+      (concat dir "/" base))))
+
 (defun cd (dir)
   "Make DIR become the current buffer's default directory.
 If your environment includes a `CDPATH' variable, try each one of that