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
33
34
35 type Reader struct {
36 buf []byte
37 rd io.Reader
38 r, w int
39 err error
40 lastByte int
41 lastRuneSize int
42 }
43
44 const minReadBufferSize = 16
45 const maxConsecutiveEmptyReads = 100
46
47
48
49
50 func NewReaderSize(rd io.Reader, size int) *Reader {
51
52 b, ok := rd.(*Reader)
53 if ok && len(b.buf) >= size {
54 return b
55 }
56 r := new(Reader)
57 r.reset(make([]byte, max(size, minReadBufferSize)), 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
143 func (b *Reader) Peek(n int) ([]byte, error) {
144 if n < 0 {
145 return nil, ErrNegativeCount
146 }
147
148 b.lastByte = -1
149 b.lastRuneSize = -1
150
151 for b.w-b.r < n && b.w-b.r < len(b.buf) && b.err == nil {
152 b.fill()
153 }
154
155 if n > len(b.buf) {
156 return b.buf[b.r:b.w], ErrBufferFull
157 }
158
159
160 var err error
161 if avail := b.w - b.r; avail < n {
162
163 n = avail
164 err = b.readErr()
165 if err == nil {
166 err = ErrBufferFull
167 }
168 }
169 return b.buf[b.r : b.r+n], err
170 }
171
172
173
174
175
176
177 func (b *Reader) Discard(n int) (discarded int, err error) {
178 if n < 0 {
179 return 0, ErrNegativeCount
180 }
181 if n == 0 {
182 return
183 }
184
185 b.lastByte = -1
186 b.lastRuneSize = -1
187
188 remain := n
189 for {
190 skip := b.Buffered()
191 if skip == 0 {
192 b.fill()
193 skip = b.Buffered()
194 }
195 if skip > remain {
196 skip = remain
197 }
198 b.r += skip
199 remain -= skip
200 if remain == 0 {
201 return n, nil
202 }
203 if b.err != nil {
204 return n - remain, b.readErr()
205 }
206 }
207 }
208
209
210
211
212
213
214
215
216 func (b *Reader) Read(p []byte) (n int, err error) {
217 n = len(p)
218 if n == 0 {
219 if b.Buffered() > 0 {
220 return 0, nil
221 }
222 return 0, b.readErr()
223 }
224 if b.r == b.w {
225 if b.err != nil {
226 return 0, b.readErr()
227 }
228 if len(p) >= len(b.buf) {
229
230
231 n, b.err = b.rd.Read(p)
232 if n < 0 {
233 panic(errNegativeRead)
234 }
235 if n > 0 {
236 b.lastByte = int(p[n-1])
237 b.lastRuneSize = -1
238 }
239 return n, b.readErr()
240 }
241
242
243 b.r = 0
244 b.w = 0
245 n, b.err = b.rd.Read(b.buf)
246 if n < 0 {
247 panic(errNegativeRead)
248 }
249 if n == 0 {
250 return 0, b.readErr()
251 }
252 b.w += n
253 }
254
255
256
257
258 n = copy(p, b.buf[b.r:b.w])
259 b.r += n
260 b.lastByte = int(b.buf[b.r-1])
261 b.lastRuneSize = -1
262 return n, nil
263 }
264
265
266
267 func (b *Reader) ReadByte() (byte, error) {
268 b.lastRuneSize = -1
269 for b.r == b.w {
270 if b.err != nil {
271 return 0, b.readErr()
272 }
273 b.fill()
274 }
275 c := b.buf[b.r]
276 b.r++
277 b.lastByte = int(c)
278 return c, nil
279 }
280
281
282
283
284
285
286 func (b *Reader) UnreadByte() error {
287 if b.lastByte < 0 || b.r == 0 && b.w > 0 {
288 return ErrInvalidUnreadByte
289 }
290
291 if b.r > 0 {
292 b.r--
293 } else {
294
295 b.w = 1
296 }
297 b.buf[b.r] = byte(b.lastByte)
298 b.lastByte = -1
299 b.lastRuneSize = -1
300 return nil
301 }
302
303
304
305
306 func (b *Reader) ReadRune() (r rune, size int, err error) {
307 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) {
308 b.fill()
309 }
310 b.lastRuneSize = -1
311 if b.r == b.w {
312 return 0, 0, b.readErr()
313 }
314 r, size = utf8.DecodeRune(b.buf[b.r:b.w])
315 b.r += size
316 b.lastByte = int(b.buf[b.r-1])
317 b.lastRuneSize = size
318 return r, size, nil
319 }
320
321
322
323
324
325 func (b *Reader) UnreadRune() error {
326 if b.lastRuneSize < 0 || b.r < b.lastRuneSize {
327 return ErrInvalidUnreadRune
328 }
329 b.r -= b.lastRuneSize
330 b.lastByte = -1
331 b.lastRuneSize = -1
332 return nil
333 }
334
335
336 func (b *Reader) Buffered() int { return b.w - b.r }
337
338
339
340
341
342
343
344
345
346
347
348 func (b *Reader) ReadSlice(delim byte) (line []byte, err error) {
349 s := 0
350 for {
351
352 if i := bytes.IndexByte(b.buf[b.r+s:b.w], delim); i >= 0 {
353 i += s
354 line = b.buf[b.r : b.r+i+1]
355 b.r += i + 1
356 break
357 }
358
359
360 if b.err != nil {
361 line = b.buf[b.r:b.w]
362 b.r = b.w
363 err = b.readErr()
364 break
365 }
366
367
368 if b.Buffered() >= len(b.buf) {
369 b.r = b.w
370 line = b.buf
371 err = ErrBufferFull
372 break
373 }
374
375 s = b.w - b.r
376
377 b.fill()
378 }
379
380
381 if i := len(line) - 1; i >= 0 {
382 b.lastByte = int(line[i])
383 b.lastRuneSize = -1
384 }
385
386 return
387 }
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405 func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) {
406 line, err = b.ReadSlice('\n')
407 if err == ErrBufferFull {
408
409 if len(line) > 0 && line[len(line)-1] == '\r' {
410
411
412 if b.r == 0 {
413
414 panic("bufio: tried to rewind past start of buffer")
415 }
416 b.r--
417 line = line[:len(line)-1]
418 }
419 return line, true, nil
420 }
421
422 if len(line) == 0 {
423 if err != nil {
424 line = nil
425 }
426 return
427 }
428 err = nil
429
430 if line[len(line)-1] == '\n' {
431 drop := 1
432 if len(line) > 1 && line[len(line)-2] == '\r' {
433 drop = 2
434 }
435 line = line[:len(line)-drop]
436 }
437 return
438 }
439
440
441
442
443
444
445
446
447 func (b *Reader) collectFragments(delim byte) (fullBuffers [][]byte, finalFragment []byte, totalLen int, err error) {
448 var frag []byte
449
450 for {
451 var e error
452 frag, e = b.ReadSlice(delim)
453 if e == nil {
454 break
455 }
456 if e != ErrBufferFull {
457 err = e
458 break
459 }
460
461
462 buf := bytes.Clone(frag)
463 fullBuffers = append(fullBuffers, buf)
464 totalLen += len(buf)
465 }
466
467 totalLen += len(frag)
468 return fullBuffers, frag, totalLen, err
469 }
470
471
472
473
474
475
476
477
478 func (b *Reader) ReadBytes(delim byte) ([]byte, error) {
479 full, frag, n, err := b.collectFragments(delim)
480
481 buf := make([]byte, n)
482 n = 0
483
484 for i := range full {
485 n += copy(buf[n:], full[i])
486 }
487 copy(buf[n:], frag)
488 return buf, err
489 }
490
491
492
493
494
495
496
497
498 func (b *Reader) ReadString(delim byte) (string, error) {
499 full, frag, n, err := b.collectFragments(delim)
500
501 var buf strings.Builder
502 buf.Grow(n)
503
504 for _, fb := range full {
505 buf.Write(fb)
506 }
507 buf.Write(frag)
508 return buf.String(), err
509 }
510
511
512
513
514
515 func (b *Reader) WriteTo(w io.Writer) (n int64, err error) {
516 b.lastByte = -1
517 b.lastRuneSize = -1
518
519 if b.r < b.w {
520 n, err = b.writeBuf(w)
521 if err != nil {
522 return
523 }
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