1//+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("ReadString",
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}
90