]> Cypherpunks repositories - gostls13.git/commitdiff
path: Windows support for Split
authorBenny Siegert <bsiegert@gmail.com>
Wed, 1 Dec 2010 01:17:45 +0000 (17:17 -0800)
committerRob Pike <r@golang.org>
Wed, 1 Dec 2010 01:17:45 +0000 (17:17 -0800)
Make Split work on backslashes as well as on slashes under Windows
and support the "C:filename" special case. Also add corresponding
tests.

R=r, rsc, PeterGo, r2, brainman
CC=golang-dev
https://golang.org/cl/3008041

src/pkg/path/Makefile
src/pkg/path/path.go
src/pkg/path/path_test.go
src/pkg/path/path_unix.go [new file with mode: 0644]
src/pkg/path/path_windows.go [new file with mode: 0644]

index a7e05714a96cb599ea53869b4c70bc7e79b007f1..a36d86eb57c6cef49d0f6fbeb5ae1d97e4e264e8 100644 (file)
@@ -9,4 +9,21 @@ GOFILES=\
        match.go\
        path.go\
 
+GOFILES_freebsd=\
+       path_unix.go
+
+GOFILES_darwin=\
+       path_unix.go
+
+GOFILES_linux=\
+       path_unix.go
+
+GOFILES_nacl=\
+       path_unix.go
+
+GOFILES_windows=\
+       path_windows.go
+
+GOFILES+=$(GOFILES_$(GOOS))
+
 include ../../Make.pkg
index 79b30009307cc858ae76639ce6ae61f307d1ea25..61eea88588bd98baa94d9ebfc685c787c3ee188c 100644 (file)
@@ -102,17 +102,13 @@ func Clean(path string) string {
        return string(buf[0:w])
 }
 
-// Split splits path immediately following the final slash,
+// Split splits path immediately following the final path separator,
 // separating it into a directory and file name component.
-// If there is no slash in path, Split returns an empty dir and
+// If there is no separator in path, Split returns an empty dir and
 // file set to path.
 func Split(path string) (dir, file string) {
-       for i := len(path) - 1; i >= 0; i-- {
-               if path[i] == '/' {
-                       return path[0 : i+1], path[i+1:]
-               }
-       }
-       return "", path
+       i := strings.LastIndexAny(path, PathSeps)
+       return path[:i+1], path[i+1:]
 }
 
 // Join joins any number of path elements into a single path, adding a
index 2bbb9244aa46496657b2da8b8a35ae04f856d02a..e00ac097298136e58dda5be13b2afd116f458fbb 100644 (file)
@@ -6,6 +6,7 @@ package path
 
 import (
        "os"
+       "runtime"
        "testing"
 )
 
@@ -83,7 +84,18 @@ var splittests = []SplitTest{
        {"/", "/", ""},
 }
 
+var winsplittests = []SplitTest{
+       {`C:\Windows\System32`, `C:\Windows\`, `System32`},
+       {`C:\Windows\`, `C:\Windows\`, ``},
+       {`C:\Windows`, `C:\`, `Windows`},
+       {`C:Windows`, `C:`, `Windows`},
+       {`\\?\c:\`, `\\?\c:\`, ``},
+}
+
 func TestSplit(t *testing.T) {
+       if runtime.GOOS == "windows" {
+               splittests = append(splittests, winsplittests...)
+       }
        for _, test := range splittests {
                if d, f := Split(test.path); d != test.dir || f != test.file {
                        t.Errorf("Split(%q) = %q, %q, want %q, %q", test.path, d, f, test.dir, test.file)
diff --git a/src/pkg/path/path_unix.go b/src/pkg/path/path_unix.go
new file mode 100644 (file)
index 0000000..7e8c5eb
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package path
+
+const (
+       DirSeps    = `/`                  // directory separators
+       VolumeSeps = ``                   // volume separators
+       PathSeps   = DirSeps + VolumeSeps // all path separators
+)
diff --git a/src/pkg/path/path_windows.go b/src/pkg/path/path_windows.go
new file mode 100644 (file)
index 0000000..966eb49
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package path
+
+const (
+       DirSeps    = `\/`                 // directory separators
+       VolumeSeps = `:`                  // volume separators
+       PathSeps   = DirSeps + VolumeSeps // all path separators
+)