made it so utf8.ReadRune() returns the size-of-the-rune rather than the number-of-bytes-read
parent
8df674a055
commit
e474e88f6f
24
readrune.go
24
readrune.go
|
@ -5,7 +5,13 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// ReadRune reads a single UTF-8 encoded Unicode character from an io.Reader,
|
// ReadRune reads a single UTF-8 encoded Unicode character from an io.Reader,
|
||||||
// and returns the Unicode character (as a Go rune) and the number of bytes read.
|
// and returns the Unicode character (as a Go rune) and the size of the rune.
|
||||||
|
//
|
||||||
|
// Note that it returns the size-of-the-rune rather than the number-of-bytes-read.
|
||||||
|
// This is to match what is described in the Go built-in package:
|
||||||
|
//
|
||||||
|
// “ReadRune reads a single encoded Unicode character and returns the rune and its size in bytes.
|
||||||
|
// If no character is available, err will be set.”
|
||||||
//
|
//
|
||||||
// If ‘reader’ is nil then ReaderRune will return an error that matches utf8.NilReaderError.
|
// If ‘reader’ is nil then ReaderRune will return an error that matches utf8.NilReaderError.
|
||||||
//
|
//
|
||||||
|
@ -49,10 +55,10 @@ func ReadRune(reader io.Reader) (rune, int, error) {
|
||||||
n, err := reader.Read(p)
|
n, err := reader.Read(p)
|
||||||
count += n
|
count += n
|
||||||
if nil != err {
|
if nil != err {
|
||||||
return 0, count, err
|
return 0, 0, err
|
||||||
}
|
}
|
||||||
if 1 != n {
|
if 1 != n {
|
||||||
return 0, count, errInternalError
|
return 0, 0, errInternalError
|
||||||
}
|
}
|
||||||
|
|
||||||
b0 = buffer[0]
|
b0 = buffer[0]
|
||||||
|
@ -97,7 +103,7 @@ func ReadRune(reader io.Reader) (rune, int, error) {
|
||||||
more = 7-1
|
more = 7-1
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return 0, count, errInternalError
|
return 0, 0, errInternalError
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,16 +115,15 @@ func ReadRune(reader io.Reader) (rune, int, error) {
|
||||||
n, err := reader.Read(p)
|
n, err := reader.Read(p)
|
||||||
count += n
|
count += n
|
||||||
if nil != err {
|
if nil != err {
|
||||||
return 0, count, err
|
return 0, 0, err
|
||||||
}
|
}
|
||||||
if more != n {
|
if more != n {
|
||||||
return 0, count, errInternalError
|
return 0, 0, errInternalError
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var r rune
|
var r rune
|
||||||
{
|
{
|
||||||
|
|
||||||
var b byte
|
var b byte
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
|
@ -154,7 +159,7 @@ func ReadRune(reader io.Reader) (rune, int, error) {
|
||||||
//b := (0xFF^0xFF) & b0
|
//b := (0xFF^0xFF) & b0
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return 0, count, errInternalError
|
return 0, 0, errInternalError
|
||||||
}
|
}
|
||||||
|
|
||||||
r = rune(b)
|
r = rune(b)
|
||||||
|
@ -166,10 +171,9 @@ func ReadRune(reader io.Reader) (rune, int, error) {
|
||||||
|
|
||||||
// if 0b1000,0000 != (0b0b1100,0000 & bsi) {
|
// if 0b1000,0000 != (0b0b1100,0000 & bsi) {
|
||||||
if 0x80 != (0xC0 & bsi) {
|
if 0x80 != (0xC0 & bsi) {
|
||||||
return 0, count, errInvalidUTF8
|
return 0, 0, errInvalidUTF8
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// b := 0b0011,1111 & bsi
|
// b := 0b0011,1111 & bsi
|
||||||
b := 0x3F & bsi
|
b := 0x3F & bsi
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue