Commit 0d3f5a84 authored by Rob Pike's avatar Rob Pike

simpler fix for the negative rune problem, spotted seconds after submitting the previous fix.

R=rsc
https://golang.org/cl/178044
parent a9e8befb
...@@ -227,37 +227,35 @@ func RuneLen(rune int) int { ...@@ -227,37 +227,35 @@ func RuneLen(rune int) int {
// EncodeRune writes into p (which must be large enough) the UTF-8 encoding of the rune. // EncodeRune writes into p (which must be large enough) the UTF-8 encoding of the rune.
// It returns the number of bytes written. // It returns the number of bytes written.
func EncodeRune(rune int, p []byte) int { func EncodeRune(rune int, p []byte) int {
// Negative values are erroneous. // Negative values are erroneous. Making it unsigned addresses the problem.
if rune < 0 { r := uint(rune);
rune = RuneError
}
if rune <= _Rune1Max { if r <= _Rune1Max {
p[0] = byte(rune); p[0] = byte(r);
return 1; return 1;
} }
if rune <= _Rune2Max { if r <= _Rune2Max {
p[0] = _T2 | byte(rune>>6); p[0] = _T2 | byte(r>>6);
p[1] = _Tx | byte(rune)&_Maskx; p[1] = _Tx | byte(r)&_Maskx;
return 2; return 2;
} }
if rune > unicode.MaxRune { if r > unicode.MaxRune {
rune = RuneError r = RuneError
} }
if rune <= _Rune3Max { if r <= _Rune3Max {
p[0] = _T3 | byte(rune>>12); p[0] = _T3 | byte(r>>12);
p[1] = _Tx | byte(rune>>6)&_Maskx; p[1] = _Tx | byte(r>>6)&_Maskx;
p[2] = _Tx | byte(rune)&_Maskx; p[2] = _Tx | byte(r)&_Maskx;
return 3; return 3;
} }
p[0] = _T4 | byte(rune>>18); p[0] = _T4 | byte(r>>18);
p[1] = _Tx | byte(rune>>12)&_Maskx; p[1] = _Tx | byte(r>>12)&_Maskx;
p[2] = _Tx | byte(rune>>6)&_Maskx; p[2] = _Tx | byte(r>>6)&_Maskx;
p[3] = _Tx | byte(rune)&_Maskx; p[3] = _Tx | byte(r)&_Maskx;
return 4; return 4;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment