]> Sergey Matveev's repositories - glocate.git/blob - names.go
Use database's directory for temporary files
[glocate.git] / names.go
1 package main
2
3 import (
4         "log"
5         "path"
6         "strconv"
7         "strings"
8 )
9
10 func IsDir(s string) bool {
11         return s[len(s)-1] == '/'
12 }
13
14 type ByName [][]string
15
16 func (a ByName) Len() int {
17         return len(a)
18 }
19
20 func (a ByName) Swap(i, j int) {
21         a[i], a[j] = a[j], a[i]
22 }
23
24 func (a ByName) Less(i, j int) bool {
25         return namesCmp(a[i], a[j]) < 0
26 }
27
28 func nameSplit(name string) []string {
29         cols := strings.Split(name, "/")
30         if IsDir(name) {
31                 cols = cols[:len(cols)-1]
32                 cols[len(cols)-1] += "/"
33         }
34         return cols
35 }
36
37 func nameJoin(name []string) (s string) {
38         s = path.Join(name...)
39         if IsDir(name[len(name)-1]) {
40                 s += "/"
41         }
42         return
43 }
44
45 func namesCmp(n1, n2 []string) int {
46         min := len(n1)
47         if len(n2) < min {
48                 min = len(n2)
49         }
50         var t1, t2 string
51         for i := 0; i < min; i++ {
52                 t1 = strings.TrimSuffix(n1[i], "/")
53                 t2 = strings.TrimSuffix(n2[i], "/")
54                 if t1 < t2 {
55                         return -1
56                 }
57                 if t1 > t2 {
58                         return +1
59                 }
60         }
61         if len(n1) > len(n2) {
62                 return +1
63         }
64         if len(n1) < len(n2) {
65                 return -1
66         }
67         return 0
68 }
69
70 func hasPrefix(name, prefix []string) bool {
71         if len(name) < len(prefix) {
72                 return false
73         }
74         return namesCmp(name[:len(prefix)], prefix) == 0
75 }
76
77 func deoctalize(s string) string {
78         chars := make([]byte, 0, len(s))
79         for i := 0; i < len(s); i++ {
80                 if s[i] == '\\' {
81                         b, err := strconv.ParseUint("0"+s[i+1:i+1+3], 0, 8)
82                         if err != nil {
83                                 log.Fatalln(err)
84                         }
85                         chars = append(chars, byte(b))
86                         i += 3
87                 } else {
88                         chars = append(chars, s[i])
89                 }
90         }
91         return string(chars)
92 }