aboutsummaryrefslogtreecommitdiff
path: root/src/os/path_windows.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/os/path_windows.go')
-rw-r--r--src/os/path_windows.go103
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 {