diff options
| author | Paul Eggert | 2017-09-07 17:46:12 -0700 |
|---|---|---|
| committer | Paul Eggert | 2017-09-07 17:47:24 -0700 |
| commit | aedc566a94116191d3a8b3f7f9955058316f9fdc (patch) | |
| tree | 02c7082bfcfa23ce2b89393a382ba7112e47ba52 /src | |
| parent | 53830c6336b52d58c315c7e11405181e01ee9a53 (diff) | |
| download | emacs-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.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. */) | |||
| 566 | static ptrdiff_t | 566 | static ptrdiff_t |
| 567 | directory_file_name (char *dst, char *src, ptrdiff_t srclen, bool multibyte) | 567 | directory_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; |