10 func IsDir(s string) bool {
11 return s[len(s)-1] == '/'
14 type ByName [][]string
16 func (a ByName) Len() int {
20 func (a ByName) Swap(i, j int) {
21 a[i], a[j] = a[j], a[i]
24 func (a ByName) Less(i, j int) bool {
25 return namesCmp(a[i], a[j]) < 0
28 func nameSplit(name string) []string {
29 cols := strings.Split(name, "/")
31 cols = cols[:len(cols)-1]
32 cols[len(cols)-1] += "/"
37 func nameJoin(name []string) (s string) {
38 s = path.Join(name...)
39 if IsDir(name[len(name)-1]) {
45 func namesCmp(n1, n2 []string) int {
51 for i := 0; i < min; i++ {
52 t1 = strings.TrimSuffix(n1[i], "/")
53 t2 = strings.TrimSuffix(n2[i], "/")
61 if len(n1) > len(n2) {
64 if len(n1) < len(n2) {
70 func hasPrefix(name, prefix []string) bool {
71 if len(name) < len(prefix) {
74 return namesCmp(name[:len(prefix)], prefix) == 0
77 func deoctalize(s string) string {
78 chars := make([]byte, 0, len(s))
79 for i := 0; i < len(s); i++ {
81 b, err := strconv.ParseUint("0"+s[i+1:i+1+3], 0, 8)
85 chars = append(chars, byte(b))
88 chars = append(chars, s[i])