From 0d3f5a84b8dee340ef2301ea5ec0f195c4962fba Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Tue, 15 Dec 2009 09:31:24 +1100 Subject: [PATCH] simpler fix for the negative rune problem, spotted seconds after submitting the previous fix. R=rsc https://golang.org/cl/178044 --- src/pkg/utf8/utf8.go | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/pkg/utf8/utf8.go b/src/pkg/utf8/utf8.go index eaa3d13849..ad78f599ce 100644 --- a/src/pkg/utf8/utf8.go +++ b/src/pkg/utf8/utf8.go @@ -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. // It returns the number of bytes written. func EncodeRune(rune int, p []byte) int { - // Negative values are erroneous. - if rune < 0 { - rune = RuneError - } + // Negative values are erroneous. Making it unsigned addresses the problem. + r := uint(rune); - if rune <= _Rune1Max { - p[0] = byte(rune); + if r <= _Rune1Max { + p[0] = byte(r); return 1; } - if rune <= _Rune2Max { - p[0] = _T2 | byte(rune>>6); - p[1] = _Tx | byte(rune)&_Maskx; + if r <= _Rune2Max { + p[0] = _T2 | byte(r>>6); + p[1] = _Tx | byte(r)&_Maskx; return 2; } - if rune > unicode.MaxRune { - rune = RuneError + if r > unicode.MaxRune { + r = RuneError } - if rune <= _Rune3Max { - p[0] = _T3 | byte(rune>>12); - p[1] = _Tx | byte(rune>>6)&_Maskx; - p[2] = _Tx | byte(rune)&_Maskx; + if r <= _Rune3Max { + p[0] = _T3 | byte(r>>12); + p[1] = _Tx | byte(r>>6)&_Maskx; + p[2] = _Tx | byte(r)&_Maskx; return 3; } - p[0] = _T4 | byte(rune>>18); - p[1] = _Tx | byte(rune>>12)&_Maskx; - p[2] = _Tx | byte(rune>>6)&_Maskx; - p[3] = _Tx | byte(rune)&_Maskx; + p[0] = _T4 | byte(r>>18); + p[1] = _Tx | byte(r>>12)&_Maskx; + p[2] = _Tx | byte(r>>6)&_Maskx; + p[3] = _Tx | byte(r)&_Maskx; return 4; } -- 2.50.0