1#[cfg(feature = "alloc")]
2use alloc::{string::String, vec::Vec};
3use core::io::BorrowedCursor;
4
5use crate::{Chain, Error, Result, Take};
6
7mod impls;
8
9pub fn default_read_exact<R: Read + ?Sized>(this: &mut R, mut buf: &mut [u8]) -> Result<()> {
11 while !buf.is_empty() {
12 match this.read(buf) {
13 Ok(0) => break,
14 Ok(n) => {
15 buf = &mut buf[n..];
16 }
17 Err(e) if e.canonicalize() == Error::Interrupted => continue,
18 Err(e) => return Err(e),
19 }
20 }
21 if !buf.is_empty() {
22 Err(Error::UnexpectedEof)
23 } else {
24 Ok(())
25 }
26}
27
28pub fn default_read_buf<F>(read: F, mut cursor: BorrowedCursor<'_, u8>) -> Result<()>
30where
31 F: FnOnce(&mut [u8]) -> Result<usize>,
32{
33 let n = read(cursor.ensure_init())?;
34 cursor.advance_checked(n);
35 Ok(())
36}
37
38pub fn default_read_buf_exact<R: Read + ?Sized>(
40 this: &mut R,
41 mut cursor: BorrowedCursor<'_, u8>,
42) -> Result<()> {
43 while cursor.capacity() > 0 {
44 let prev_written = cursor.written();
45 match this.read_buf(cursor.reborrow()) {
46 Ok(()) => {}
47 Err(e) if e.canonicalize() == Error::Interrupted => continue,
48 Err(e) => return Err(e),
49 }
50
51 if cursor.written() == prev_written {
52 return Err(Error::UnexpectedEof);
53 }
54 }
55
56 Ok(())
57}
58
59#[cfg(feature = "alloc")]
61pub fn default_read_to_end<R: Read + ?Sized>(
62 r: &mut R,
63 buf: &mut Vec<u8>,
64 size_hint: Option<usize>,
65) -> Result<usize> {
66 use core::io::BorrowedBuf;
67
68 use crate::DEFAULT_BUF_SIZE;
69
70 let start_len = buf.len();
71 let start_cap = buf.capacity();
72 let mut max_read_size = size_hint
75 .and_then(|s| {
76 s.checked_add(1024)?
77 .checked_next_multiple_of(DEFAULT_BUF_SIZE)
78 })
79 .unwrap_or(DEFAULT_BUF_SIZE);
80
81 const PROBE_SIZE: usize = 32;
82
83 fn small_probe_read<R: Read + ?Sized>(r: &mut R, buf: &mut Vec<u8>) -> Result<usize> {
84 let mut probe = [0u8; PROBE_SIZE];
85
86 loop {
87 match r.read(&mut probe) {
88 Ok(n) => {
89 buf.extend_from_slice(&probe[..n]);
92 return Ok(n);
93 }
94 Err(e) if e.canonicalize() == Error::Interrupted => continue,
95 Err(e) => return Err(e),
96 }
97 }
98 }
99
100 if (size_hint.is_none() || size_hint == Some(0)) && buf.capacity() - buf.len() < PROBE_SIZE {
101 let read = small_probe_read(r, buf)?;
102
103 if read == 0 {
104 return Ok(0);
105 }
106 }
107
108 loop {
109 if buf.len() == buf.capacity() && buf.capacity() == start_cap {
110 let read = small_probe_read(r, buf)?;
115
116 if read == 0 {
117 return Ok(buf.len() - start_len);
118 }
119 }
120
121 if buf.len() == buf.capacity() {
122 buf.try_reserve(PROBE_SIZE).map_err(|_| Error::NoMemory)?;
124 }
125
126 let mut spare = buf.spare_capacity_mut();
127 let buf_len = spare.len().min(max_read_size);
128 spare = &mut spare[..buf_len];
129 let mut read_buf: BorrowedBuf<'_, u8> = spare.into();
130
131 let mut cursor = read_buf.unfilled();
134 let result = loop {
135 match r.read_buf(cursor.reborrow()) {
136 Err(e) if e.canonicalize() == Error::Interrupted => continue,
137 res => break res,
140 }
141 };
142
143 let bytes_read = cursor.written();
144 let is_init = read_buf.is_init();
145
146 unsafe {
148 let new_len = bytes_read + buf.len();
149 buf.set_len(new_len);
150 }
151
152 result?;
154
155 if bytes_read == 0 {
156 return Ok(buf.len() - start_len);
157 }
158
159 if size_hint.is_none() {
161 if !is_init {
168 max_read_size = usize::MAX;
169 }
170 else if buf_len >= max_read_size && bytes_read == buf_len {
173 max_read_size = max_read_size.saturating_mul(2);
174 }
175 }
176 }
177}
178
179#[cfg(feature = "alloc")]
180pub(crate) unsafe fn append_to_string<F>(buf: &mut String, f: F) -> Result<usize>
181where
182 F: FnOnce(&mut Vec<u8>) -> Result<usize>,
183{
184 struct Guard<'a> {
185 buf: &'a mut Vec<u8>,
186 len: usize,
187 }
188
189 impl Drop for Guard<'_> {
190 fn drop(&mut self) {
191 unsafe {
192 self.buf.set_len(self.len);
193 }
194 }
195 }
196
197 let mut g = Guard {
198 len: buf.len(),
199 buf: unsafe { buf.as_mut_vec() },
200 };
201 let ret = f(g.buf);
202
203 let appended = unsafe { g.buf.get_unchecked(g.len..) };
205 if str::from_utf8(appended).is_err() {
206 ret.and(Err(Error::IllegalBytes))
207 } else {
208 g.len = g.buf.len();
209 ret
210 }
211}
212
213#[cfg(feature = "alloc")]
215pub fn default_read_to_string<R: Read + ?Sized>(
216 r: &mut R,
217 buf: &mut String,
218 size_hint: Option<usize>,
219) -> Result<usize> {
220 unsafe { append_to_string(buf, |b| default_read_to_end(r, b, size_hint)) }
230}
231
232pub trait Read {
236 fn read(&mut self, buf: &mut [u8]) -> Result<usize>;
239
240 fn read_exact(&mut self, buf: &mut [u8]) -> Result<()> {
242 default_read_exact(self, buf)
243 }
244
245 fn read_buf(&mut self, buf: BorrowedCursor<'_, u8>) -> Result<()> {
249 default_read_buf(|b| self.read(b), buf)
250 }
251
252 fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_, u8>) -> Result<()> {
256 default_read_buf_exact(self, cursor)
257 }
258
259 #[cfg(feature = "alloc")]
261 fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize> {
262 default_read_to_end(self, buf, None)
263 }
264
265 #[cfg(feature = "alloc")]
267 fn read_to_string(&mut self, buf: &mut String) -> Result<usize> {
268 default_read_to_string(self, buf, None)
269 }
270
271 fn by_ref(&mut self) -> &mut Self
276 where
277 Self: Sized,
278 {
279 self
280 }
281
282 fn chain<R: Read>(self, next: R) -> Chain<Self, R>
288 where
289 Self: Sized,
290 {
291 Chain::new(self, next)
292 }
293
294 fn take(self, limit: u64) -> Take<Self>
304 where
305 Self: Sized,
306 {
307 Take::new(self, limit)
308 }
309}
310
311#[cfg(feature = "alloc")]
317pub fn read_to_string<R: Read>(mut reader: R) -> Result<String> {
318 let mut buf = String::new();
319 reader.read_to_string(&mut buf)?;
320 Ok(buf)
321}
322
323pub trait BufRead: Read {
328 fn fill_buf(&mut self) -> Result<&[u8]>;
331
332 fn consume(&mut self, amount: usize);
335
336 fn has_data_left(&mut self) -> Result<bool> {
338 self.fill_buf().map(|b| !b.is_empty())
339 }
340
341 fn skip_until(&mut self, byte: u8) -> Result<usize> {
343 let mut read = 0;
344 loop {
345 let (done, used) = {
346 let available = self.fill_buf()?;
347 match memchr::memchr(byte, available) {
348 Some(i) => (true, i + 1),
349 None => (false, available.len()),
350 }
351 };
352 self.consume(used);
353 read += used;
354 if done || used == 0 {
355 return Ok(read);
356 }
357 }
358 }
359
360 #[cfg(feature = "alloc")]
362 fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> Result<usize> {
363 let mut read = 0;
364 loop {
365 let (done, used) = {
366 let available = self.fill_buf()?;
367 match memchr::memchr(byte, available) {
368 Some(i) => {
369 buf.extend_from_slice(&available[..=i]);
370 (true, i + 1)
371 }
372 None => {
373 buf.extend_from_slice(available);
374 (false, available.len())
375 }
376 }
377 };
378 self.consume(used);
379 read += used;
380 if done || used == 0 {
381 return Ok(read);
382 }
383 }
384 }
385
386 #[cfg(feature = "alloc")]
389 fn read_line(&mut self, buf: &mut String) -> Result<usize> {
390 unsafe { super::append_to_string(buf, |b| self.read_until(b'\n', b)) }
391 }
392
393 #[cfg(feature = "alloc")]
396 fn split(self, byte: u8) -> Split<Self>
397 where
398 Self: Sized,
399 {
400 Split {
401 buf: self,
402 delim: byte,
403 }
404 }
405
406 #[cfg(feature = "alloc")]
408 fn lines(self) -> Lines<Self>
409 where
410 Self: Sized,
411 {
412 Lines { buf: self }
413 }
414}
415
416#[cfg(feature = "alloc")]
424#[derive(Debug)]
425pub struct Split<B> {
426 buf: B,
427 delim: u8,
428}
429
430#[cfg(feature = "alloc")]
431impl<B: BufRead> Iterator for Split<B> {
432 type Item = Result<Vec<u8>>;
433
434 fn next(&mut self) -> Option<Result<Vec<u8>>> {
435 let mut buf = Vec::new();
436 match self.buf.read_until(self.delim, &mut buf) {
437 Ok(0) => None,
438 Ok(_n) => {
439 if buf[buf.len() - 1] == self.delim {
440 buf.pop();
441 }
442 Some(Ok(buf))
443 }
444 Err(e) => Some(Err(e)),
445 }
446 }
447}
448
449#[cfg(feature = "alloc")]
456#[derive(Debug)]
457pub struct Lines<B> {
458 buf: B,
459}
460
461#[cfg(feature = "alloc")]
462impl<B: BufRead> Iterator for Lines<B> {
463 type Item = Result<String>;
464
465 fn next(&mut self) -> Option<Result<String>> {
466 let mut buf = String::new();
467 match self.buf.read_line(&mut buf) {
468 Ok(0) => None,
469 Ok(_n) => {
470 if buf.ends_with('\n') {
471 buf.pop();
472 if buf.ends_with('\r') {
473 buf.pop();
474 }
475 }
476 Some(Ok(buf))
477 }
478 Err(e) => Some(Err(e)),
479 }
480 }
481}
482
483#[cfg(test)]
484mod tests {
485 use super::*;
486
487 #[test]
488 fn read_default_read_exact_with_interrupt_hold() {
489 use crate::{Error, Read, default_read_exact};
490
491 struct InterruptReader {
493 calls: usize,
494 }
495 impl Read for InterruptReader {
496 fn read(&mut self, buf: &mut [u8]) -> crate::Result<usize> {
497 self.calls += 1;
498 if self.calls <= 2 {
499 return Err(Error::Interrupted);
500 }
501 buf[0] = 42;
502 Ok(1)
503 }
504 }
505
506 let mut reader = InterruptReader { calls: 0 };
507 let mut buf = [0u8; 1];
508 let result = default_read_exact(&mut reader, &mut buf);
509 assert!(result.is_ok());
510 assert_eq!(buf[0], 42);
511 }
512
513 #[test]
514 fn read_take_struct_and_methods_hold() {
515 use crate::{Read, Take};
516
517 struct ExactReader;
519 impl Read for ExactReader {
520 fn read(&mut self, buf: &mut [u8]) -> crate::Result<usize> {
521 for byte in buf.iter_mut() {
523 *byte = 0xAB;
524 }
525 Ok(buf.len())
526 }
527 }
528
529 let reader = ExactReader;
530 let mut take = Take::new(reader, 5);
531
532 assert_eq!(take.limit(), 5);
534
535 let mut buf = [0u8; 3];
537 let n = take.read(&mut buf).unwrap();
538 assert_eq!(n, 3);
539 assert_eq!(take.limit(), 2);
540 }
541
542 #[test]
543 fn read_default_read_exact_eof_hold() {
544 use crate::Read;
545
546 struct EofReader;
548 impl Read for EofReader {
549 fn read(&mut self, _buf: &mut [u8]) -> crate::Result<usize> {
550 Ok(0)
551 }
552 }
553
554 let mut reader = EofReader;
555 let mut buf = [0u8; 10];
556 let result = default_read_exact(&mut reader, &mut buf);
557 assert!(result.is_err());
558 }
559
560 #[test]
561 fn read_by_ref_and_chain_hold() {
562 use crate::{Chain, Read};
563
564 struct FirstReader {
565 data: [u8; 4],
566 pos: usize,
567 }
568 impl Read for FirstReader {
569 fn read(&mut self, buf: &mut [u8]) -> crate::Result<usize> {
570 let remaining = self.data.len() - self.pos;
571 let to_copy = remaining.min(buf.len());
572 if to_copy == 0 {
573 return Ok(0);
574 }
575 buf[..to_copy].copy_from_slice(&self.data[self.pos..self.pos + to_copy]);
576 self.pos += to_copy;
577 Ok(to_copy)
578 }
579 }
580
581 struct SecondReader {
582 data: [u8; 3],
583 pos: usize,
584 }
585 impl Read for SecondReader {
586 fn read(&mut self, buf: &mut [u8]) -> crate::Result<usize> {
587 let remaining = self.data.len() - self.pos;
588 let to_copy = remaining.min(buf.len());
589 if to_copy == 0 {
590 return Ok(0);
591 }
592 buf[..to_copy].copy_from_slice(&self.data[self.pos..self.pos + to_copy]);
593 self.pos += to_copy;
594 Ok(to_copy)
595 }
596 }
597
598 let mut first = FirstReader {
600 data: [1, 2, 3, 4],
601 pos: 0,
602 };
603 let _ref = first.by_ref();
604 let mut buf = [0u8; 2];
605 let n = first.read(&mut buf).unwrap();
606 assert_eq!(n, 2);
607 assert_eq!(buf[0], 1);
608 assert_eq!(buf[1], 2);
609
610 let first = FirstReader {
612 data: [1, 2, 3, 4],
613 pos: 0,
614 };
615 let second = SecondReader {
616 data: [5, 6, 7],
617 pos: 0,
618 };
619 let mut chained = Chain::new(first, second);
620 let mut buf = [0u8; 10];
621
622 let n1 = chained.read(&mut buf).unwrap();
624 assert_eq!(n1, 4); let n2 = chained.read(&mut buf[4..]).unwrap();
628 assert_eq!(n2, 3); assert_eq!(buf[..7], [1, 2, 3, 4, 5, 6, 7]);
631 }
632
633 #[test]
634 fn read_take_exhaustion_and_limit_hold() {
635 use crate::{Read, Take};
636
637 struct FixedReader {
638 data: [u8; 10],
639 pos: usize,
640 }
641 impl Read for FixedReader {
642 fn read(&mut self, buf: &mut [u8]) -> crate::Result<usize> {
643 let remaining = self.data.len() - self.pos;
644 let to_copy = remaining.min(buf.len());
645 if to_copy == 0 {
646 return Ok(0);
647 }
648 buf[..to_copy].copy_from_slice(&self.data[self.pos..self.pos + to_copy]);
649 self.pos += to_copy;
650 Ok(to_copy)
651 }
652 }
653
654 let reader = FixedReader {
655 data: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
656 pos: 0,
657 };
658 let mut take = Take::new(reader, 3);
659
660 let mut buf = [0u8; 5];
662 let n = take.read(&mut buf).unwrap();
663 assert_eq!(n, 3);
664 assert_eq!(take.limit(), 0);
665 assert_eq!(buf[..3], [0, 1, 2]);
666
667 let n2 = take.read(&mut buf).unwrap();
669 assert_eq!(n2, 0);
670 }
671
672 #[test]
673 fn read_bufread_has_data_left_and_skip_until_hold() {
674 use crate::{BufRead, Read};
675
676 struct BufferedReader {
677 data: [u8; 6],
678 pos: usize,
679 }
680 impl Read for BufferedReader {
681 fn read(&mut self, buf: &mut [u8]) -> crate::Result<usize> {
682 let remaining = self.data.len() - self.pos;
683 let to_copy = remaining.min(buf.len());
684 if to_copy == 0 {
685 return Ok(0);
686 }
687 buf[..to_copy].copy_from_slice(&self.data[self.pos..self.pos + to_copy]);
688 self.pos += to_copy;
689 Ok(to_copy)
690 }
691 }
692 impl BufRead for BufferedReader {
693 fn fill_buf(&mut self) -> crate::Result<&[u8]> {
694 if self.pos < self.data.len() {
695 Ok(&self.data[self.pos..])
696 } else {
697 Ok(&[])
698 }
699 }
700 fn consume(&mut self, amount: usize) {
701 self.pos += amount;
702 }
703 }
704
705 let mut reader = BufferedReader {
707 data: [1, 2, 3, 4, 5, 6],
708 pos: 0,
709 };
710 assert!(reader.has_data_left().unwrap());
711
712 reader.consume(6);
714 assert!(!reader.has_data_left().unwrap());
715
716 let mut reader2 = BufferedReader {
718 data: [1, 2, 0xFF, 4, 5, 6],
719 pos: 0,
720 };
721 let skipped = reader2.skip_until(0xFF).unwrap();
722 assert_eq!(skipped, 3); }
724}