replay CL 19916 and CL 19913 now that the build can handle them
TBR=r
OCL=19924
CL=19934
diff --git a/src/lib/bufio.go b/src/lib/bufio.go
index f41c4cd..11813d6 100644
--- a/src/lib/bufio.go
+++ b/src/lib/bufio.go
@@ -3,8 +3,12 @@
// license that can be found in the LICENSE file.
package bufio
-import "os"
-import "io"
+
+import (
+ "os";
+ "io";
+ "utf8";
+)
// TODO:
@@ -65,7 +69,7 @@
}
// Slide existing data to beginning.
- if b.w > b.r {
+ if b.w > b.r {
CopySlice(b.buf[0:b.w-b.r], b.buf[b.r:b.w]);
b.w -= b.r;
} else {
@@ -140,6 +144,30 @@
return nil
}
+// Read a single Unicode character; returns the rune and its size.
+func (b *BufRead) ReadRune() (rune int, size int, err *os.Error) {
+ for b.r + utf8.UTFMax > b.w && !utf8.FullRune(b.buf[b.r:b.w]) {
+ n := b.w - b.r;
+ b.Fill();
+ if b.err != nil {
+ return 0, 0, b.err
+ }
+ if b.w - b.r == n {
+ // no bytes read
+ if b.r == b.w {
+ return 0, 0, EndOfFile
+ }
+ break;
+ }
+ }
+ rune, size = int(b.buf[b.r]), 1;
+ if rune >= 0x80 {
+ rune, size = utf8.DecodeRune(b.buf[b.r:b.w]);
+ }
+ b.r += size;
+ return rune, size, nil
+}
+
// Helper function: look for byte c in array p,
// returning its index or -1.
func FindByte(p *[]byte, c byte) int {