blob: f67bc2e83151096e59aa5e84e2e7942a8f84ce3f [file] [log] [blame]
sslobodrd046be82019-01-16 10:02:22 -05001//+build !jsoniter_sloppy
2
3package jsoniter
4
5import "fmt"
6
7func (iter *Iterator) skipNumber() {
8 if !iter.trySkipNumber() {
9 iter.unreadByte()
10 iter.ReadFloat32()
11 }
12}
13
14func (iter *Iterator) trySkipNumber() bool {
15 dotFound := false
16 for i := iter.head; i < iter.tail; i++ {
17 c := iter.buf[i]
18 switch c {
19 case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
20 case '.':
21 if dotFound {
22 iter.ReportError("validateNumber", `more than one dot found in number`)
23 return true // already failed
24 }
25 if i+1 == iter.tail {
26 return false
27 }
28 c = iter.buf[i+1]
29 switch c {
30 case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
31 default:
32 iter.ReportError("validateNumber", `missing digit after dot`)
33 return true // already failed
34 }
35 dotFound = true
36 default:
37 switch c {
38 case ',', ']', '}', ' ', '\t', '\n', '\r':
39 if iter.head == i {
40 return false // if - without following digits
41 }
42 iter.head = i
43 return true // must be valid
44 }
45 return false // may be invalid
46 }
47 }
48 return false
49}
50
51func (iter *Iterator) skipString() {
52 if !iter.trySkipString() {
53 iter.unreadByte()
54 iter.ReadString()
55 }
56}
57
58func (iter *Iterator) trySkipString() bool {
59 for i := iter.head; i < iter.tail; i++ {
60 c := iter.buf[i]
61 if c == '"' {
62 iter.head = i + 1
63 return true // valid
64 } else if c == '\\' {
65 return false
66 } else if c < ' ' {
67 iter.ReportError("trySkipString",
68 fmt.Sprintf(`invalid control character found: %d`, c))
69 return true // already failed
70 }
71 }
72 return false
73}
74
75func (iter *Iterator) skipObject() {
76 iter.unreadByte()
77 iter.ReadObjectCB(func(iter *Iterator, field string) bool {
78 iter.Skip()
79 return true
80 })
81}
82
83func (iter *Iterator) skipArray() {
84 iter.unreadByte()
85 iter.ReadArrayCB(func(iter *Iterator) bool {
86 iter.Skip()
87 return true
88 })
89}