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 = rune(b.buf[b.r]), 1
315 if r >= utf8.RuneSelf {
316 r, size = utf8.DecodeRune(b.buf[b.r:b.w])
317 }
318 b.r += size
319 b.lastByte = int(b.buf[b.r-1])
320 b.lastRuneSize = size
321 return r, size, nil
322 }
323
324
325
326
327
328 func (b *Reader) UnreadRune() error {
329 if b.lastRuneSize < 0 || b.r < b.lastRuneSize {
330 return ErrInvalidUnreadRune
331 }
332 b.r -= b.lastRuneSize
333 b.lastByte = -1
334 b.lastRuneSize = -1
335 return nil
336 }
337
338
339 func (b *Reader) Buffered() int { return b.w - b.r }
340
341
342
343
344
345
346
347
348
349
350
351 func (b *Reader) ReadSlice(delim byte) (line []byte, err error) {
352 s := 0
353 for {
354
355 if i := bytes.IndexByte(b.buf[b.r+s:b.w], delim); i >= 0 {
356 i += s
357 line = b.buf[b.r : b.r+i+1]
358 b.r += i + 1
359 break
360 }
361
362
363 if b.err != nil {
364 line = b.buf[b.r:b.w]
365 b.r = b.w
366 err = b.readErr()
367 break
368 }
369
370
371 if b.Buffered() >= len(b.buf) {
372 b.r = b.w
373 line = b.buf
374 err = ErrBufferFull
375 break
376 }
377
378 s = b.w - b.r
379
380 b.fill()
381 }
382
383
384 if i := len(line) - 1; i >= 0 {
385 b.lastByte = int(line[i])
386 b.lastRuneSize = -1
387 }
388
389 return
390 }
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408 func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) {
409 line, err = b.ReadSlice('\n')
410 if err == ErrBufferFull {
411
412 if len(line) > 0 && line[len(line)-1] == '\r' {
413
414
415 if b.r == 0 {
416
417 panic("bufio: tried to rewind past start of buffer")
418 }
419 b.r--
420 line = line[:len(line)-1]
421 }
422 return line, true, nil
423 }
424
425 if len(line) == 0 {
426 if err != nil {
427 line = nil
428 }
429 return
430 }
431 err = nil
432
433 if line[len(line)-1] == '\n' {
434 drop := 1
435 if len(line) > 1 && line[len(line)-2] == '\r' {
436 drop = 2
437 }
438 line = line[:len(line)-drop]
439 }
440 return
441 }
442
443
444
445
446
447
448
449
450 func (b *Reader) collectFragments(delim byte) (fullBuffers [][]byte, finalFragment []byte, totalLen int, err error) {
451 var frag []byte
452
453 for {
454 var e error
455 frag, e = b.ReadSlice(delim)
456 if e == nil {
457 break
458 }
459 if e != ErrBufferFull {
460 err = e
461 break
462 }
463
464
465 buf := bytes.Clone(frag)
466 fullBuffers = append(fullBuffers, buf)
467 totalLen += len(buf)
468 }
469
470 totalLen += len(frag)
471 return fullBuffers, frag, totalLen, err
472 }
473
474
475
476
477
478
479
480
481 func (b *Reader) ReadBytes(delim byte) ([]byte, error) {
482 full, frag, n, err := b.collectFragments(delim)
483
484 buf := make([]byte, n)
485 n = 0
486
487 for i := range full {
488 n += copy(buf[n:], full[i])
489 }
490 copy(buf[n:], frag)
491 return buf, err
492 }
493
494
495
496
497
498
499
500
501 func (b *Reader) ReadString(delim byte) (string, error) {
502 full, frag, n, err := b.collectFragments(delim)
503
504 var buf strings.Builder
505 buf.Grow(n)
506
507 for _, fb := range full {
508 buf.Write(fb)
509 }
510 buf.Write(frag)
511 return buf.String(), err
512 }
513
514
515
516
517
518 func (b *Reader) WriteTo(w io.Writer) (n int64, err error) {
519 b.lastByte = -1
520 b.lastRuneSize = -1
521
522 n, err = b.writeBuf(w)
523 if err != nil {
524 return
525 }
526
527 if r, ok := b.rd.(io.WriterTo); ok {
528 m, err := r.WriteTo(w)
529 n += m
530 return n, err
531 }
532
533 if w, ok := w.(io.ReaderFrom); ok {
534 m, err := w.ReadFrom(b.rd)
535 n += m
536 return n, err
537 }
538
539 if b.w-b.r < len(b.buf) {
540 b.fill()
541 }
542
543 for b.r < b.w {
544
545 m, err := b.writeBuf(w)
546 n += m
547 if err != nil {
548 return n, err
549 }
550 b.fill()
551 }
552
553 if b.err == io.EOF {
554 b.err = nil
555 }
556
557 return n, b.readErr()
558 }
559
560 var errNegativeWrite = errors.New("bufio: writer returned negative count from Write")
561
562
563 func (b *Reader) writeBuf(w io.Writer) (int64, error) {
564 n, err := w.Write(b.buf[b.r:b.w])
565 if n < 0 {
566 panic(errNegativeWrite)
567 }
568 b.r += n
569 return int64(n), err
570 }
571
572
573
574
575
576
577
578
579
580 type Writer struct {
581 err error
582 buf []byte
583 n int
584 wr io.Writer
585 }
586
587
588
589
590 func NewWriterSize(w io.Writer, size int) *Writer {
591
592 b, ok := w.(*Writer)
593 if ok && len(b.buf) >= size {
594 return b
595 }
596 if size <= 0 {
597 size = defaultBufSize
598 }
599 return &Writer{
600 buf: make([]byte, size),
601 wr: w,
602 }
603 }
604
605
606
607
608 func NewWriter(w io.Writer) *Writer {
609 return NewWriterSize(w, defaultBufSize)
610 }
611
612
613 func (b *Writer) Size() int { return len(b.buf) }
614
615
616
617
618
619
620 func (b *Writer) Reset(w io.Writer) {
621
622
623
624 if b == w {
625 return
626 }
627 if b.buf == nil {
628 b.buf = make([]byte, defaultBufSize)
629 }
630 b.err = nil
631 b.n = 0
632 b.wr = w
633 }
634
635
636 func (b *Writer) Flush() error {
637 if b.err != nil {
638 return b.err
639 }
640 if b.n == 0 {
641 return nil
642 }
643 n, err := b.wr.Write(b.buf[0:b.n])
644 if n < b.n && err == nil {
645 err = io.ErrShortWrite
646 }
647 if err != nil {
648 if n > 0 && n < b.n {
649 copy(b.buf[0:b.n-n], b.buf[n:b.n])
650 }
651 b.n -= n
652 b.err = err
653 return err
654 }
655 b.n = 0
656 return nil
657 }
658
659
660 func (b *Writer) Available() int { return len(b.buf) - b.n }
661
662
663
664
665
666 func (b *Writer) AvailableBuffer() []byte {
667 return b.buf[b.n:][:0]
668 }
669
670
671 func (b *Writer) Buffered() int { return b.n }
672
673
674
675
676
677 func (b *Writer) Write(p []byte) (nn int, err error) {
678 for len(p) > b.Available() && b.err == nil {
679 var n int
680 if b.Buffered() == 0 {
681
682
683 n, b.err = b.wr.Write(p)
684 } else {
685 n = copy(b.buf[b.n:], p)
686 b.n += n
687 b.Flush()
688 }
689 nn += n
690 p = p[n:]
691 }
692 if b.err != nil {
693 return nn, b.err
694 }
695 n := copy(b.buf[b.n:], p)
696 b.n += n
697 nn += n
698 return nn, nil
699 }
700
701
702 func (b *Writer) WriteByte(c byte) error {
703 if b.err != nil {
704 return b.err
705 }
706 if b.Available() <= 0 && b.Flush() != nil {
707 return b.err
708 }
709 b.buf[b.n] = c
710 b.n++
711 return nil
712 }
713
714
715
716 func (b *Writer) WriteRune(r rune) (size int, err error) {
717
718 if uint32(r) < utf8.RuneSelf {
719 err = b.WriteByte(byte(r))
720 if err != nil {
721 return 0, err
722 }
723 return 1, nil
724 }
725 if b.err != nil {
726 return 0, b.err
727 }
728 n := b.Available()
729 if n < utf8.UTFMax {
730 if b.Flush(); b.err != nil {
731 return 0, b.err
732 }
733 n = b.Available()
734 if n < utf8.UTFMax {
735
736 return b.WriteString(string(r))
737 }
738 }
739 size = utf8.EncodeRune(b.buf[b.n:], r)
740 b.n += size
741 return size, nil
742 }
743
744
745
746
747
748 func (b *Writer) WriteString(s string) (int, error) {
749 var sw io.StringWriter
750 tryStringWriter := true
751
752 nn := 0
753 for len(s) > b.Available() && b.err == nil {
754 var n int
755 if b.Buffered() == 0 && sw == nil && tryStringWriter {
756
757 sw, tryStringWriter = b.wr.(io.StringWriter)
758 }
759 if b.Buffered() == 0 && tryStringWriter {
760
761
762
763 n, b.err = sw.WriteString(s)
764 } else {
765 n = copy(b.buf[b.n:], s)
766 b.n += n
767 b.Flush()
768 }
769 nn += n
770 s = s[n:]
771 }
772 if b.err != nil {
773 return nn, b.err
774 }
775 n := copy(b.buf[b.n:], s)
776 b.n += n
777 nn += n
778 return nn, nil
779 }
780
781
782
783
784
785 func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) {
786 if b.err != nil {
787 return 0, b.err
788 }
789 readerFrom, readerFromOK := b.wr.(io.ReaderFrom)
790 var m int
791 for {
792 if b.Available() == 0 {
793 if err1 := b.Flush(); err1 != nil {
794 return n, err1
795 }
796 }
797 if readerFromOK && b.Buffered() == 0 {
798 nn, err := readerFrom.ReadFrom(r)
799 b.err = err
800 n += nn
801 return n, err
802 }
803 nr := 0
804 for nr < maxConsecutiveEmptyReads {
805 m, err = r.Read(b.buf[b.n:])
806 if m != 0 || err != nil {
807 break
808 }
809 nr++
810 }
811 if nr == maxConsecutiveEmptyReads {
812 return n, io.ErrNoProgress
813 }
814 b.n += m
815 n += int64(m)
816 if err != nil {
817 break
818 }
819 }
820 if err == io.EOF {
821
822 if b.Available() == 0 {
823 err = b.Flush()
824 } else {
825 err = nil
826 }
827 }
828 return n, err
829 }
830
831
832
833
834
835 type ReadWriter struct {
836 *Reader
837 *Writer
838 }
839
840
841 func NewReadWriter(r *Reader, w *Writer) *ReadWriter {
842 return &ReadWriter{r, w}
843 }
844
View as plain text