summaryrefslogtreecommitdiff
path: root/decode_scan.go
diff options
context:
space:
mode:
Diffstat (limited to 'decode_scan.go')
-rw-r--r--decode_scan.go30
1 files changed, 24 insertions, 6 deletions
diff --git a/decode_scan.go b/decode_scan.go
index 3c41df6..fee9ec6 100644
--- a/decode_scan.go
+++ b/decode_scan.go
@@ -34,20 +34,37 @@ type runeTypeScannerImpl struct {
parser Parser
offset int64
- repeat bool
- stuck bool
- rRune rune
- rSize int
- rType RuneType
- rErr error
+ repeat bool
+ stuck bool
+ rRune rune
+ rRuneOK bool
+ rSize int
+ rType RuneType
+ rErr error
}
var _ runeTypeScanner = (*runeTypeScannerImpl)(nil)
func (sc *runeTypeScannerImpl) Reset() {
sc.parser.Reset()
+ unread := sc.stuck && sc.rType == RuneTypeEOF && sc.rRuneOK
sc.stuck = false
sc.repeat = false
+ if unread {
+ // re-figure the rType and rErr
+ var err error
+ sc.rType, err = sc.parser.HandleRune(sc.rRune)
+ if err != nil {
+ sc.rErr = &DecodeSyntaxError{
+ Offset: sc.offset,
+ Err: err,
+ }
+ } else {
+ sc.rErr = nil
+ }
+ // tell it to use that rType and rErr
+ sc.UnreadRune()
+ }
}
func (sc *runeTypeScannerImpl) ReadRuneType() (rune, int, RuneType, error) {
@@ -62,6 +79,7 @@ func (sc *runeTypeScannerImpl) ReadRuneType() (rune, int, RuneType, error) {
var err error
sc.rRune, sc.rSize, err = sc.inner.ReadRune()
sc.offset += int64(sc.rSize)
+ sc.rRuneOK = err == nil
switch err {
case nil:
sc.rType, err = sc.parser.HandleRune(sc.rRune)