diff --git a/src/cmd/internal/gc/lex.go b/src/cmd/internal/gc/lex.go index edfb6ca7d7..c2c4207998 100644 --- a/src/cmd/internal/gc/lex.go +++ b/src/cmd/internal/gc/lex.go @@ -1865,20 +1865,21 @@ func getc() int { curio.cp = curio.cp[1:] } } else { - var c1 int - var c2 int loop: c = obj.Bgetc(curio.bin) if c == 0xef { - c1 = obj.Bgetc(curio.bin) - c2 = obj.Bgetc(curio.bin) - if c1 == 0xbb && c2 == 0xbf { + buf, err := curio.bin.Peek(2) + if err != nil { + log.Fatalf("getc: peeking: %v", err) + } + if buf[0] == 0xbb && buf[1] == 0xbf { yyerrorl(int(lexlineno), "Unicode (UTF-8) BOM in middle of file") + + // consume BOM bytes + obj.Bgetc(curio.bin) + obj.Bgetc(curio.bin) goto loop } - - obj.Bungetc(curio.bin) - obj.Bungetc(curio.bin) } } diff --git a/src/cmd/internal/obj/util.go b/src/cmd/internal/obj/util.go index 71587954f4..b44b9caf38 100644 --- a/src/cmd/internal/obj/util.go +++ b/src/cmd/internal/obj/util.go @@ -28,12 +28,10 @@ func Cputime() float64 { } type Biobuf struct { - unget [2]int - numUnget int - f *os.File - r *bufio.Reader - w *bufio.Writer - linelen int + f *os.File + r *bufio.Reader + w *bufio.Writer + linelen int } func Bopenw(name string) (*Biobuf, error) { @@ -116,18 +114,11 @@ func Bread(b *Biobuf, p []byte) int { } func Bgetc(b *Biobuf) int { - if b.numUnget > 0 { - b.numUnget-- - return int(b.unget[b.numUnget]) - } c, err := b.r.ReadByte() - r := int(c) if err != nil { - r = -1 + return -1 } - b.unget[1] = b.unget[0] - b.unget[0] = r - return r + return int(c) } func Bgetrune(b *Biobuf) int { @@ -146,6 +137,10 @@ func (b *Biobuf) Read(p []byte) (int, error) { 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 { s, err := b.r.ReadBytes(byte(delim)) if err != nil { @@ -181,10 +176,6 @@ func Blinelen(b *Biobuf) int { return b.linelen } -func Bungetc(b *Biobuf) { - b.numUnget++ -} - func Bterm(b *Biobuf) error { var err error if b.w != nil {