-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathsection.go
57 lines (54 loc) · 853 Bytes
/
section.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
package lisp
type section struct {
quote bool
count int
total string
}
func (b *section) feed(s []byte) error {
single := false
for i, l := 0, len(s); i < l; i++ {
if b.quote {
switch s[i] {
case '"':
b.quote = false
case '\\':
i++
}
} else if single {
switch s[i] {
case '\'':
single = false
case '\\':
i++
}
} else {
switch s[i] {
case '(':
b.count++
case ')':
b.count--
case '\'':
if i+1 < len(s) {
if s[i+1] == '(' && (i+2 >= len(s) || s[i+2] != '\'') {
b.count++
i++
} else {
single = true
}
}
case '"':
b.quote = true
case '#':
s, l = s[:i], i
}
}
}
if single || b.count < 0 {
return ErrUnquote
}
b.total += string(s)
return nil
}
func (b *section) over() bool {
return b.count == 0 && b.quote == false
}