mirror of https://github.com/EasyDarwin/EasyDarwin
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
1.8 KiB
89 lines
1.8 KiB
//+build !jsoniter_sloppy |
|
|
|
package jsoniter |
|
|
|
import "fmt" |
|
|
|
func (iter *Iterator) skipNumber() { |
|
if !iter.trySkipNumber() { |
|
iter.unreadByte() |
|
iter.ReadFloat32() |
|
} |
|
} |
|
|
|
func (iter *Iterator) trySkipNumber() bool { |
|
dotFound := false |
|
for i := iter.head; i < iter.tail; i++ { |
|
c := iter.buf[i] |
|
switch c { |
|
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': |
|
case '.': |
|
if dotFound { |
|
iter.ReportError("validateNumber", `more than one dot found in number`) |
|
return true // already failed |
|
} |
|
if i+1 == iter.tail { |
|
return false |
|
} |
|
c = iter.buf[i+1] |
|
switch c { |
|
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': |
|
default: |
|
iter.ReportError("validateNumber", `missing digit after dot`) |
|
return true // already failed |
|
} |
|
dotFound = true |
|
default: |
|
switch c { |
|
case ',', ']', '}', ' ', '\t', '\n', '\r': |
|
if iter.head == i { |
|
return false // if - without following digits |
|
} |
|
iter.head = i |
|
return true // must be valid |
|
} |
|
return false // may be invalid |
|
} |
|
} |
|
return false |
|
} |
|
|
|
func (iter *Iterator) skipString() { |
|
if !iter.trySkipString() { |
|
iter.unreadByte() |
|
iter.ReadString() |
|
} |
|
} |
|
|
|
func (iter *Iterator) trySkipString() bool { |
|
for i := iter.head; i < iter.tail; i++ { |
|
c := iter.buf[i] |
|
if c == '"' { |
|
iter.head = i + 1 |
|
return true // valid |
|
} else if c == '\\' { |
|
return false |
|
} else if c < ' ' { |
|
iter.ReportError("trySkipString", |
|
fmt.Sprintf(`invalid control character found: %d`, c)) |
|
return true // already failed |
|
} |
|
} |
|
return false |
|
} |
|
|
|
func (iter *Iterator) skipObject() { |
|
iter.unreadByte() |
|
iter.ReadObjectCB(func(iter *Iterator, field string) bool { |
|
iter.Skip() |
|
return true |
|
}) |
|
} |
|
|
|
func (iter *Iterator) skipArray() { |
|
iter.unreadByte() |
|
iter.ReadArrayCB(func(iter *Iterator) bool { |
|
iter.Skip() |
|
return true |
|
}) |
|
}
|
|
|