bufio.go 20 KB

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