]> Cypherpunks repositories - gostls13.git/commitdiff
simpler fix for the negative rune problem, spotted seconds after submitting the previ...
authorRob Pike <r@golang.org>
Mon, 14 Dec 2009 22:31:24 +0000 (09:31 +1100)
committerRob Pike <r@golang.org>
Mon, 14 Dec 2009 22:31:24 +0000 (09:31 +1100)
R=rsc
https://golang.org/cl/178044

src/pkg/utf8/utf8.go

index eaa3d13849a106ff9985857bc2f3ec23f667ab86..ad78f599ce3727b2632be00760996e07ce18ce25 100644 (file)
@@ -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;
 }