feature_iter_skip_strict.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. }
  58. func (iter *Iterator) skipArray() {
  59. }