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