feature_iter_skip_strict.go 1.5 KB

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