Skip to content

Commit c5b2b88

Browse files
committed
remove Next enum
1 parent 38a6809 commit c5b2b88

File tree

1 file changed

+78
-84
lines changed

1 file changed

+78
-84
lines changed

src/gz/bufread.rs

Lines changed: 78 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -329,14 +329,9 @@ impl<'a, T: Read> Read for Buffer<'a, T> {
329329
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
330330
let mut len = self.buf.read(buf)?;
331331
if buf.len() > len {
332-
match self.reader.read(&mut buf[len..])? {
333-
// eof
334-
0 => return Err(bad_header()),
335-
len2 => {
336-
self.buf.get_mut().get_mut().extend_from_slice(&buf[len..][..len2]);
337-
len += len2;
338-
}
339-
}
332+
let len2 = self.reader.read(&mut buf[len..])?;
333+
self.buf.get_mut().get_mut().extend_from_slice(&buf[len..][..len2]);
334+
len += len2;
340335
}
341336
Ok(len)
342337
}
@@ -360,7 +355,6 @@ impl<R: BufRead> GzDecoder<R> {
360355
GzState::Body
361356
},
362357
Err(ref err) if io::ErrorKind::WouldBlock == err.kind()
363-
|| io::ErrorKind::UnexpectedEof == err.kind()
364358
=> GzState::Header(buf),
365359
Err(err) => GzState::Err(err)
366360
};
@@ -408,96 +402,96 @@ impl<R: BufRead> Read for GzDecoder<R> {
408402
fn read(&mut self, into: &mut [u8]) -> io::Result<usize> {
409403
let GzDecoder { inner, header, reader, multi } = self;
410404

411-
enum Next {
412-
None,
413-
Header,
414-
Body,
415-
Finished,
416-
Err(io::Error),
417-
End
418-
}
419-
420-
let mut next = Next::None;
421-
422405
loop {
423-
match inner {
424-
GzState::Header(buf) => {
425-
let mut reader = Buffer::new(buf, reader.get_mut().get_mut());
426-
match read_gz_header(&mut reader) {
427-
Ok(hdr) => {
428-
*header = Some(hdr);
429-
next = Next::Body;
430-
},
431-
Err(ref err) if io::ErrorKind::WouldBlock == err.kind()
432-
|| io::ErrorKind::UnexpectedEof == err.kind()
433-
=> return Err(io::ErrorKind::WouldBlock.into()),
434-
Err(err) => next = Next::Err(err)
435-
}
406+
*inner = match mem::replace(inner, GzState::End) {
407+
GzState::Header(mut buf) => {
408+
let result = {
409+
let mut reader = Buffer::new(&mut buf, reader.get_mut().get_mut());
410+
read_gz_header(&mut reader)
411+
};
412+
let hdr = result
413+
.map_err(|err| {
414+
if io::ErrorKind::WouldBlock == err.kind() {
415+
*inner = GzState::Header(buf);
416+
}
417+
418+
err
419+
})?;
420+
*header = Some(hdr);
421+
GzState::Body
436422
},
437423
GzState::Body => {
438424
if into.is_empty() {
425+
*inner = GzState::Body;
439426
return Ok(0);
440427
}
441428

442-
match reader.read(into)? {
443-
0 => next = Next::Finished,
444-
n => return Ok(n)
429+
let n = reader.read(into)
430+
.map_err(|err| {
431+
if io::ErrorKind::WouldBlock == err.kind() {
432+
*inner = GzState::Body;
433+
}
434+
435+
err
436+
})?;
437+
438+
match n {
439+
0 => GzState::Finished(0, [0; 8]),
440+
n => {
441+
*inner = GzState::Body;
442+
return Ok(n);
443+
}
445444
}
446445
},
447-
GzState::Finished(pos, buf) => if *pos < buf.len() {
448-
match reader.get_mut().get_mut().read(&mut buf[*pos..]) {
449-
Ok(0) => next = Next::Err(io::ErrorKind::UnexpectedEof.into()),
450-
Ok(n) => *pos += n,
451-
Err(err) => if io::ErrorKind::WouldBlock == err.kind() {
452-
return Err(err);
446+
GzState::Finished(pos, mut buf) => if pos < buf.len() {
447+
let n = reader.get_mut().get_mut()
448+
.read(&mut buf[pos..])
449+
.and_then(|n| if n == 0 {
450+
Err(io::ErrorKind::UnexpectedEof.into())
453451
} else {
454-
next = Next::Err(err);
455-
}
456-
}
457-
} else {
458-
let (crc, amt) = finish(buf);
459-
460-
if crc != reader.crc().sum() {
461-
next = Next::Err(corrupt());
462-
} else if amt != reader.crc().amount() {
463-
next = Next::Err(corrupt());
464-
} else if !*multi {
465-
next = Next::End;
466-
} else {
467-
match reader.get_mut().get_mut().fill_buf() {
468-
Ok(buf) => if buf.is_empty() {
469-
next = Next::End;
470-
} else {
471-
next = Next::Header;
472-
},
473-
Err(err) => if io::ErrorKind::WouldBlock == err.kind() {
474-
return Err(err);
475-
} else {
476-
next = Next::Err(err);
452+
Ok(n)
453+
})
454+
.map_err(|err| {
455+
if io::ErrorKind::WouldBlock == err.kind() {
456+
*inner = GzState::Finished(pos, buf);
477457
}
458+
459+
err
460+
})?;
461+
462+
GzState::Finished(pos + n, buf)
463+
} else {
464+
let (crc, amt) = finish(&buf);
465+
466+
if crc != reader.crc().sum() || amt != reader.crc().amount() {
467+
return Err(corrupt());
468+
} else if *multi {
469+
let is_eof = reader.get_mut().get_mut()
470+
.fill_buf()
471+
.map(|buf| buf.is_empty())
472+
.map_err(|err| {
473+
if io::ErrorKind::WouldBlock == err.kind() {
474+
*inner = GzState::Finished(pos, buf);
475+
}
476+
477+
err
478+
})?;
479+
480+
if is_eof {
481+
GzState::End
482+
} else {
483+
reader.reset();
484+
reader.get_mut().reset_data();
485+
header.take();
486+
GzState::Header(Vec::with_capacity(10))
478487
}
488+
} else {
489+
GzState::End
479490
}
480491
},
481-
GzState::Err(err) => next = Next::Err(mem::replace(err, io::ErrorKind::Other.into())),
492+
GzState::Err(err) => return Err(err),
482493
GzState::End => return Ok(0)
483-
}
484-
485-
match mem::replace(&mut next, Next::None) {
486-
Next::None => (),
487-
Next::Header => {
488-
reader.reset();
489-
reader.get_mut().reset_data();
490-
header.take();
491-
*inner = GzState::Header(Vec::new());
492-
},
493-
Next::Body => *inner = GzState::Body,
494-
Next::Finished => *inner = GzState::Finished(0, [0; 8]),
495-
Next::Err(err) => {
496-
*inner = GzState::End;
497-
return Err(err);
498-
},
499-
Next::End => *inner = GzState::End
500-
}
494+
};
501495
}
502496
}
503497
}

0 commit comments

Comments
 (0)