feature_iter_skip_strict.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. }
  21. if i+1 == iter.tail {
  22. return false
  23. }
  24. c = iter.buf[i+1]
  25. switch c {
  26. case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  27. default:
  28. iter.ReportError("validateNumber", `missing digit after dot`)
  29. return true // already failed
  30. }
  31. dotFound = true
  32. default:
  33. switch c {
  34. case ',', ']', '}', ' ', '\t', '\n', '\r':
  35. iter.head = i
  36. return true // must be valid
  37. }
  38. return false // may be invalid
  39. }
  40. }
  41. return false
  42. }
  43. func (iter *Iterator) skipString() {
  44. if !iter.trySkipString() {
  45. iter.unreadByte()
  46. iter.ReadString()
  47. }
  48. }
  49. func (iter *Iterator) trySkipString() bool {
  50. for i := iter.head; i < iter.tail; i++ {
  51. c := iter.buf[i]
  52. if c == '"' {
  53. iter.head = i + 1
  54. return true // valid
  55. } else if c == '\\' {
  56. return false
  57. } else if c < ' ' {
  58. iter.ReportError("ReadString",
  59. fmt.Sprintf(`invalid control character found: %d`, c))
  60. return true // already failed
  61. }
  62. }
  63. return false
  64. }
  65. func (iter *Iterator) skipObject() {
  66. iter.unreadByte()
  67. iter.ReadObjectCB(func(iter *Iterator, field string) bool {
  68. iter.Skip()
  69. return true
  70. })
  71. }
  72. func (iter *Iterator) skipArray() {
  73. iter.unreadByte()
  74. iter.ReadArrayCB(func(iter *Iterator) bool {
  75. iter.Skip()
  76. return true
  77. })
  78. }