diff options
Diffstat (limited to 'src/pkg/unicode/utf8/utf8.go')
-rw-r--r-- | src/pkg/unicode/utf8/utf8.go | 32 |
1 files changed, 12 insertions, 20 deletions
diff --git a/src/pkg/unicode/utf8/utf8.go b/src/pkg/unicode/utf8/utf8.go index 93d0be5e0..0dc859a04 100644 --- a/src/pkg/unicode/utf8/utf8.go +++ b/src/pkg/unicode/utf8/utf8.go @@ -329,37 +329,29 @@ func RuneLen(r rune) int { // It returns the number of bytes written. func EncodeRune(p []byte, r rune) int { // Negative values are erroneous. Making it unsigned addresses the problem. - if uint32(r) <= rune1Max { + switch i := uint32(r); { + case i <= rune1Max: p[0] = byte(r) return 1 - } - - if uint32(r) <= rune2Max { + case i <= rune2Max: p[0] = t2 | byte(r>>6) p[1] = tx | byte(r)&maskx return 2 - } - - if uint32(r) > MaxRune { + case i > MaxRune, surrogateMin <= i && i <= surrogateMax: r = RuneError - } - - if surrogateMin <= r && r <= surrogateMax { - r = RuneError - } - - if uint32(r) <= rune3Max { + fallthrough + case i <= rune3Max: p[0] = t3 | byte(r>>12) p[1] = tx | byte(r>>6)&maskx p[2] = tx | byte(r)&maskx return 3 + default: + 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 } - - 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 } // RuneCount returns the number of runes in p. Erroneous and short |