...
1
2
3 package jsoniter
4
5 import (
6 "fmt"
7 "io"
8 )
9
10 func (iter *Iterator) skipNumber() {
11 if !iter.trySkipNumber() {
12 iter.unreadByte()
13 if iter.Error != nil && iter.Error != io.EOF {
14 return
15 }
16 iter.ReadFloat64()
17 if iter.Error != nil && iter.Error != io.EOF {
18 iter.Error = nil
19 iter.ReadBigFloat()
20 }
21 }
22 }
23
24 func (iter *Iterator) trySkipNumber() bool {
25 dotFound := false
26 for i := iter.head; i < iter.tail; i++ {
27 c := iter.buf[i]
28 switch c {
29 case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
30 case '.':
31 if dotFound {
32 iter.ReportError("validateNumber", `more than one dot found in number`)
33 return true
34 }
35 if i+1 == iter.tail {
36 return false
37 }
38 c = iter.buf[i+1]
39 switch c {
40 case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
41 default:
42 iter.ReportError("validateNumber", `missing digit after dot`)
43 return true
44 }
45 dotFound = true
46 default:
47 switch c {
48 case ',', ']', '}', ' ', '\t', '\n', '\r':
49 if iter.head == i {
50 return false
51 }
52 iter.head = i
53 return true
54 }
55 return false
56 }
57 }
58 return false
59 }
60
61 func (iter *Iterator) skipString() {
62 if !iter.trySkipString() {
63 iter.unreadByte()
64 iter.ReadString()
65 }
66 }
67
68 func (iter *Iterator) trySkipString() bool {
69 for i := iter.head; i < iter.tail; i++ {
70 c := iter.buf[i]
71 if c == '"' {
72 iter.head = i + 1
73 return true
74 } else if c == '\\' {
75 return false
76 } else if c < ' ' {
77 iter.ReportError("trySkipString",
78 fmt.Sprintf(`invalid control character found: %d`, c))
79 return true
80 }
81 }
82 return false
83 }
84
85 func (iter *Iterator) skipObject() {
86 iter.unreadByte()
87 iter.ReadObjectCB(func(iter *Iterator, field string) bool {
88 iter.Skip()
89 return true
90 })
91 }
92
93 func (iter *Iterator) skipArray() {
94 iter.unreadByte()
95 iter.ReadArrayCB(func(iter *Iterator) bool {
96 iter.Skip()
97 return true
98 })
99 }
100
View as plain text