...
Source file src/cmd/internal/bio/buf.go
1
2
3
4
5
6 package bio
7
8 import (
9 "bufio"
10 "io"
11 "log"
12 "os"
13 )
14
15
16 type Reader struct {
17 f *os.File
18 *bufio.Reader
19 }
20
21
22 type Writer struct {
23 f *os.File
24 *bufio.Writer
25 }
26
27
28
29 func Create(name string) (*Writer, error) {
30 f, err := os.Create(name)
31 if err != nil {
32 return nil, err
33 }
34 return &Writer{f: f, Writer: bufio.NewWriter(f)}, nil
35 }
36
37
38 func Open(name string) (*Reader, error) {
39 f, err := os.Open(name)
40 if err != nil {
41 return nil, err
42 }
43 return &Reader{f: f, Reader: bufio.NewReader(f)}, nil
44 }
45
46 func (r *Reader) MustSeek(offset int64, whence int) int64 {
47 if whence == 1 {
48 offset -= int64(r.Buffered())
49 }
50 off, err := r.f.Seek(offset, whence)
51 if err != nil {
52 log.Fatalf("seeking in output: %v", err)
53 }
54 r.Reset(r.f)
55 return off
56 }
57
58 func (w *Writer) MustSeek(offset int64, whence int) int64 {
59 if err := w.Flush(); err != nil {
60 log.Fatalf("writing output: %v", err)
61 }
62 off, err := w.f.Seek(offset, whence)
63 if err != nil {
64 log.Fatalf("seeking in output: %v", err)
65 }
66 return off
67 }
68
69 func (r *Reader) Offset() int64 {
70 off, err := r.f.Seek(0, 1)
71 if err != nil {
72 log.Fatalf("seeking in output [0, 1]: %v", err)
73 }
74 off -= int64(r.Buffered())
75 return off
76 }
77
78 func (w *Writer) Offset() int64 {
79 if err := w.Flush(); err != nil {
80 log.Fatalf("writing output: %v", err)
81 }
82 off, err := w.f.Seek(0, 1)
83 if err != nil {
84 log.Fatalf("seeking in output [0, 1]: %v", err)
85 }
86 return off
87 }
88
89 func (r *Reader) Close() error {
90 return r.f.Close()
91 }
92
93 func (w *Writer) Close() error {
94 err := w.Flush()
95 err1 := w.f.Close()
96 if err == nil {
97 err = err1
98 }
99 return err
100 }
101
102 func (r *Reader) File() *os.File {
103 return r.f
104 }
105
106 func (w *Writer) File() *os.File {
107 return w.f
108 }
109
110
111
112
113
114
115 func (r *Reader) Slice(length uint64) ([]byte, bool, error) {
116 if length == 0 {
117 return []byte{}, false, nil
118 }
119
120 data, ok := r.sliceOS(length)
121 if ok {
122 return data, true, nil
123 }
124
125 data = make([]byte, length)
126 _, err := io.ReadFull(r, data)
127 if err != nil {
128 return nil, false, err
129 }
130 return data, false, nil
131 }
132
133
134
135
136
137 func (r *Reader) SliceRO(length uint64) []byte {
138 data, ok := r.sliceOS(length)
139 if ok {
140 return data
141 }
142 return nil
143 }
144
View as plain text