Commit 8d16253c authored by Dave Cheney's avatar Dave Cheney

cmd/internal/obj: remove Biobuf unget

This change applies CL 9365 to the copy of Biobuf in cmd/internal/obj.

In the process I discovered that some of the methods that should have been
checking the unget buffer before reading were not and it was probably just
dumb luck that we handn't hit these issues before; Bungetc is only used in
one place in cmd/internal/gc and only an unlikely code path.

Change-Id: Ifa0c5c08442e9fe951a5078c6e9ec77a8a4dc2ff
Reviewed-on: https://go-review.googlesource.com/9529Reviewed-by: default avatarDaniel Morsing <daniel.morsing@gmail.com>
Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
Reviewed-by: default avatarDave Cheney <dave@cheney.net>
Run-TryBot: Dave Cheney <dave@cheney.net>
parent c723230e
...@@ -1865,20 +1865,21 @@ func getc() int { ...@@ -1865,20 +1865,21 @@ func getc() int {
curio.cp = curio.cp[1:] curio.cp = curio.cp[1:]
} }
} else { } else {
var c1 int
var c2 int
loop: loop:
c = obj.Bgetc(curio.bin) c = obj.Bgetc(curio.bin)
if c == 0xef { if c == 0xef {
c1 = obj.Bgetc(curio.bin) buf, err := curio.bin.Peek(2)
c2 = obj.Bgetc(curio.bin) if err != nil {
if c1 == 0xbb && c2 == 0xbf { log.Fatalf("getc: peeking: %v", err)
}
if buf[0] == 0xbb && buf[1] == 0xbf {
yyerrorl(int(lexlineno), "Unicode (UTF-8) BOM in middle of file") yyerrorl(int(lexlineno), "Unicode (UTF-8) BOM in middle of file")
// consume BOM bytes
obj.Bgetc(curio.bin)
obj.Bgetc(curio.bin)
goto loop goto loop
} }
obj.Bungetc(curio.bin)
obj.Bungetc(curio.bin)
} }
} }
......
...@@ -28,12 +28,10 @@ func Cputime() float64 { ...@@ -28,12 +28,10 @@ func Cputime() float64 {
} }
type Biobuf struct { type Biobuf struct {
unget [2]int f *os.File
numUnget int r *bufio.Reader
f *os.File w *bufio.Writer
r *bufio.Reader linelen int
w *bufio.Writer
linelen int
} }
func Bopenw(name string) (*Biobuf, error) { func Bopenw(name string) (*Biobuf, error) {
...@@ -116,18 +114,11 @@ func Bread(b *Biobuf, p []byte) int { ...@@ -116,18 +114,11 @@ func Bread(b *Biobuf, p []byte) int {
} }
func Bgetc(b *Biobuf) int { func Bgetc(b *Biobuf) int {
if b.numUnget > 0 {
b.numUnget--
return int(b.unget[b.numUnget])
}
c, err := b.r.ReadByte() c, err := b.r.ReadByte()
r := int(c)
if err != nil { if err != nil {
r = -1 return -1
} }
b.unget[1] = b.unget[0] return int(c)
b.unget[0] = r
return r
} }
func Bgetrune(b *Biobuf) int { func Bgetrune(b *Biobuf) int {
...@@ -146,6 +137,10 @@ func (b *Biobuf) Read(p []byte) (int, error) { ...@@ -146,6 +137,10 @@ func (b *Biobuf) Read(p []byte) (int, error) {
return b.r.Read(p) return b.r.Read(p)
} }
func (b *Biobuf) Peek(n int) ([]byte, error) {
return b.r.Peek(n)
}
func Brdline(b *Biobuf, delim int) string { func Brdline(b *Biobuf, delim int) string {
s, err := b.r.ReadBytes(byte(delim)) s, err := b.r.ReadBytes(byte(delim))
if err != nil { if err != nil {
...@@ -181,10 +176,6 @@ func Blinelen(b *Biobuf) int { ...@@ -181,10 +176,6 @@ func Blinelen(b *Biobuf) int {
return b.linelen return b.linelen
} }
func Bungetc(b *Biobuf) {
b.numUnget++
}
func Bterm(b *Biobuf) error { func Bterm(b *Biobuf) error {
var err error var err error
if b.w != nil { if b.w != nil {
......
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