From: Ben Pfaff Date: Sat, 29 Jul 2023 04:37:35 +0000 (-0700) Subject: parse zlib header and trailer X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=44f02bb4a7f2fade7117e7985652c5ef34f9bc78;p=pspp parse zlib header and trailer --- diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 504d5eb3a6..49bc74ef84 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -270,13 +270,7 @@ impl State for Headers { let next_state: Box = match self.0.compression { None => Box::new(Data(self.0)), Some(Compression::Simple) => Box::new(CompressedData::new(self.0)), - Some(Compression::ZLib) => Box::new(CompressedData::new(CommonState { - reader: ZlibDecodeMultiple::new(self.0.reader), - endian: self.0.endian, - bias: self.0.bias, - compression: self.0.compression, - var_types: self.0.var_types - })), + Some(Compression::ZLib) => Box::new(ZlibHeader(self.0)), }; return Ok(Some((Record::EndOfHeaders, next_state))); } @@ -291,6 +285,34 @@ impl State for Headers { } } +struct ZlibHeader(CommonState); + +impl State for ZlibHeader { + fn read(mut self: Box) -> Result)>, Error> { + let zheader = read_zheader(&mut self.0.reader, self.0.endian)?; + Ok(Some((Record::ZHeader(zheader), self))) + } +} + +struct ZlibTrailer(CommonState, ZHeader); + +impl State for ZlibTrailer { + fn read(mut self: Box) -> Result)>, Error> { + let retval = read_ztrailer(&mut self.0.reader, self.0.endian, self.1.ztrailer_offset, self.1.ztrailer_len)?; + let next_state = Box::new(CompressedData::new(CommonState { + reader: ZlibDecodeMultiple::new(self.0.reader), + endian: self.0.endian, + bias: self.0.bias, + compression: self.0.compression, + var_types: self.0.var_types + })); + match retval { + None => next_state.read(), + Some(ztrailer) => Ok(Some((Record::ZTrailer(ztrailer), next_state))) + } + } +} + struct Data(CommonState); impl State for Data {