-
Notifications
You must be signed in to change notification settings - Fork 32
/
parse.go
95 lines (80 loc) · 1.7 KB
/
parse.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package linux
import (
"strconv"
"strings"
"unicode"
)
func forEachToken(text, split string, call func(string)) {
for len(text) != 0 {
var line string
if i := strings.Index(text, split); i >= 0 {
line, text = text[:i], text[i+len(split):]
} else {
line, text = text, ""
}
call(line)
}
}
func forEachLine(text string, call func(string)) {
forEachToken(text, "\n", func(line string) {
if line = strings.TrimSpace(line); line != "" {
call(line)
}
})
}
func forEachLineExceptFirst(text string, call func(string)) {
first := true
forEachLine(text, func(line string) {
if first {
first = false
} else {
call(line)
}
})
}
func forEachColumn(line string, call func(string)) {
for line = skipSpaces(line); len(line) != 0; line = skipSpaces(line) {
var column string
if i := strings.Index(line, " "); i >= 0 {
column, line = line[:i], line[i+2:]
} else {
column, line = line, ""
}
call(column)
}
}
func forEachProperty(text string, call func(string, string)) {
forEachLine(text, func(line string) { call(splitProperty(line)) })
}
func splitProperty(text string) (key, val string) {
return split(text, ':')
}
func split(text string, sep byte) (head, tail string) {
if i := strings.IndexByte(text, sep); i >= 0 {
head, tail = text[:i], text[i+1:]
} else {
head = text
}
head = strings.TrimSpace(head)
tail = strings.TrimSpace(tail)
return
}
func skipSpaces(text string) string {
for i, c := range text {
if !unicode.IsSpace(c) {
return text[i:]
}
}
return ""
}
func skipLine(text string) string {
if i := strings.IndexByte(text, '\n'); i >= 0 {
return text[i+1:]
}
return ""
}
func atoi(s string) int {
v, e := strconv.Atoi(s)
check(e)
return v
}