mirror of
https://github.com/golang/go
synced 2024-09-30 06:24:33 -06:00
bufio, bytes, strings: handle negative runes in WriteRune
Updates #43254 Change-Id: I7d4bf3b99cc36ca2156af5bb01a1c595419d1d3c Reviewed-on: https://go-review.googlesource.com/c/go/+/280492 Reviewed-by: Emmanuel Odeke <emmanuel@orijtech.com> Reviewed-by: Rob Pike <r@golang.org> Trust: Emmanuel Odeke <emmanuel@orijtech.com> Run-TryBot: Emmanuel Odeke <emmanuel@orijtech.com> TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
parent
3780529255
commit
43652dc46f
@ -670,7 +670,8 @@ func (b *Writer) WriteByte(c byte) error {
|
|||||||
// WriteRune writes a single Unicode code point, returning
|
// WriteRune writes a single Unicode code point, returning
|
||||||
// the number of bytes written and any error.
|
// the number of bytes written and any error.
|
||||||
func (b *Writer) WriteRune(r rune) (size int, err error) {
|
func (b *Writer) WriteRune(r rune) (size int, err error) {
|
||||||
if r < utf8.RuneSelf {
|
// Compare as uint32 to correctly handle negative runes.
|
||||||
|
if uint32(r) < utf8.RuneSelf {
|
||||||
err = b.WriteByte(byte(r))
|
err = b.WriteByte(byte(r))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
|
@ -534,6 +534,20 @@ func TestReadWriteRune(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestWriteInvalidRune(t *testing.T) {
|
||||||
|
// Invalid runes, including negative ones, should be written as the
|
||||||
|
// replacement character.
|
||||||
|
for _, r := range []rune{-1, utf8.MaxRune + 1} {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
w := NewWriter(&buf)
|
||||||
|
w.WriteRune(r)
|
||||||
|
w.Flush()
|
||||||
|
if s := buf.String(); s != "\uFFFD" {
|
||||||
|
t.Errorf("WriteRune(%d) wrote %q, not replacement character", r, s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestReadStringAllocs(t *testing.T) {
|
func TestReadStringAllocs(t *testing.T) {
|
||||||
r := strings.NewReader(" foo foo 42 42 42 42 42 42 42 42 4.2 4.2 4.2 4.2\n")
|
r := strings.NewReader(" foo foo 42 42 42 42 42 42 42 42 4.2 4.2 4.2 4.2\n")
|
||||||
buf := NewReader(r)
|
buf := NewReader(r)
|
||||||
|
@ -275,7 +275,8 @@ func (b *Buffer) WriteByte(c byte) error {
|
|||||||
// included to match bufio.Writer's WriteRune. The buffer is grown as needed;
|
// included to match bufio.Writer's WriteRune. The buffer is grown as needed;
|
||||||
// if it becomes too large, WriteRune will panic with ErrTooLarge.
|
// if it becomes too large, WriteRune will panic with ErrTooLarge.
|
||||||
func (b *Buffer) WriteRune(r rune) (n int, err error) {
|
func (b *Buffer) WriteRune(r rune) (n int, err error) {
|
||||||
if r < utf8.RuneSelf {
|
// Compare as uint32 to correctly handle negative runes.
|
||||||
|
if uint32(r) < utf8.RuneSelf {
|
||||||
b.WriteByte(byte(r))
|
b.WriteByte(byte(r))
|
||||||
return 1, nil
|
return 1, nil
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ package bytes_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
. "bytes"
|
. "bytes"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"testing"
|
"testing"
|
||||||
@ -387,6 +388,16 @@ func TestRuneIO(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestWriteInvalidRune(t *testing.T) {
|
||||||
|
// Invalid runes, including negative ones, should be written as
|
||||||
|
// utf8.RuneError.
|
||||||
|
for _, r := range []rune{-1, utf8.MaxRune + 1} {
|
||||||
|
var buf Buffer
|
||||||
|
buf.WriteRune(r)
|
||||||
|
check(t, fmt.Sprintf("TestWriteInvalidRune (%d)", r), &buf, "\uFFFD")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestNext(t *testing.T) {
|
func TestNext(t *testing.T) {
|
||||||
b := []byte{0, 1, 2, 3, 4}
|
b := []byte{0, 1, 2, 3, 4}
|
||||||
tmp := make([]byte, 5)
|
tmp := make([]byte, 5)
|
||||||
|
@ -103,7 +103,8 @@ func (b *Builder) WriteByte(c byte) error {
|
|||||||
// It returns the length of r and a nil error.
|
// It returns the length of r and a nil error.
|
||||||
func (b *Builder) WriteRune(r rune) (int, error) {
|
func (b *Builder) WriteRune(r rune) (int, error) {
|
||||||
b.copyCheck()
|
b.copyCheck()
|
||||||
if r < utf8.RuneSelf {
|
// Compare as uint32 to correctly handle negative runes.
|
||||||
|
if uint32(r) < utf8.RuneSelf {
|
||||||
b.buf = append(b.buf, byte(r))
|
b.buf = append(b.buf, byte(r))
|
||||||
return 1, nil
|
return 1, nil
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
. "strings"
|
. "strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
"unicode/utf8"
|
||||||
)
|
)
|
||||||
|
|
||||||
func check(t *testing.T, b *Builder, want string) {
|
func check(t *testing.T, b *Builder, want string) {
|
||||||
@ -301,6 +302,16 @@ func TestBuilderCopyPanic(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBuilderWriteInvalidRune(t *testing.T) {
|
||||||
|
// Invalid runes, including negative ones, should be written as
|
||||||
|
// utf8.RuneError.
|
||||||
|
for _, r := range []rune{-1, utf8.MaxRune + 1} {
|
||||||
|
var b Builder
|
||||||
|
b.WriteRune(r)
|
||||||
|
check(t, &b, "\uFFFD")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var someBytes = []byte("some bytes sdljlk jsklj3lkjlk djlkjw")
|
var someBytes = []byte("some bytes sdljlk jsklj3lkjlk djlkjw")
|
||||||
|
|
||||||
var sinkS string
|
var sinkS string
|
||||||
|
Loading…
Reference in New Issue
Block a user