github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/jsoni/iter_skip_strict.go (about) 1 //go:build !jsoniter_sloppy 2 // +build !jsoniter_sloppy 3 4 package jsoni 5 6 import ( 7 "fmt" 8 "io" 9 ) 10 11 func (iter *Iterator) skipNumber() { 12 if !iter.trySkipNumber() { 13 iter.unreadByte() 14 if iter.Error != nil && iter.Error != io.EOF { 15 return 16 } 17 iter.ReadFloat64() 18 if iter.Error != nil && iter.Error != io.EOF { 19 iter.Error = nil 20 iter.ReadBigFloat() 21 } 22 } 23 } 24 25 func (iter *Iterator) trySkipNumber() bool { 26 dotFound := false 27 for i := iter.head; i < iter.tail; i++ { 28 c := iter.buf[i] 29 switch c { 30 case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': 31 case '.': 32 if dotFound { 33 iter.ReportError("validateNumber", `more than one dot found in number`) 34 return true // already failed 35 } 36 if i+1 == iter.tail { 37 return false 38 } 39 c = iter.buf[i+1] 40 switch c { 41 case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': 42 default: 43 iter.ReportError("validateNumber", `missing digit after dot`) 44 return true // already failed 45 } 46 dotFound = true 47 default: 48 switch c { 49 case ',', ']', '}', ' ', '\t', '\n', '\r': 50 if iter.head == i { 51 return false // if - without following digits 52 } 53 iter.head = i 54 return true // must be valid 55 } 56 return false // may be invalid 57 } 58 } 59 return false 60 } 61 62 func (iter *Iterator) skipString() { 63 if !iter.trySkipString() { 64 iter.unreadByte() 65 iter.ReadString() 66 } 67 } 68 69 func (iter *Iterator) trySkipString() bool { 70 for i := iter.head; i < iter.tail; i++ { 71 c := iter.buf[i] 72 if c == '"' { 73 iter.head = i + 1 74 return true // valid 75 } else if c == '\\' { 76 return false 77 } else if c < ' ' { 78 iter.ReportError("trySkipString", 79 fmt.Sprintf(`invalid control character found: %d`, c)) 80 return true // already failed 81 } 82 } 83 return false 84 } 85 86 func (iter *Iterator) skipObject() { 87 iter.unreadByte() 88 iter.ReadObjectCB(func(iter *Iterator, field string) bool { 89 iter.Skip() 90 return true 91 }) 92 } 93 94 func (iter *Iterator) skipArray() { 95 iter.unreadByte() 96 iter.ReadArrayCB(func(iter *Iterator) bool { 97 iter.Skip() 98 return true 99 }) 100 }