podman
163 строки · 3.2 Кб
1//+build jsoniter_sloppy
2
3package jsoniter
4
5// sloppy but faster implementation, do not validate the input json
6
7func (iter *Iterator) skipNumber() {
8for {
9for i := iter.head; i < iter.tail; i++ {
10c := iter.buf[i]
11switch c {
12case ' ', '\n', '\r', '\t', ',', '}', ']':
13iter.head = i
14return
15}
16}
17if !iter.loadMore() {
18return
19}
20}
21}
22
23func (iter *Iterator) skipArray() {
24level := 1
25if !iter.incrementDepth() {
26return
27}
28for {
29for i := iter.head; i < iter.tail; i++ {
30switch iter.buf[i] {
31case '"': // If inside string, skip it
32iter.head = i + 1
33iter.skipString()
34i = iter.head - 1 // it will be i++ soon
35case '[': // If open symbol, increase level
36level++
37if !iter.incrementDepth() {
38return
39}
40case ']': // If close symbol, increase level
41level--
42if !iter.decrementDepth() {
43return
44}
45
46// If we have returned to the original level, we're done
47if level == 0 {
48iter.head = i + 1
49return
50}
51}
52}
53if !iter.loadMore() {
54iter.ReportError("skipObject", "incomplete array")
55return
56}
57}
58}
59
60func (iter *Iterator) skipObject() {
61level := 1
62if !iter.incrementDepth() {
63return
64}
65
66for {
67for i := iter.head; i < iter.tail; i++ {
68switch iter.buf[i] {
69case '"': // If inside string, skip it
70iter.head = i + 1
71iter.skipString()
72i = iter.head - 1 // it will be i++ soon
73case '{': // If open symbol, increase level
74level++
75if !iter.incrementDepth() {
76return
77}
78case '}': // If close symbol, increase level
79level--
80if !iter.decrementDepth() {
81return
82}
83
84// If we have returned to the original level, we're done
85if level == 0 {
86iter.head = i + 1
87return
88}
89}
90}
91if !iter.loadMore() {
92iter.ReportError("skipObject", "incomplete object")
93return
94}
95}
96}
97
98func (iter *Iterator) skipString() {
99for {
100end, escaped := iter.findStringEnd()
101if end == -1 {
102if !iter.loadMore() {
103iter.ReportError("skipString", "incomplete string")
104return
105}
106if escaped {
107iter.head = 1 // skip the first char as last char read is \
108}
109} else {
110iter.head = end
111return
112}
113}
114}
115
116// adapted from: https://github.com/buger/jsonparser/blob/master/parser.go
117// Tries to find the end of string
118// Support if string contains escaped quote symbols.
119func (iter *Iterator) findStringEnd() (int, bool) {
120escaped := false
121for i := iter.head; i < iter.tail; i++ {
122c := iter.buf[i]
123if c == '"' {
124if !escaped {
125return i + 1, false
126}
127j := i - 1
128for {
129if j < iter.head || iter.buf[j] != '\\' {
130// even number of backslashes
131// either end of buffer, or " found
132return i + 1, true
133}
134j--
135if j < iter.head || iter.buf[j] != '\\' {
136// odd number of backslashes
137// it is \" or \\\"
138break
139}
140j--
141}
142} else if c == '\\' {
143escaped = true
144}
145}
146j := iter.tail - 1
147for {
148if j < iter.head || iter.buf[j] != '\\' {
149// even number of backslashes
150// either end of buffer, or " found
151return -1, false // do not end with \
152}
153j--
154if j < iter.head || iter.buf[j] != '\\' {
155// odd number of backslashes
156// it is \" or \\\"
157break
158}
159j--
160
161}
162return -1, true // end with \
163}
164