summaryrefslogtreecommitdiff
path: root/decode_scan.go
diff options
context:
space:
mode:
Diffstat (limited to 'decode_scan.go')
-rw-r--r--decode_scan.go34
1 files changed, 14 insertions, 20 deletions
diff --git a/decode_scan.go b/decode_scan.go
index 249975d..387fcea 100644
--- a/decode_scan.go
+++ b/decode_scan.go
@@ -35,34 +35,30 @@ type runeTypeScannerImpl struct {
inner io.RuneScanner // initialized by constructor
- initialized bool
-
parser internal.Parser // initialized by constructor
offset int64
- repeat bool
- stuck bool
- rRune rune
- rRuneOK bool
- rSize int
- rType internal.RuneType
- rErr error
+ initialized bool
+ repeat bool
+
+ rRune rune
+ rSize int
+ rType internal.RuneType
+ rErr error
}
var _ runeTypeScanner = (*runeTypeScannerImpl)(nil)
func (sc *runeTypeScannerImpl) Reset() {
sc.parser.Reset()
- unread := sc.stuck && sc.rType == internal.RuneTypeEOF && sc.rRuneOK
- sc.stuck = false
- sc.repeat = false
- if unread {
+ if sc.repeat || (sc.rType == internal.RuneTypeEOF && sc.rSize > 0) {
+ sc.repeat = false
// 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,
+ Offset: sc.offset - int64(sc.rSize),
Err: err,
}
} else {
@@ -75,21 +71,21 @@ func (sc *runeTypeScannerImpl) Reset() {
func (sc *runeTypeScannerImpl) ReadRuneType() (rune, int, internal.RuneType, error) {
switch {
- case sc.stuck:
+ case sc.initialized && (sc.rType == internal.RuneTypeError || sc.rType == internal.RuneTypeEOF):
// do nothing
case sc.repeat:
_, _, _ = sc.inner.ReadRune()
default:
+ sc.initialized = true
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)
if err != nil {
sc.rErr = &DecodeSyntaxError{
- Offset: sc.offset,
+ Offset: sc.offset - int64(sc.rSize),
Err: err,
}
} else {
@@ -113,9 +109,7 @@ func (sc *runeTypeScannerImpl) ReadRuneType() (rune, int, internal.RuneType, err
}
}
}
- sc.initialized = true
sc.repeat = false
- sc.stuck = sc.rType == internal.RuneTypeEOF || sc.rType == internal.RuneTypeError
return sc.rRune, sc.rSize, sc.rType, sc.rErr
}
@@ -137,7 +131,7 @@ func (sc *runeTypeScannerImpl) ReadRune() (rune, int, error) {
// unread, or if that call returned a rune with size 0, then
// ErrInvalidUnreadRune is returned. Otherwise, nil is returned.
func (sc *runeTypeScannerImpl) UnreadRune() error {
- if !sc.initialized || sc.repeat || sc.rSize == 0 {
+ if sc.repeat || sc.rSize == 0 {
return ErrInvalidUnreadRune
}
sc.repeat = true