Source file src/pkg/bufio/bufio.go
1
2
3
4
5
6
7
8 package bufio
9
10 import (
11 "bytes"
12 "errors"
13 "io"
14 "unicode/utf8"
15 )
16
17 const (
18 defaultBufSize = 4096
19 )
20
21 var (
22 ErrInvalidUnreadByte = errors.New("bufio: invalid use of UnreadByte")
23 ErrInvalidUnreadRune = errors.New("bufio: invalid use of UnreadRune")
24 ErrBufferFull = errors.New("bufio: buffer full")
25 ErrNegativeCount = errors.New("bufio: negative count")
26 )
27
28
29
30
31 type Reader struct {
32 buf []byte
33 rd io.Reader
34 r, w int
35 err error
36 lastByte int
37 lastRuneSize int
38 }
39
40 const minReadBufferSize = 16
41
42
43
44
45 func NewReaderSize(rd io.Reader, size int) *Reader {
46
47 b, ok := rd.(*Reader)
48 if ok && len(b.buf) >= size {
49 return b
50 }
51 if size < minReadBufferSize {
52 size = minReadBufferSize
53 }
54 return &Reader{
55 buf: make([]byte, size),
56 rd: rd,
57 lastByte: -1,
58 lastRuneSize: -1,
59 }
60 }
61
62
63 func NewReader(rd io.Reader) *Reader {
64 return NewReaderSize(rd, defaultBufSize)
65 }
66
67 var errNegativeRead = errors.New("bufio: reader returned negative count from Read")
68
69
70 func (b *Reader) fill() {
71
72 if b.r > 0 {
73 copy(b.buf, b.buf[b.r:b.w])
74 b.w -= b.r
75 b.r = 0
76 }
77
78
79 n, err := b.rd.Read(b.buf[b.w:])
80 if n < 0 {
81 panic(errNegativeRead)
82 }
83 b.w += n
84 if err != nil {
85 b.err = err
86 }
87 }
88
89 func (b *Reader) readErr() error {
90 err := b.err
91 b.err = nil
92 return err
93 }
94
95
96
97
98
99 func (b *Reader) Peek(n int) ([]byte, error) {
100 if n < 0 {
101 return nil, ErrNegativeCount
102 }
103 if n > len(b.buf) {
104 return nil, ErrBufferFull
105 }
106 for b.w-b.r < n && b.err == nil {
107 b.fill()
108 }
109 m := b.w - b.r
110 if m > n {
111 m = n
112 }
113 var err error
114 if m < n {
115 err = b.readErr()
116 if err == nil {
117 err = ErrBufferFull
118 }
119 }
120 return b.buf[b.r : b.r+m], err
121 }
122
123
124
125
126
127
128 func (b *Reader) Read(p []byte) (n int, err error) {
129 n = len(p)
130 if n == 0 {
131 return 0, b.readErr()
132 }
133 if b.w == b.r {
134 if b.err != nil {
135 return 0, b.readErr()
136 }
137 if len(p) >= len(b.buf) {
138
139
140 n, b.err = b.rd.Read(p)
141 if n > 0 {
142 b.lastByte = int(p[n-1])
143 b.lastRuneSize = -1
144 }
145 return n, b.readErr()
146 }
147 b.fill()
148 if b.w == b.r {
149 return 0, b.readErr()
150 }
151 }
152
153 if n > b.w-b.r {
154 n = b.w - b.r
155 }
156 copy(p[0:n], b.buf[b.r:])
157 b.r += n
158 b.lastByte = int(b.buf[b.r-1])
159 b.lastRuneSize = -1
160 return n, nil
161 }
162
163
164
165 func (b *Reader) ReadByte() (c byte, err error) {
166 b.lastRuneSize = -1
167 for b.w == b.r {
168 if b.err != nil {
169 return 0, b.readErr()
170 }
171 b.fill()
172 }
173 c = b.buf[b.r]
174 b.r++
175 b.lastByte = int(c)
176 return c, nil
177 }
178
179
180 func (b *Reader) UnreadByte() error {
181 b.lastRuneSize = -1
182 if b.r == b.w && b.lastByte >= 0 {
183 b.w = 1
184 b.r = 0
185 b.buf[0] = byte(b.lastByte)
186 b.lastByte = -1
187 return nil
188 }
189 if b.r <= 0 {
190 return ErrInvalidUnreadByte
191 }
192 b.r--
193 b.lastByte = -1
194 return nil
195 }
196
197
198
199
200 func (b *Reader) ReadRune() (r rune, size int, err error) {
201 for b.r+utf8.UTFMax > b.w && !utf8.FullRune(b.buf[b.r:b.w]) && b.err == nil {
202 b.fill()
203 }
204 b.lastRuneSize = -1
205 if b.r == b.w {
206 return 0, 0, b.readErr()
207 }
208 r, size = rune(b.buf[b.r]), 1
209 if r >= 0x80 {
210 r, size = utf8.DecodeRune(b.buf[b.r:b.w])
211 }
212 b.r += size
213 b.lastByte = int(b.buf[b.r-1])
214 b.lastRuneSize = size
215 return r, size, nil
216 }
217
218
219
220
221
222 func (b *Reader) UnreadRune() error {
223 if b.lastRuneSize < 0 || b.r == 0 {
224 return ErrInvalidUnreadRune
225 }
226 b.r -= b.lastRuneSize
227 b.lastByte = -1
228 b.lastRuneSize = -1
229 return nil
230 }
231
232
233 func (b *Reader) Buffered() int { return b.w - b.r }
234
235
236
237
238
239
240
241
242
243
244
245 func (b *Reader) ReadSlice(delim byte) (line []byte, err error) {
246
247 if i := bytes.IndexByte(b.buf[b.r:b.w], delim); i >= 0 {
248 line1 := b.buf[b.r : b.r+i+1]
249 b.r += i + 1
250 return line1, nil
251 }
252
253
254 for {
255 if b.err != nil {
256 line := b.buf[b.r:b.w]
257 b.r = b.w
258 return line, b.readErr()
259 }
260
261 n := b.Buffered()
262 b.fill()
263
264
265 if i := bytes.IndexByte(b.buf[n:b.w], delim); i >= 0 {
266 line := b.buf[0 : n+i+1]
267 b.r = n + i + 1
268 return line, nil
269 }
270
271
272 if b.Buffered() >= len(b.buf) {
273 b.r = b.w
274 return b.buf, ErrBufferFull
275 }
276 }
277 }
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292 func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) {
293 line, err = b.ReadSlice('\n')
294 if err == ErrBufferFull {
295
296 if len(line) > 0 && line[len(line)-1] == '\r' {
297
298
299 if b.r == 0 {
300
301 panic("bufio: tried to rewind past start of buffer")
302 }
303 b.r--
304 line = line[:len(line)-1]
305 }
306 return line, true, nil
307 }
308
309 if len(line) == 0 {
310 if err != nil {
311 line = nil
312 }
313 return
314 }
315 err = nil
316
317 if line[len(line)-1] == '\n' {
318 drop := 1
319 if len(line) > 1 && line[len(line)-2] == '\r' {
320 drop = 2
321 }
322 line = line[:len(line)-drop]
323 }
324 return
325 }
326
327
328
329
330
331
332
333
334 func (b *Reader) ReadBytes(delim byte) (line []byte, err error) {
335
336
337 var frag []byte
338 var full [][]byte
339 err = nil
340
341 for {
342 var e error
343 frag, e = b.ReadSlice(delim)
344 if e == nil {
345 break
346 }
347 if e != ErrBufferFull {
348 err = e
349 break
350 }
351
352
353 buf := make([]byte, len(frag))
354 copy(buf, frag)
355 full = append(full, buf)
356 }
357
358
359 n := 0
360 for i := range full {
361 n += len(full[i])
362 }
363 n += len(frag)
364
365
366 buf := make([]byte, n)
367 n = 0
368 for i := range full {
369 n += copy(buf[n:], full[i])
370 }
371 copy(buf[n:], frag)
372 return buf, err
373 }
374
375
376
377
378
379
380
381
382 func (b *Reader) ReadString(delim byte) (line string, err error) {
383 bytes, err := b.ReadBytes(delim)
384 return string(bytes), err
385 }
386
387
388 func (b *Reader) WriteTo(w io.Writer) (n int64, err error) {
389 n, err = b.writeBuf(w)
390 if err != nil {
391 return
392 }
393
394 if r, ok := b.rd.(io.WriterTo); ok {
395 m, err := r.WriteTo(w)
396 n += m
397 return n, err
398 }
399
400 for b.fill(); b.r < b.w; b.fill() {
401 m, err := b.writeBuf(w)
402 n += m
403 if err != nil {
404 return n, err
405 }
406 }
407
408 if b.err == io.EOF {
409 b.err = nil
410 }
411
412 return n, b.readErr()
413 }
414
415
416 func (b *Reader) writeBuf(w io.Writer) (int64, error) {
417 n, err := w.Write(b.buf[b.r:b.w])
418 b.r += n
419 return int64(n), err
420 }
421
422
423
424
425
426
427 type Writer struct {
428 err error
429 buf []byte
430 n int
431 wr io.Writer
432 }
433
434
435
436
437 func NewWriterSize(wr io.Writer, size int) *Writer {
438
439 b, ok := wr.(*Writer)
440 if ok && len(b.buf) >= size {
441 return b
442 }
443 if size <= 0 {
444 size = defaultBufSize
445 }
446 b = new(Writer)
447 b.buf = make([]byte, size)
448 b.wr = wr
449 return b
450 }
451
452
453 func NewWriter(wr io.Writer) *Writer {
454 return NewWriterSize(wr, defaultBufSize)
455 }
456
457
458 func (b *Writer) Flush() error {
459 if b.err != nil {
460 return b.err
461 }
462 if b.n == 0 {
463 return nil
464 }
465 n, err := b.wr.Write(b.buf[0:b.n])
466 if n < b.n && err == nil {
467 err = io.ErrShortWrite
468 }
469 if err != nil {
470 if n > 0 && n < b.n {
471 copy(b.buf[0:b.n-n], b.buf[n:b.n])
472 }
473 b.n -= n
474 b.err = err
475 return err
476 }
477 b.n = 0
478 return nil
479 }
480
481
482 func (b *Writer) Available() int { return len(b.buf) - b.n }
483
484
485 func (b *Writer) Buffered() int { return b.n }
486
487
488
489
490
491 func (b *Writer) Write(p []byte) (nn int, err error) {
492 for len(p) > b.Available() && b.err == nil {
493 var n int
494 if b.Buffered() == 0 {
495
496
497 n, b.err = b.wr.Write(p)
498 } else {
499 n = copy(b.buf[b.n:], p)
500 b.n += n
501 b.Flush()
502 }
503 nn += n
504 p = p[n:]
505 }
506 if b.err != nil {
507 return nn, b.err
508 }
509 n := copy(b.buf[b.n:], p)
510 b.n += n
511 nn += n
512 return nn, nil
513 }
514
515
516 func (b *Writer) WriteByte(c byte) error {
517 if b.err != nil {
518 return b.err
519 }
520 if b.Available() <= 0 && b.Flush() != nil {
521 return b.err
522 }
523 b.buf[b.n] = c
524 b.n++
525 return nil
526 }
527
528
529
530 func (b *Writer) WriteRune(r rune) (size int, err error) {
531 if r < utf8.RuneSelf {
532 err = b.WriteByte(byte(r))
533 if err != nil {
534 return 0, err
535 }
536 return 1, nil
537 }
538 if b.err != nil {
539 return 0, b.err
540 }
541 n := b.Available()
542 if n < utf8.UTFMax {
543 if b.Flush(); b.err != nil {
544 return 0, b.err
545 }
546 n = b.Available()
547 if n < utf8.UTFMax {
548
549 return b.WriteString(string(r))
550 }
551 }
552 size = utf8.EncodeRune(b.buf[b.n:], r)
553 b.n += size
554 return size, nil
555 }
556
557
558
559
560
561 func (b *Writer) WriteString(s string) (int, error) {
562 nn := 0
563 for len(s) > b.Available() && b.err == nil {
564 n := copy(b.buf[b.n:], s)
565 b.n += n
566 nn += n
567 s = s[n:]
568 b.Flush()
569 }
570 if b.err != nil {
571 return nn, b.err
572 }
573 n := copy(b.buf[b.n:], s)
574 b.n += n
575 nn += n
576 return nn, nil
577 }
578
579
580 func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) {
581 if b.Buffered() == 0 {
582 if w, ok := b.wr.(io.ReaderFrom); ok {
583 return w.ReadFrom(r)
584 }
585 }
586 var m int
587 for {
588 m, err = r.Read(b.buf[b.n:])
589 if m == 0 {
590 break
591 }
592 b.n += m
593 n += int64(m)
594 if b.Available() == 0 {
595 if err1 := b.Flush(); err1 != nil {
596 return n, err1
597 }
598 }
599 if err != nil {
600 break
601 }
602 }
603 if err == io.EOF {
604 err = nil
605 }
606 return n, err
607 }
608
609
610
611
612
613 type ReadWriter struct {
614 *Reader
615 *Writer
616 }
617
618
619 func NewReadWriter(r *Reader, w *Writer) *ReadWriter {
620 return &ReadWriter{r, w}
621 }
View as plain text