Source file
src/bufio/bufio.go
1
2
3
4
5
6
7
8 package bufio
9
10 import (
11 "bytes"
12 "errors"
13 "io"
14 "strings"
15 "unicode/utf8"
16 )
17
18 const (
19 defaultBufSize = 4096
20 )
21
22 var (
23 ErrInvalidUnreadByte = errors.New("bufio: invalid use of UnreadByte")
24 ErrInvalidUnreadRune = errors.New("bufio: invalid use of UnreadRune")
25 ErrBufferFull = errors.New("bufio: buffer full")
26 ErrNegativeCount = errors.New("bufio: negative count")
27 )
28
29
30
31
32 type Reader struct {
33 buf []byte
34 rd io.Reader
35 r, w int
36 err error
37 lastByte int
38 lastRuneSize int
39 }
40
41 const minReadBufferSize = 16
42 const maxConsecutiveEmptyReads = 100
43
44
45
46
47 func NewReaderSize(rd io.Reader, size int) *Reader {
48
49 b, ok := rd.(*Reader)
50 if ok && len(b.buf) >= size {
51 return b
52 }
53 if size < minReadBufferSize {
54 size = minReadBufferSize
55 }
56 r := new(Reader)
57 r.reset(make([]byte, size), rd)
58 return r
59 }
60
61
62 func NewReader(rd io.Reader) *Reader {
63 return NewReaderSize(rd, defaultBufSize)
64 }
65
66
67 func (b *Reader) Size() int { return len(b.buf) }
68
69
70
71
72
73
74 func (b *Reader) Reset(r io.Reader) {
75
76
77
78 if b == r {
79 return
80 }
81 if b.buf == nil {
82 b.buf = make([]byte, defaultBufSize)
83 }
84 b.reset(b.buf, r)
85 }
86
87 func (b *Reader) reset(buf []byte, r io.Reader) {
88 *b = Reader{
89 buf: buf,
90 rd: r,
91 lastByte: -1,
92 lastRuneSize: -1,
93 }
94 }
95
96 var errNegativeRead = errors.New("bufio: reader returned negative count from Read")
97
98
99 func (b *Reader) fill() {
100
101 if b.r > 0 {
102 copy(b.buf, b.buf[b.r:b.w])
103 b.w -= b.r
104 b.r = 0
105 }
106
107 if b.w >= len(b.buf) {
108 panic("bufio: tried to fill full buffer")
109 }
110
111
112 for i := maxConsecutiveEmptyReads; i > 0; i-- {
113 n, err := b.rd.Read(b.buf[b.w:])
114 if n < 0 {
115 panic(errNegativeRead)
116 }
117 b.w += n
118 if err != nil {
119 b.err = err
120 return
121 }
122 if n > 0 {
123 return
124 }
125 }
126 b.err = io.ErrNoProgress
127 }
128
129 func (b *Reader) readErr() error {
130 err := b.err
131 b.err = nil
132 return err
133 }
134
135
136
137
138
139
140
141
142 func (b *Reader) Peek(n int) ([]byte, error) {
143 if n < 0 {
144 return nil, ErrNegativeCount
145 }
146
147 b.lastByte = -1
148 b.lastRuneSize = -1
149
150 for b.w-b.r < n && b.w-b.r < len(b.buf) && b.err == nil {
151 b.fill()
152 }
153
154 if n > len(b.buf) {
155 return b.buf[b.r:b.w], ErrBufferFull
156 }
157
158
159 var err error
160 if avail := b.w - b.r; avail < n {
161
162 n = avail
163 err = b.readErr()
164 if err == nil {
165 err = ErrBufferFull
166 }
167 }
168 return b.buf[b.r : b.r+n], err
169 }
170
171
172
173
174
175
176 func (b *Reader) Discard(n int) (discarded int, err error) {
177 if n < 0 {
178 return 0, ErrNegativeCount
179 }
180 if n == 0 {
181 return
182 }
183
184 b.lastByte = -1
185 b.lastRuneSize = -1
186
187 remain := n
188 for {
189 skip := b.Buffered()
190 if skip == 0 {
191 b.fill()
192 skip = b.Buffered()
193 }
194 if skip > remain {
195 skip = remain
196 }
197 b.r += skip
198 remain -= skip
199 if remain == 0 {
200 return n, nil
201 }
202 if b.err != nil {
203 return n - remain, b.readErr()
204 }
205 }
206 }
207
208
209
210
211
212
213
214
215 func (b *Reader) Read(p []byte) (n int, err error) {
216 n = len(p)
217 if n == 0 {
218 if b.Buffered() > 0 {
219 return 0, nil
220 }
221 return 0, b.readErr()
222 }
223 if b.r == b.w {
224 if b.err != nil {
225 return 0, b.readErr()
226 }
227 if len(p) >= len(b.buf) {
228
229
230 n, b.err = b.rd.Read(p)
231 if n < 0 {
232 panic(errNegativeRead)
233 }
234 if n > 0 {
235 b.lastByte = int(p[n-1])
236 b.lastRuneSize = -1
237 }
238 return n, b.readErr()
239 }
240
241
242 b.r = 0
243 b.w = 0
244 n, b.err = b.rd.Read(b.buf)
245 if n < 0 {
246 panic(errNegativeRead)
247 }
248 if n == 0 {
249 return 0, b.readErr()
250 }
251 b.w += n
252 }
253
254
255
256
257 n = copy(p, b.buf[b.r:b.w])
258 b.r += n
259 b.lastByte = int(b.buf[b.r-1])
260 b.lastRuneSize = -1
261 return n, nil
262 }
263
264
265
266 func (b *Reader) ReadByte() (byte, error) {
267 b.lastRuneSize = -1
268 for b.r == b.w {
269 if b.err != nil {
270 return 0, b.readErr()
271 }
272 b.fill()
273 }
274 c := b.buf[b.r]
275 b.r++
276 b.lastByte = int(c)
277 return c, nil
278 }
279
280
281
282
283
284
285 func (b *Reader) UnreadByte() error {
286 if b.lastByte < 0 || b.r == 0 && b.w > 0 {
287 return ErrInvalidUnreadByte
288 }
289
290 if b.r > 0 {
291 b.r--
292 } else {
293
294 b.w = 1
295 }
296 b.buf[b.r] = byte(b.lastByte)
297 b.lastByte = -1
298 b.lastRuneSize = -1
299 return nil
300 }
301
302
303
304
305 func (b *Reader) ReadRune() (r rune, size int, err error) {
306 for b.r+utf8.UTFMax > b.w && !utf8.FullRune(b.buf[b.r:b.w]) && b.err == nil && b.w-b.r < len(b.buf) {
307 b.fill()
308 }
309 b.lastRuneSize = -1
310 if b.r == b.w {
311 return 0, 0, b.readErr()
312 }
313 r, size = rune(b.buf[b.r]), 1
314 if r >= utf8.RuneSelf {
315 r, size = utf8.DecodeRune(b.buf[b.r:b.w])
316 }
317 b.r += size
318 b.lastByte = int(b.buf[b.r-1])
319 b.lastRuneSize = size
320 return r, size, nil
321 }
322
323
324
325
326
327 func (b *Reader) UnreadRune() error {
328 if b.lastRuneSize < 0 || b.r < b.lastRuneSize {
329 return ErrInvalidUnreadRune
330 }
331 b.r -= b.lastRuneSize
332 b.lastByte = -1
333 b.lastRuneSize = -1
334 return nil
335 }
336
337
338 func (b *Reader) Buffered() int { return b.w - b.r }
339
340
341
342
343
344
345
346
347
348
349
350 func (b *Reader) ReadSlice(delim byte) (line []byte, err error) {
351 s := 0
352 for {
353
354 if i := bytes.IndexByte(b.buf[b.r+s:b.w], delim); i >= 0 {
355 i += s
356 line = b.buf[b.r : b.r+i+1]
357 b.r += i + 1
358 break
359 }
360
361
362 if b.err != nil {
363 line = b.buf[b.r:b.w]
364 b.r = b.w
365 err = b.readErr()
366 break
367 }
368
369
370 if b.Buffered() >= len(b.buf) {
371 b.r = b.w
372 line = b.buf
373 err = ErrBufferFull
374 break
375 }
376
377 s = b.w - b.r
378
379 b.fill()
380 }
381
382
383 if i := len(line) - 1; i >= 0 {
384 b.lastByte = int(line[i])
385 b.lastRuneSize = -1
386 }
387
388 return
389 }
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407 func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) {
408 line, err = b.ReadSlice('\n')
409 if err == ErrBufferFull {
410
411 if len(line) > 0 && line[len(line)-1] == '\r' {
412
413
414 if b.r == 0 {
415
416 panic("bufio: tried to rewind past start of buffer")
417 }
418 b.r--
419 line = line[:len(line)-1]
420 }
421 return line, true, nil
422 }
423
424 if len(line) == 0 {
425 if err != nil {
426 line = nil
427 }
428 return
429 }
430 err = nil
431
432 if line[len(line)-1] == '\n' {
433 drop := 1
434 if len(line) > 1 && line[len(line)-2] == '\r' {
435 drop = 2
436 }
437 line = line[:len(line)-drop]
438 }
439 return
440 }
441
442
443
444
445
446
447
448
449 func (b *Reader) collectFragments(delim byte) (fullBuffers [][]byte, finalFragment []byte, totalLen int, err error) {
450 var frag []byte
451
452 for {
453 var e error
454 frag, e = b.ReadSlice(delim)
455 if e == nil {
456 break
457 }
458 if e != ErrBufferFull {
459 err = e
460 break
461 }
462
463
464 buf := bytes.Clone(frag)
465 fullBuffers = append(fullBuffers, buf)
466 totalLen += len(buf)
467 }
468
469 totalLen += len(frag)
470 return fullBuffers, frag, totalLen, err
471 }
472
473
474
475
476
477
478
479
480 func (b *Reader) ReadBytes(delim byte) ([]byte, error) {
481 full, frag, n, err := b.collectFragments(delim)
482
483 buf := make([]byte, n)
484 n = 0
485
486 for i := range full {
487 n += copy(buf[n:], full[i])
488 }
489 copy(buf[n:], frag)
490 return buf, err
491 }
492
493
494
495
496
497
498
499
500 func (b *Reader) ReadString(delim byte) (string, error) {
501 full, frag, n, err := b.collectFragments(delim)
502
503 var buf strings.Builder
504 buf.Grow(n)
505
506 for _, fb := range full {
507 buf.Write(fb)
508 }
509 buf.Write(frag)
510 return buf.String(), err
511 }
512
513
514
515
516
517 func (b *Reader) WriteTo(w io.Writer) (n int64, err error) {
518 b.lastByte = -1
519 b.lastRuneSize = -1
520
521 n, err = b.writeBuf(w)
522 if err != nil {
523 return
524 }
525
526 if r, ok := b.rd.(io.WriterTo); ok {
527 m, err := r.WriteTo(w)
528 n += m
529 return n, err
530 }
531
532 if w, ok := w.(io.ReaderFrom); ok {
533 m, err := w.ReadFrom(b.rd)
534 n += m
535 return n, err
536 }
537
538 if b.w-b.r < len(b.buf) {
539 b.fill()
540 }
541
542 for b.r < b.w {
543
544 m, err := b.writeBuf(w)
545 n += m
546 if err != nil {
547 return n, err
548 }
549 b.fill()
550 }
551
552 if b.err == io.EOF {
553 b.err = nil
554 }
555
556 return n, b.readErr()
557 }
558
559 var errNegativeWrite = errors.New("bufio: writer returned negative count from Write")
560
561
562 func (b *Reader) writeBuf(w io.Writer) (int64, error) {
563 n, err := w.Write(b.buf[b.r:b.w])
564 if n < 0 {
565 panic(errNegativeWrite)
566 }
567 b.r += n
568 return int64(n), err
569 }
570
571
572
573
574
575
576
577
578
579 type Writer struct {
580 err error
581 buf []byte
582 n int
583 wr io.Writer
584 }
585
586
587
588
589 func NewWriterSize(w io.Writer, size int) *Writer {
590
591 b, ok := w.(*Writer)
592 if ok && len(b.buf) >= size {
593 return b
594 }
595 if size <= 0 {
596 size = defaultBufSize
597 }
598 return &Writer{
599 buf: make([]byte, size),
600 wr: w,
601 }
602 }
603
604
605
606
607 func NewWriter(w io.Writer) *Writer {
608 return NewWriterSize(w, defaultBufSize)
609 }
610
611
612 func (b *Writer) Size() int { return len(b.buf) }
613
614
615
616
617
618
619 func (b *Writer) Reset(w io.Writer) {
620
621
622
623 if b == w {
624 return
625 }
626 if b.buf == nil {
627 b.buf = make([]byte, defaultBufSize)
628 }
629 b.err = nil
630 b.n = 0
631 b.wr = w
632 }
633
634
635 func (b *Writer) Flush() error {
636 if b.err != nil {
637 return b.err
638 }
639 if b.n == 0 {
640 return nil
641 }
642 n, err := b.wr.Write(b.buf[0:b.n])
643 if n < b.n && err == nil {
644 err = io.ErrShortWrite
645 }
646 if err != nil {
647 if n > 0 && n < b.n {
648 copy(b.buf[0:b.n-n], b.buf[n:b.n])
649 }
650 b.n -= n
651 b.err = err
652 return err
653 }
654 b.n = 0
655 return nil
656 }
657
658
659 func (b *Writer) Available() int { return len(b.buf) - b.n }
660
661
662
663
664
665 func (b *Writer) AvailableBuffer() []byte {
666 return b.buf[b.n:][:0]
667 }
668
669
670 func (b *Writer) Buffered() int { return b.n }
671
672
673
674
675
676 func (b *Writer) Write(p []byte) (nn int, err error) {
677 for len(p) > b.Available() && b.err == nil {
678 var n int
679 if b.Buffered() == 0 {
680
681
682 n, b.err = b.wr.Write(p)
683 } else {
684 n = copy(b.buf[b.n:], p)
685 b.n += n
686 b.Flush()
687 }
688 nn += n
689 p = p[n:]
690 }
691 if b.err != nil {
692 return nn, b.err
693 }
694 n := copy(b.buf[b.n:], p)
695 b.n += n
696 nn += n
697 return nn, nil
698 }
699
700
701 func (b *Writer) WriteByte(c byte) error {
702 if b.err != nil {
703 return b.err
704 }
705 if b.Available() <= 0 && b.Flush() != nil {
706 return b.err
707 }
708 b.buf[b.n] = c
709 b.n++
710 return nil
711 }
712
713
714
715 func (b *Writer) WriteRune(r rune) (size int, err error) {
716
717 if uint32(r) < utf8.RuneSelf {
718 err = b.WriteByte(byte(r))
719 if err != nil {
720 return 0, err
721 }
722 return 1, nil
723 }
724 if b.err != nil {
725 return 0, b.err
726 }
727 n := b.Available()
728 if n < utf8.UTFMax {
729 if b.Flush(); b.err != nil {
730 return 0, b.err
731 }
732 n = b.Available()
733 if n < utf8.UTFMax {
734
735 return b.WriteString(string(r))
736 }
737 }
738 size = utf8.EncodeRune(b.buf[b.n:], r)
739 b.n += size
740 return size, nil
741 }
742
743
744
745
746
747 func (b *Writer) WriteString(s string) (int, error) {
748 var sw io.StringWriter
749 tryStringWriter := true
750
751 nn := 0
752 for len(s) > b.Available() && b.err == nil {
753 var n int
754 if b.Buffered() == 0 && sw == nil && tryStringWriter {
755
756 sw, tryStringWriter = b.wr.(io.StringWriter)
757 }
758 if b.Buffered() == 0 && tryStringWriter {
759
760
761
762 n, b.err = sw.WriteString(s)
763 } else {
764 n = copy(b.buf[b.n:], s)
765 b.n += n
766 b.Flush()
767 }
768 nn += n
769 s = s[n:]
770 }
771 if b.err != nil {
772 return nn, b.err
773 }
774 n := copy(b.buf[b.n:], s)
775 b.n += n
776 nn += n
777 return nn, nil
778 }
779
780
781
782
783
784 func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) {
785 if b.err != nil {
786 return 0, b.err
787 }
788 readerFrom, readerFromOK := b.wr.(io.ReaderFrom)
789 var m int
790 for {
791 if b.Available() == 0 {
792 if err1 := b.Flush(); err1 != nil {
793 return n, err1
794 }
795 }
796 if readerFromOK && b.Buffered() == 0 {
797 nn, err := readerFrom.ReadFrom(r)
798 b.err = err
799 n += nn
800 return n, err
801 }
802 nr := 0
803 for nr < maxConsecutiveEmptyReads {
804 m, err = r.Read(b.buf[b.n:])
805 if m != 0 || err != nil {
806 break
807 }
808 nr++
809 }
810 if nr == maxConsecutiveEmptyReads {
811 return n, io.ErrNoProgress
812 }
813 b.n += m
814 n += int64(m)
815 if err != nil {
816 break
817 }
818 }
819 if err == io.EOF {
820
821 if b.Available() == 0 {
822 err = b.Flush()
823 } else {
824 err = nil
825 }
826 }
827 return n, err
828 }
829
830
831
832
833
834 type ReadWriter struct {
835 *Reader
836 *Writer
837 }
838
839
840 func NewReadWriter(r *Reader, w *Writer) *ReadWriter {
841 return &ReadWriter{r, w}
842 }
843
View as plain text