diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-02-14 16:09:07 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-02-14 16:09:07 +0000 |
commit | f2d07eb82dd00174c15a10cd9a2e1bcdc0eb668e (patch) | |
tree | ad834634caf3a4f66d6ff165cf2518683594dc30 | |
parent | bfa0275833b60de39c8f890d6f47045d1ef4b26e (diff) | |
download | ruby-f2d07eb82dd00174c15a10cd9a2e1bcdc0eb668e.tar.gz |
* file.c (file_expand_path): fix surplus path separators while
expanding at root directory. [ruby-dev:19572]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3495 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | file.c | 39 | ||||
-rw-r--r-- | sample/test.rb | 13 |
3 files changed, 40 insertions, 17 deletions
@@ -1,3 +1,8 @@ +Sat Feb 15 01:01:45 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net> + + * file.c (file_expand_path): fix surplus path separators while + expanding at root directory. [ruby-dev:19572] + Fri Feb 14 14:25:24 2003 akira yamada <akira@arika.org> * lib/uri/generic.rb, lib/uri/ldap.rb, lib/uri/mailto.ldap: all foo=() @@ -1577,6 +1577,17 @@ file_expand_path(fname, dname, result) tainted = 1; getcwd(buf, MAXPATHLEN); p = &buf[2]; + if (!isdirsep(*p)) { + while (*p && !isdirsep(*p)) { + p = CharNext(p); + } + if (*p) { + p++; + while (*p && !isdirsep(*p)) { + p = CharNext(p); + } + } + } b = s; while (*s && !isdirsep(*s)) { s = CharNext(s); @@ -1598,15 +1609,18 @@ file_expand_path(fname, dname, result) strcpy(buf, dir); free(dir); } - p = chompdirsep(skiproot(buf)); + p = skiproot(buf); + if (*p) + p = chompdirsep(p); + else + --p; } else { - while (*s && isdirsep(*s)) { - *p++ = '/'; - BUFCHECK(p >= pend); - s++; - } - if (p > buf && *s) p--; + b = s; + do s++; while (isdirsep(*s)); + p = buf + (s - b) - 1; + BUFCHECK(p >= pend); + memset(buf, '/', p - buf); } *p = '/'; @@ -1667,16 +1681,7 @@ file_expand_path(fname, dname, result) memcpy(++p, b, s-b); p += s-b; } -#ifdef DOSISH_DRIVE_LETTER - else if (ISALPHA(buf[0]) && (buf[1] == ':') && isdirsep(buf[2])) { - /* root directory needs a trailing backslash, - otherwise it mean the current directory of the drive */ - if (p == (buf+2)) p++; - } - else if (isdirsep(buf[0]) && isdirsep(buf[1])) { - if (p == (buf+1)) p++; - } -#endif + if (p == skiproot(buf) - 1) p++; if (tainted) OBJ_TAINT(result); RSTRING(result)->len = p - buf; diff --git a/sample/test.rb b/sample/test.rb index d20f204da0..7194e072b1 100644 --- a/sample/test.rb +++ b/sample/test.rb @@ -1671,6 +1671,19 @@ test_ok(File.dirname("a/b/c") == "a/b") test_ok(File.dirname("/a/b/c") == "/a/b") test_ok(File.dirname("/a/b/") == "/a") test_ok(File.dirname("/a/b///") == "/a") +case Dir.pwd +when %r'\A\w:' + test_ok(/\A\w:\/\z/ =~ File.expand_path(".", "/")) + test_ok(/\A\w:\/a\z/ =~ File.expand_path("a", "/")) +when %r'\A//' + test_ok(%r'\A//[^/]+/[^/]+\z' =~ File.expand_path(".", "/")) + test_ok(%r'\A//[^/]+/[^/]+/a\z' =~ File.expand_path(".", "/")) +else + test_ok(File.expand_path(".", "/") == "/") + test_ok(File.expand_path("sub", "/") == "/sub") +end +test_ok(File.expand_path(".", "//") == "//") +test_ok(File.expand_path("sub", "//") == "//sub") test_check "gc" begin |