1
2
3
4
5 package filepath
6
7 import (
8 "os"
9 "strings"
10 "syscall"
11 )
12
13
14
15
16
17 func HasPrefix(p, prefix string) bool {
18 if strings.HasPrefix(p, prefix) {
19 return true
20 }
21 return strings.HasPrefix(strings.ToLower(p), strings.ToLower(prefix))
22 }
23
24 func splitList(path string) []string {
25
26
27
28 if path == "" {
29 return []string{}
30 }
31
32
33 list := []string{}
34 start := 0
35 quo := false
36 for i := 0; i < len(path); i++ {
37 switch c := path[i]; {
38 case c == '"':
39 quo = !quo
40 case c == ListSeparator && !quo:
41 list = append(list, path[start:i])
42 start = i + 1
43 }
44 }
45 list = append(list, path[start:])
46
47
48 for i, s := range list {
49 list[i] = strings.ReplaceAll(s, `"`, ``)
50 }
51
52 return list
53 }
54
55 func abs(path string) (string, error) {
56 if path == "" {
57
58
59
60 path = "."
61 }
62 fullPath, err := syscall.FullPath(path)
63 if err != nil {
64 return "", err
65 }
66 return Clean(fullPath), nil
67 }
68
69 func join(elem []string) string {
70 var b strings.Builder
71 var lastChar byte
72 for _, e := range elem {
73 switch {
74 case b.Len() == 0:
75
76 case os.IsPathSeparator(lastChar):
77
78
79
80
81
82
83
84 for len(e) > 0 && os.IsPathSeparator(e[0]) {
85 e = e[1:]
86 }
87
88
89
90 if b.Len() == 1 && strings.HasPrefix(e, "??") && (len(e) == len("??") || os.IsPathSeparator(e[2])) {
91 b.WriteString(`.\`)
92 }
93 case lastChar == ':':
94
95
96
97
98
99
100 default:
101
102 b.WriteByte('\\')
103 lastChar = '\\'
104 }
105 if len(e) > 0 {
106 b.WriteString(e)
107 lastChar = e[len(e)-1]
108 }
109 }
110 if b.Len() == 0 {
111 return ""
112 }
113 return Clean(b.String())
114 }
115
116 func sameWord(a, b string) bool {
117 return strings.EqualFold(a, b)
118 }
119
View as plain text