github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/gnovm/stdlibs/bufio/bufio.gno (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package bufio implements buffered I/O. It wraps an io.Reader or io.Writer 6 // object, creating another object (Reader or Writer) that also implements 7 // the interface but provides buffering and some help for textual I/O. 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 // Buffered input. 30 31 // Reader implements buffering for an io.Reader object. 32 type Reader struct { 33 buf []byte 34 rd io.Reader // reader provided by the client 35 r, w int // buf read and write positions 36 err error 37 lastByte int // last byte read for UnreadByte; -1 means invalid 38 lastRuneSize int // size of last rune read for UnreadRune; -1 means invalid 39 } 40 41 const ( 42 minReadBufferSize = 16 43 maxConsecutiveEmptyReads = 100 44 ) 45 46 // NewReaderSize returns a new Reader whose buffer has at least the specified 47 // size. If the argument io.Reader is already a Reader with large enough 48 // size, it returns the underlying Reader. 49 func NewReaderSize(rd io.Reader, size int) *Reader { 50 // Is it already a Reader? 51 b, ok := rd.(*Reader) 52 if ok && len(b.buf) >= size { 53 return b 54 } 55 if size < minReadBufferSize { 56 size = minReadBufferSize 57 } 58 r := new(Reader) 59 r.reset(make([]byte, size), rd) 60 return r 61 } 62 63 // NewReader returns a new Reader whose buffer has the default size. 64 func NewReader(rd io.Reader) *Reader { 65 return NewReaderSize(rd, defaultBufSize) 66 } 67 68 // Size returns the size of the underlying buffer in bytes. 69 func (b *Reader) Size() int { return len(b.buf) } 70 71 // Reset discards any buffered data, resets all state, and switches 72 // the buffered reader to read from r. 73 func (b *Reader) Reset(r io.Reader) { 74 b.reset(b.buf, r) 75 } 76 77 func (b *Reader) reset(buf []byte, r io.Reader) { 78 *b = Reader{ 79 buf: buf, 80 rd: r, 81 lastByte: -1, 82 lastRuneSize: -1, 83 } 84 } 85 86 var errNegativeRead = errors.New("bufio: reader returned negative count from Read") 87 88 // fill reads a new chunk into the buffer. 89 func (b *Reader) fill() { 90 // Slide existing data to beginning. 91 if b.r > 0 { 92 copy(b.buf, b.buf[b.r:b.w]) 93 b.w -= b.r 94 b.r = 0 95 } 96 97 if b.w >= len(b.buf) { 98 panic("bufio: tried to fill full buffer") 99 } 100 101 // Read new data: try a limited number of times. 102 for i := maxConsecutiveEmptyReads; i > 0; i-- { 103 n, err := b.rd.Read(b.buf[b.w:]) 104 if n < 0 { 105 panic(errNegativeRead) 106 } 107 b.w += n 108 if err != nil { 109 b.err = err 110 return 111 } 112 if n > 0 { 113 return 114 } 115 } 116 b.err = io.ErrNoProgress 117 } 118 119 func (b *Reader) readErr() error { 120 err := b.err 121 b.err = nil 122 return err 123 } 124 125 // Peek returns the next n bytes without advancing the reader. The bytes stop 126 // being valid at the next read call. If Peek returns fewer than n bytes, it 127 // also returns an error explaining why the read is short. The error is 128 // ErrBufferFull if n is larger than b's buffer size. 129 // 130 // Calling Peek prevents a UnreadByte or UnreadRune call from succeeding 131 // until the next read operation. 132 func (b *Reader) Peek(n int) ([]byte, error) { 133 if n < 0 { 134 return nil, ErrNegativeCount 135 } 136 137 b.lastByte = -1 138 b.lastRuneSize = -1 139 140 for b.w-b.r < n && b.w-b.r < len(b.buf) && b.err == nil { 141 b.fill() // b.w-b.r < len(b.buf) => buffer is not full 142 } 143 144 if n > len(b.buf) { 145 return b.buf[b.r:b.w], ErrBufferFull 146 } 147 148 // 0 <= n <= len(b.buf) 149 var err error 150 if avail := b.w - b.r; avail < n { 151 // not enough data in buffer 152 n = avail 153 err = b.readErr() 154 if err == nil { 155 err = ErrBufferFull 156 } 157 } 158 return b.buf[b.r : b.r+n], err 159 } 160 161 // Discard skips the next n bytes, returning the number of bytes discarded. 162 // 163 // If Discard skips fewer than n bytes, it also returns an error. 164 // If 0 <= n <= b.Buffered(), Discard is guaranteed to succeed without 165 // reading from the underlying io.Reader. 166 func (b *Reader) Discard(n int) (discarded int, err error) { 167 if n < 0 { 168 return 0, ErrNegativeCount 169 } 170 if n == 0 { 171 return 172 } 173 remain := n 174 for { 175 skip := b.Buffered() 176 if skip == 0 { 177 b.fill() 178 skip = b.Buffered() 179 } 180 if skip > remain { 181 skip = remain 182 } 183 b.r += skip 184 remain -= skip 185 if remain == 0 { 186 return n, nil 187 } 188 if b.err != nil { 189 return n - remain, b.readErr() 190 } 191 } 192 } 193 194 // Read reads data into p. 195 // It returns the number of bytes read into p. 196 // The bytes are taken from at most one Read on the underlying Reader, 197 // hence n may be less than len(p). 198 // To read exactly len(p) bytes, use io.ReadFull(b, p). 199 // At EOF, the count will be zero and err will be io.EOF. 200 func (b *Reader) Read(p []byte) (n int, err error) { 201 n = len(p) 202 if n == 0 { 203 if b.Buffered() > 0 { 204 return 0, nil 205 } 206 return 0, b.readErr() 207 } 208 if b.r == b.w { 209 if b.err != nil { 210 return 0, b.readErr() 211 } 212 if len(p) >= len(b.buf) { 213 // Large read, empty buffer. 214 // Read directly into p to avoid copy. 215 n, b.err = b.rd.Read(p) 216 if n < 0 { 217 panic(errNegativeRead) 218 } 219 if n > 0 { 220 b.lastByte = int(p[n-1]) 221 b.lastRuneSize = -1 222 } 223 return n, b.readErr() 224 } 225 // One read. 226 // Do not use b.fill, which will loop. 227 b.r = 0 228 b.w = 0 229 n, b.err = b.rd.Read(b.buf) 230 if n < 0 { 231 panic(errNegativeRead) 232 } 233 if n == 0 { 234 return 0, b.readErr() 235 } 236 b.w += n 237 } 238 239 // copy as much as we can 240 n = copy(p, b.buf[b.r:b.w]) 241 b.r += n 242 b.lastByte = int(b.buf[b.r-1]) 243 b.lastRuneSize = -1 244 return n, nil 245 } 246 247 // ReadByte reads and returns a single byte. 248 // If no byte is available, returns an error. 249 func (b *Reader) ReadByte() (byte, error) { 250 b.lastRuneSize = -1 251 for b.r == b.w { 252 if b.err != nil { 253 return 0, b.readErr() 254 } 255 b.fill() // buffer is empty 256 } 257 c := b.buf[b.r] 258 b.r++ 259 b.lastByte = int(c) 260 return c, nil 261 } 262 263 // UnreadByte unreads the last byte. Only the most recently read byte can be unread. 264 // 265 // UnreadByte returns an error if the most recent method called on the 266 // Reader was not a read operation. Notably, Peek is not considered a 267 // read operation. 268 func (b *Reader) UnreadByte() error { 269 if b.lastByte < 0 || b.r == 0 && b.w > 0 { 270 return ErrInvalidUnreadByte 271 } 272 // b.r > 0 || b.w == 0 273 if b.r > 0 { 274 b.r-- 275 } else { 276 // b.r == 0 && b.w == 0 277 b.w = 1 278 } 279 b.buf[b.r] = byte(b.lastByte) 280 b.lastByte = -1 281 b.lastRuneSize = -1 282 return nil 283 } 284 285 // ReadRune reads a single UTF-8 encoded Unicode character and returns the 286 // rune and its size in bytes. If the encoded rune is invalid, it consumes one byte 287 // and returns unicode.ReplacementChar (U+FFFD) with a size of 1. 288 func (b *Reader) ReadRune() (r rune, size int, err error) { 289 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) { 290 b.fill() // b.w-b.r < len(buf) => buffer is not full 291 } 292 b.lastRuneSize = -1 293 if b.r == b.w { 294 return 0, 0, b.readErr() 295 } 296 r, size = rune(b.buf[b.r]), 1 297 if r >= utf8.RuneSelf { 298 r, size = utf8.DecodeRune(b.buf[b.r:b.w]) 299 } 300 b.r += size 301 b.lastByte = int(b.buf[b.r-1]) 302 b.lastRuneSize = size 303 return r, size, nil 304 } 305 306 // UnreadRune unreads the last rune. If the most recent method called on 307 // the Reader was not a ReadRune, UnreadRune returns an error. (In this 308 // regard it is stricter than UnreadByte, which will unread the last byte 309 // from any read operation.) 310 func (b *Reader) UnreadRune() error { 311 if b.lastRuneSize < 0 || b.r < b.lastRuneSize { 312 return ErrInvalidUnreadRune 313 } 314 b.r -= b.lastRuneSize 315 b.lastByte = -1 316 b.lastRuneSize = -1 317 return nil 318 } 319 320 // Buffered returns the number of bytes that can be read from the current buffer. 321 func (b *Reader) Buffered() int { return b.w - b.r } 322 323 // ReadSlice reads until the first occurrence of delim in the input, 324 // returning a slice pointing at the bytes in the buffer. 325 // The bytes stop being valid at the next read. 326 // If ReadSlice encounters an error before finding a delimiter, 327 // it returns all the data in the buffer and the error itself (often io.EOF). 328 // ReadSlice fails with error ErrBufferFull if the buffer fills without a delim. 329 // Because the data returned from ReadSlice will be overwritten 330 // by the next I/O operation, most clients should use 331 // ReadBytes or ReadString instead. 332 // ReadSlice returns err != nil if and only if line does not end in delim. 333 func (b *Reader) ReadSlice(delim byte) (line []byte, err error) { 334 s := 0 // search start index 335 for { 336 // Search buffer. 337 if i := bytes.IndexByte(b.buf[b.r+s:b.w], delim); i >= 0 { 338 i += s 339 line = b.buf[b.r : b.r+i+1] 340 b.r += i + 1 341 break 342 } 343 344 // Pending error? 345 if b.err != nil { 346 line = b.buf[b.r:b.w] 347 b.r = b.w 348 err = b.readErr() 349 break 350 } 351 352 // Buffer full? 353 if b.Buffered() >= len(b.buf) { 354 b.r = b.w 355 line = b.buf 356 err = ErrBufferFull 357 break 358 } 359 360 s = b.w - b.r // do not rescan area we scanned before 361 362 b.fill() // buffer is not full 363 } 364 365 // Handle last byte, if any. 366 if i := len(line) - 1; i >= 0 { 367 b.lastByte = int(line[i]) 368 b.lastRuneSize = -1 369 } 370 371 return 372 } 373 374 // ReadLine is a low-level line-reading primitive. Most callers should use 375 // ReadBytes('\n') or ReadString('\n') instead or use a Scanner. 376 // 377 // ReadLine tries to return a single line, not including the end-of-line bytes. 378 // If the line was too long for the buffer then isPrefix is set and the 379 // beginning of the line is returned. The rest of the line will be returned 380 // from future calls. isPrefix will be false when returning the last fragment 381 // of the line. The returned buffer is only valid until the next call to 382 // ReadLine. ReadLine either returns a non-nil line or it returns an error, 383 // never both. 384 // 385 // The text returned from ReadLine does not include the line end ("\r\n" or "\n"). 386 // No indication or error is given if the input ends without a final line end. 387 // Calling UnreadByte after ReadLine will always unread the last byte read 388 // (possibly a character belonging to the line end) even if that byte is not 389 // part of the line returned by ReadLine. 390 func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) { 391 line, err = b.ReadSlice('\n') 392 if err == ErrBufferFull { 393 // Handle the case where "\r\n" straddles the buffer. 394 if len(line) > 0 && line[len(line)-1] == '\r' { 395 // Put the '\r' back on buf and drop it from line. 396 // Let the next call to ReadLine check for "\r\n". 397 if b.r == 0 { 398 // should be unreachable 399 panic("bufio: tried to rewind past start of buffer") 400 } 401 b.r-- 402 line = line[:len(line)-1] 403 } 404 return line, true, nil 405 } 406 407 if len(line) == 0 { 408 if err != nil { 409 line = nil 410 } 411 return 412 } 413 err = nil 414 415 if line[len(line)-1] == '\n' { 416 drop := 1 417 if len(line) > 1 && line[len(line)-2] == '\r' { 418 drop = 2 419 } 420 line = line[:len(line)-drop] 421 } 422 return 423 } 424 425 // collectFragments reads until the first occurrence of delim in the input. It 426 // returns (slice of full buffers, remaining bytes before delim, total number 427 // of bytes in the combined first two elements, error). 428 // The complete result is equal to 429 // `bytes.Join(append(fullBuffers, finalFragment), nil)`, which has a 430 // length of `totalLen`. The result is structured in this way to allow callers 431 // to minimize allocations and copies. 432 func (b *Reader) collectFragments(delim byte) (fullBuffers [][]byte, finalFragment []byte, totalLen int, err error) { 433 var frag []byte 434 // Use ReadSlice to look for delim, accumulating full buffers. 435 for { 436 var e error 437 frag, e = b.ReadSlice(delim) 438 if e == nil { // got final fragment 439 break 440 } 441 if e != ErrBufferFull { // unexpected error 442 err = e 443 break 444 } 445 446 // Make a copy of the buffer. 447 buf := make([]byte, len(frag)) 448 copy(buf, frag) 449 fullBuffers = append(fullBuffers, buf) 450 totalLen += len(buf) 451 } 452 453 totalLen += len(frag) 454 return fullBuffers, frag, totalLen, err 455 } 456 457 // ReadBytes reads until the first occurrence of delim in the input, 458 // returning a slice containing the data up to and including the delimiter. 459 // If ReadBytes encounters an error before finding a delimiter, 460 // it returns the data read before the error and the error itself (often io.EOF). 461 // ReadBytes returns err != nil if and only if the returned data does not end in 462 // delim. 463 // For simple uses, a Scanner may be more convenient. 464 func (b *Reader) ReadBytes(delim byte) ([]byte, error) { 465 full, frag, n, err := b.collectFragments(delim) 466 // Allocate new buffer to hold the full pieces and the fragment. 467 buf := make([]byte, n) 468 n = 0 469 // Copy full pieces and fragment in. 470 for i := range full { 471 n += copy(buf[n:], full[i]) 472 } 473 copy(buf[n:], frag) 474 return buf, err 475 } 476 477 // ReadString reads until the first occurrence of delim in the input, 478 // returning a string containing the data up to and including the delimiter. 479 // If ReadString encounters an error before finding a delimiter, 480 // it returns the data read before the error and the error itself (often io.EOF). 481 // ReadString returns err != nil if and only if the returned data does not end in 482 // delim. 483 // For simple uses, a Scanner may be more convenient. 484 func (b *Reader) ReadString(delim byte) (string, error) { 485 full, frag, n, err := b.collectFragments(delim) 486 // Allocate new buffer to hold the full pieces and the fragment. 487 var buf strings.Builder 488 buf.Grow(n) 489 // Copy full pieces and fragment in. 490 for _, fb := range full { 491 buf.Write(fb) 492 } 493 buf.Write(frag) 494 return buf.String(), err 495 } 496 497 // WriteTo implements io.WriterTo. 498 // This may make multiple calls to the Read method of the underlying Reader. 499 // If the underlying reader supports the WriteTo method, 500 // this calls the underlying WriteTo without buffering. 501 func (b *Reader) WriteTo(w io.Writer) (n int64, err error) { 502 n, err = b.writeBuf(w) 503 if err != nil { 504 return 505 } 506 507 if r, ok := b.rd.(io.WriterTo); ok { 508 m, err := r.WriteTo(w) 509 n += m 510 return n, err 511 } 512 513 if w, ok := w.(io.ReaderFrom); ok { 514 m, err := w.ReadFrom(b.rd) 515 n += m 516 return n, err 517 } 518 519 if b.w-b.r < len(b.buf) { 520 b.fill() // buffer not full 521 } 522 523 for b.r < b.w { 524 // b.r < b.w => buffer is not empty 525 m, err := b.writeBuf(w) 526 n += m 527 if err != nil { 528 return n, err 529 } 530 b.fill() // buffer is empty 531 } 532 533 if b.err == io.EOF { 534 b.err = nil 535 } 536 537 return n, b.readErr() 538 } 539 540 var errNegativeWrite = errors.New("bufio: writer returned negative count from Write") 541 542 // writeBuf writes the Reader's buffer to the writer. 543 func (b *Reader) writeBuf(w io.Writer) (int64, error) { 544 n, err := w.Write(b.buf[b.r:b.w]) 545 if n < 0 { 546 panic(errNegativeWrite) 547 } 548 b.r += n 549 return int64(n), err 550 } 551 552 // buffered output 553 554 // Writer implements buffering for an io.Writer object. 555 // If an error occurs writing to a Writer, no more data will be 556 // accepted and all subsequent writes, and Flush, will return the error. 557 // After all data has been written, the client should call the 558 // Flush method to guarantee all data has been forwarded to 559 // the underlying io.Writer. 560 type Writer struct { 561 err error 562 buf []byte 563 n int 564 wr io.Writer 565 } 566 567 // NewWriterSize returns a new Writer whose buffer has at least the specified 568 // size. If the argument io.Writer is already a Writer with large enough 569 // size, it returns the underlying Writer. 570 func NewWriterSize(w io.Writer, size int) *Writer { 571 // Is it already a Writer? 572 b, ok := w.(*Writer) 573 if ok && len(b.buf) >= size { 574 return b 575 } 576 if size <= 0 { 577 size = defaultBufSize 578 } 579 return &Writer{ 580 buf: make([]byte, size), 581 wr: w, 582 } 583 } 584 585 // NewWriter returns a new Writer whose buffer has the default size. 586 func NewWriter(w io.Writer) *Writer { 587 return NewWriterSize(w, defaultBufSize) 588 } 589 590 // Size returns the size of the underlying buffer in bytes. 591 func (b *Writer) Size() int { return len(b.buf) } 592 593 // Reset discards any unflushed buffered data, clears any error, and 594 // resets b to write its output to w. 595 func (b *Writer) Reset(w io.Writer) { 596 b.err = nil 597 b.n = 0 598 b.wr = w 599 } 600 601 // Flush writes any buffered data to the underlying io.Writer. 602 func (b *Writer) Flush() error { 603 if b.err != nil { 604 return b.err 605 } 606 if b.n == 0 { 607 return nil 608 } 609 n, err := b.wr.Write(b.buf[0:b.n]) 610 if n < b.n && err == nil { 611 err = io.ErrShortWrite 612 } 613 if err != nil { 614 if n > 0 && n < b.n { 615 copy(b.buf[0:b.n-n], b.buf[n:b.n]) 616 } 617 b.n -= n 618 b.err = err 619 return err 620 } 621 b.n = 0 622 return nil 623 } 624 625 // Available returns how many bytes are unused in the buffer. 626 func (b *Writer) Available() int { return len(b.buf) - b.n } 627 628 // Buffered returns the number of bytes that have been written into the current buffer. 629 func (b *Writer) Buffered() int { return b.n } 630 631 // Write writes the contents of p into the buffer. 632 // It returns the number of bytes written. 633 // If nn < len(p), it also returns an error explaining 634 // why the write is short. 635 func (b *Writer) Write(p []byte) (nn int, err error) { 636 for len(p) > b.Available() && b.err == nil { 637 var n int 638 if b.Buffered() == 0 { 639 // Large write, empty buffer. 640 // Write directly from p to avoid copy. 641 n, b.err = b.wr.Write(p) 642 } else { 643 n = copy(b.buf[b.n:], p) 644 b.n += n 645 b.Flush() 646 } 647 nn += n 648 p = p[n:] 649 } 650 if b.err != nil { 651 return nn, b.err 652 } 653 n := copy(b.buf[b.n:], p) 654 b.n += n 655 nn += n 656 return nn, nil 657 } 658 659 // WriteByte writes a single byte. 660 func (b *Writer) WriteByte(c byte) error { 661 if b.err != nil { 662 return b.err 663 } 664 if b.Available() <= 0 && b.Flush() != nil { 665 return b.err 666 } 667 b.buf[b.n] = c 668 b.n++ 669 return nil 670 } 671 672 // WriteRune writes a single Unicode code point, returning 673 // the number of bytes written and any error. 674 func (b *Writer) WriteRune(r rune) (size int, err error) { 675 // Compare as uint32 to correctly handle negative runes. 676 if uint32(r) < utf8.RuneSelf { 677 err = b.WriteByte(byte(r)) 678 if err != nil { 679 return 0, err 680 } 681 return 1, nil 682 } 683 if b.err != nil { 684 return 0, b.err 685 } 686 n := b.Available() 687 if n < utf8.UTFMax { 688 if b.Flush(); b.err != nil { 689 return 0, b.err 690 } 691 n = b.Available() 692 if n < utf8.UTFMax { 693 // Can only happen if buffer is silly small. 694 return b.WriteString(string(r)) 695 } 696 } 697 size = utf8.EncodeRune(b.buf[b.n:], r) 698 b.n += size 699 return size, nil 700 } 701 702 // WriteString writes a string. 703 // It returns the number of bytes written. 704 // If the count is less than len(s), it also returns an error explaining 705 // why the write is short. 706 func (b *Writer) WriteString(s string) (int, error) { 707 nn := 0 708 for len(s) > b.Available() && b.err == nil { 709 n := copy(b.buf[b.n:], s) 710 b.n += n 711 nn += n 712 s = s[n:] 713 b.Flush() 714 } 715 if b.err != nil { 716 return nn, b.err 717 } 718 n := copy(b.buf[b.n:], s) 719 b.n += n 720 nn += n 721 return nn, nil 722 } 723 724 // ReadFrom implements io.ReaderFrom. If the underlying writer 725 // supports the ReadFrom method, and b has no buffered data yet, 726 // this calls the underlying ReadFrom without buffering. 727 func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) { 728 if b.err != nil { 729 return 0, b.err 730 } 731 if b.Buffered() == 0 { 732 if w, ok := b.wr.(io.ReaderFrom); ok { 733 n, err = w.ReadFrom(r) 734 b.err = err 735 return n, err 736 } 737 } 738 var m int 739 for { 740 if b.Available() == 0 { 741 if err1 := b.Flush(); err1 != nil { 742 return n, err1 743 } 744 } 745 nr := 0 746 for nr < maxConsecutiveEmptyReads { 747 m, err = r.Read(b.buf[b.n:]) 748 if m != 0 || err != nil { 749 break 750 } 751 nr++ 752 } 753 if nr == maxConsecutiveEmptyReads { 754 return n, io.ErrNoProgress 755 } 756 b.n += m 757 n += int64(m) 758 if err != nil { 759 break 760 } 761 } 762 if err == io.EOF { 763 // If we filled the buffer exactly, flush preemptively. 764 if b.Available() == 0 { 765 err = b.Flush() 766 } else { 767 err = nil 768 } 769 } 770 return n, err 771 } 772 773 // buffered input and output 774 775 // ReadWriter stores pointers to a Reader and a Writer. 776 // It implements io.ReadWriter. 777 type ReadWriter struct { 778 *Reader 779 *Writer 780 } 781 782 // NewReadWriter allocates a new ReadWriter that dispatches to r and w. 783 func NewReadWriter(r *Reader, w *Writer) *ReadWriter { 784 return &ReadWriter{r, w} 785 }