github.com/kdevb0x/go@v0.0.0-20180115030120-39687051e9e7/src/cmd/internal/bio/buf.go (about)

     1  // Copyright 2015 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Package bio implements common I/O abstractions used within the Go toolchain.
     6  package bio
     7  
     8  import (
     9  	"bufio"
    10  	"log"
    11  	"os"
    12  )
    13  
    14  // Reader implements a seekable buffered io.Reader.
    15  type Reader struct {
    16  	f *os.File
    17  	*bufio.Reader
    18  }
    19  
    20  // Writer implements a seekable buffered io.Writer.
    21  type Writer struct {
    22  	f *os.File
    23  	*bufio.Writer
    24  }
    25  
    26  // Create creates the file named name and returns a Writer
    27  // for that file.
    28  func Create(name string) (*Writer, error) {
    29  	f, err := os.Create(name)
    30  	if err != nil {
    31  		return nil, err
    32  	}
    33  	return &Writer{f: f, Writer: bufio.NewWriter(f)}, nil
    34  }
    35  
    36  // Open returns a Reader for the file named name.
    37  func Open(name string) (*Reader, error) {
    38  	f, err := os.Open(name)
    39  	if err != nil {
    40  		return nil, err
    41  	}
    42  	return &Reader{f: f, Reader: bufio.NewReader(f)}, nil
    43  }
    44  
    45  func (r *Reader) Seek(offset int64, whence int) int64 {
    46  	if whence == 1 {
    47  		offset -= int64(r.Buffered())
    48  	}
    49  	off, err := r.f.Seek(offset, whence)
    50  	if err != nil {
    51  		log.Fatalf("seeking in output: %v", err)
    52  	}
    53  	r.Reset(r.f)
    54  	return off
    55  }
    56  
    57  func (w *Writer) Seek(offset int64, whence int) int64 {
    58  	if err := w.Flush(); err != nil {
    59  		log.Fatalf("writing output: %v", err)
    60  	}
    61  	off, err := w.f.Seek(offset, whence)
    62  	if err != nil {
    63  		log.Fatalf("seeking in output: %v", err)
    64  	}
    65  	return off
    66  }
    67  
    68  func (r *Reader) Offset() int64 {
    69  	off, err := r.f.Seek(0, 1)
    70  	if err != nil {
    71  		log.Fatalf("seeking in output [0, 1]: %v", err)
    72  	}
    73  	off -= int64(r.Buffered())
    74  	return off
    75  }
    76  
    77  func (w *Writer) Offset() int64 {
    78  	if err := w.Flush(); err != nil {
    79  		log.Fatalf("writing output: %v", err)
    80  	}
    81  	off, err := w.f.Seek(0, 1)
    82  	if err != nil {
    83  		log.Fatalf("seeking in output [0, 1]: %v", err)
    84  	}
    85  	return off
    86  }
    87  
    88  func (r *Reader) Close() error {
    89  	return r.f.Close()
    90  }
    91  
    92  func (w *Writer) Close() error {
    93  	err := w.Flush()
    94  	err1 := w.f.Close()
    95  	if err == nil {
    96  		err = err1
    97  	}
    98  	return err
    99  }