diff options
author | Ludovic Courtès <ludo@gnu.org> | 2019-06-04 21:20:15 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2019-06-04 21:24:02 +0200 |
commit | 36ad1d24b3d2c174a64c445502a36f19605dbd65 (patch) | |
tree | ab03139bea21a023610042fa6875b3836943706d | |
parent | 65d98d8fd290f985e49994f784b02b8e5ce01dd6 (diff) | |
download | guile-36ad1d24b3d2c174a64c445502a36f19605dbd65.tar.gz |
'basename' correctly handles "/" and "//".
* libguile/filesys.c (scm_basename): Special-case "/" and "//".
* test-suite/tests/filesys.test ("basename"): New test prefix.
-rw-r--r-- | libguile/filesys.c | 17 | ||||
-rw-r--r-- | test-suite/tests/filesys.test | 8 |
2 files changed, 20 insertions, 5 deletions
diff --git a/libguile/filesys.c b/libguile/filesys.c index 1a8dfa044..3cf474c05 100644 --- a/libguile/filesys.c +++ b/libguile/filesys.c @@ -1602,11 +1602,20 @@ SCM_DEFINE (scm_basename, "basename", 1, 1, 0, c_filename = scm_to_utf8_string (filename); scm_dynwind_free (c_filename); - c_last_component = last_component (c_filename); - if (!c_last_component) - res = filename; + if (strcmp (c_filename, "/") == 0 + || strcmp (c_filename, "//") == 0) + /* As per + <http://pubs.opengroup.org/onlinepubs/9699919799/functions/basename.html>, + "/" and "//" are treated specially. */ + res = scm_from_utf8_string ("/"); else - res = scm_from_utf8_string (c_last_component); + { + c_last_component = last_component (c_filename); + if (!c_last_component) + res = filename; + else + res = scm_from_utf8_string (c_last_component); + } scm_dynwind_end (); if (!SCM_UNBNDP (suffix) && diff --git a/test-suite/tests/filesys.test b/test-suite/tests/filesys.test index fceb182be..9ec9f6172 100644 --- a/test-suite/tests/filesys.test +++ b/test-suite/tests/filesys.test @@ -1,6 +1,6 @@ ;;;; filesys.test --- test file system functions -*- scheme -*- ;;;; -;;;; Copyright (C) 2004, 2006, 2013 Free Software Foundation, Inc. +;;;; Copyright (C) 2004, 2006, 2013, 2019 Free Software Foundation, Inc. ;;;; ;;;; This library is free software; you can redistribute it and/or ;;;; modify it under the terms of the GNU Lesser General Public @@ -222,6 +222,12 @@ (cons (join-thread child) out))) (throw 'unresolved))))) +(with-test-prefix "basename" + + (pass-if-equal "/" "/" (basename "/")) + (pass-if-equal "//" "/" (basename "//")) + (pass-if-equal "a/b/c" "c" (basename "a/b/c"))) + (delete-file (test-file)) (when (file-exists? (test-symlink)) (delete-file (test-symlink))) |