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