diff options
Diffstat (limited to 'src/os/path_windows.go')
-rw-r--r-- | src/os/path_windows.go | 103 |
1 files changed, 3 insertions, 100 deletions
diff --git a/src/os/path_windows.go b/src/os/path_windows.go index e908d3ddf5..f585aa5ee6 100644 --- a/src/os/path_windows.go +++ b/src/os/path_windows.go @@ -5,6 +5,7 @@ package os import ( + "internal/filepathlite" "internal/syscall/windows" "syscall" ) @@ -20,104 +21,8 @@ func IsPathSeparator(c uint8) bool { return c == '\\' || c == '/' } -// basename removes trailing slashes and the leading -// directory name and drive letter from path name. -func basename(name string) string { - // Remove drive letter - if len(name) == 2 && name[1] == ':' { - name = "." - } else if len(name) > 2 && name[1] == ':' { - name = name[2:] - } - i := len(name) - 1 - // Remove trailing slashes - for ; i > 0 && (name[i] == '/' || name[i] == '\\'); i-- { - name = name[:i] - } - // Remove leading directory name - for i--; i >= 0; i-- { - if name[i] == '/' || name[i] == '\\' { - name = name[i+1:] - break - } - } - return name -} - -func isAbs(path string) (b bool) { - v := volumeName(path) - if v == "" { - return false - } - path = path[len(v):] - if path == "" { - return false - } - return IsPathSeparator(path[0]) -} - -func volumeName(path string) (v string) { - if len(path) < 2 { - return "" - } - // with drive letter - c := path[0] - if path[1] == ':' && - ('0' <= c && c <= '9' || 'a' <= c && c <= 'z' || - 'A' <= c && c <= 'Z') { - return path[:2] - } - // is it UNC - if l := len(path); l >= 5 && IsPathSeparator(path[0]) && IsPathSeparator(path[1]) && - !IsPathSeparator(path[2]) && path[2] != '.' { - // first, leading `\\` and next shouldn't be `\`. its server name. - for n := 3; n < l-1; n++ { - // second, next '\' shouldn't be repeated. - if IsPathSeparator(path[n]) { - n++ - // third, following something characters. its share name. - if !IsPathSeparator(path[n]) { - if path[n] == '.' { - break - } - for ; n < l; n++ { - if IsPathSeparator(path[n]) { - break - } - } - return path[:n] - } - break - } - } - } - return "" -} - -func fromSlash(path string) string { - // Replace each '/' with '\\' if present - var pathbuf []byte - var lastSlash int - for i, b := range path { - if b == '/' { - if pathbuf == nil { - pathbuf = make([]byte, len(path)) - } - copy(pathbuf[lastSlash:], path[lastSlash:i]) - pathbuf[i] = '\\' - lastSlash = i + 1 - } - } - if pathbuf == nil { - return path - } - - copy(pathbuf[lastSlash:], path[lastSlash:]) - return string(pathbuf) -} - func dirname(path string) string { - vol := volumeName(path) + vol := filepathlite.VolumeName(path) i := len(path) - 1 for i >= len(vol) && !IsPathSeparator(path[i]) { i-- @@ -174,7 +79,7 @@ func addExtendedPrefix(path string) string { // The MSDN docs appear to say that a normal path that is 248 bytes long // will work; empirically the path must be less then 248 bytes long. pathLength := len(path) - if !isAbs(path) { + if !filepathlite.IsAbs(path) { // If the path is relative, we need to prepend the working directory // plus a separator to the path before we can determine if it's too long. // We don't want to call syscall.Getwd here, as that call is expensive to do @@ -236,8 +141,6 @@ func addExtendedPrefix(path string) string { if n <= uint32(len(buf)-len(prefix)) { buf = buf[:n+uint32(len(prefix))] break - } else { - continue } } if isUNC { |