diff options
Diffstat (limited to 'src/pkg/json/scanner.go')
| -rw-r--r-- | src/pkg/json/scanner.go | 16 | 
1 files changed, 11 insertions, 5 deletions
| diff --git a/src/pkg/json/scanner.go b/src/pkg/json/scanner.go index e98ddef5c..49c2edd54 100644 --- a/src/pkg/json/scanner.go +++ b/src/pkg/json/scanner.go @@ -23,6 +23,7 @@ import (  func checkValid(data []byte, scan *scanner) os.Error {  	scan.reset()  	for _, c := range data { +		scan.bytes++  		if scan.step(scan, int(c)) == scanError {  			return scan.err  		} @@ -56,10 +57,12 @@ func nextValue(data []byte, scan *scanner) (value, rest []byte, err os.Error) {  }  // A SyntaxError is a description of a JSON syntax error. -type SyntaxError string - -func (e SyntaxError) String() string { return string(e) } +type SyntaxError struct { +	msg    string // description of error +	Offset int64  // error occurred after reading Offset bytes +} +func (e *SyntaxError) String() string { return e.msg }  // A scanner is a JSON scanning state machine.  // Callers call scan.reset() and then pass bytes in one at a time @@ -89,6 +92,9 @@ type scanner struct {  	// 1-byte redo (see undo method)  	redoCode  int  	redoState func(*scanner, int) int + +	// total bytes consumed, updated by decoder.Decode +	bytes int64  }  // These values are returned by the state transition functions @@ -148,7 +154,7 @@ func (s *scanner) eof() int {  		return scanEnd  	}  	if s.err == nil { -		s.err = SyntaxError("unexpected end of JSON input") +		s.err = &SyntaxError{"unexpected end of JSON input", s.bytes}  	}  	return scanError  } @@ -581,7 +587,7 @@ func stateError(s *scanner, c int) int {  // error records an error and switches to the error state.  func (s *scanner) error(c int, context string) int {  	s.step = stateError -	s.err = SyntaxError("invalid character " + quoteChar(c) + " " + context) +	s.err = &SyntaxError{"invalid character " + quoteChar(c) + " " + context, s.bytes}  	return scanError  } | 
