Skip to content

Commit 1b80cbd

Browse files
authored
Merge pull request #42 from lukaslueg/byteorder_removed
Remove byteorder-dependency
2 parents 22d1090 + ec74ff4 commit 1b80cbd

File tree

9 files changed

+72
-69
lines changed

9 files changed

+72
-69
lines changed

Diff for: Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ codecov = {repository = "sile/libflate"}
1616

1717
[dependencies]
1818
adler32 = "1"
19-
byteorder = "1"
2019
crc32fast = "1"
2120
rle-decode-fast = "1.0.0"
2221
take_mut = "0.2.2"

Diff for: src/bit.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
use byteorder::LittleEndian;
2-
use byteorder::ReadBytesExt;
3-
use byteorder::WriteBytesExt;
41
use std::io;
52

63
#[derive(Debug)]
@@ -34,7 +31,7 @@ where
3431
}
3532
pub fn flush(&mut self) -> io::Result<()> {
3633
while self.end > 0 {
37-
self.inner.write_u8(self.buf as u8)?;
34+
self.inner.write_all(&[self.buf as u8])?;
3835
self.buf >>= 8;
3936
self.end = self.end.saturating_sub(8);
4037
}
@@ -44,7 +41,7 @@ where
4441
#[inline(always)]
4542
fn flush_if_needed(&mut self) -> io::Result<()> {
4643
if self.end >= 16 {
47-
self.inner.write_u16::<LittleEndian>(self.buf as u16)?;
44+
self.inner.write_all(&(self.buf as u16).to_le_bytes())?;
4845
self.end -= 16;
4946
self.buf >>= 16;
5047
}
@@ -135,7 +132,9 @@ where
135132
self.offset -= 8;
136133
self.last_read >>= 8;
137134

138-
let next = u32::from(self.inner.read_u8()?);
135+
let mut buf = [0; 1];
136+
self.inner.read_exact(&mut buf)?;
137+
let next = u32::from(buf[0]);
139138
self.last_read |= next << (32 - 8);
140139
Ok(())
141140
}

Diff for: src/deflate/decode.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use byteorder::LittleEndian;
2-
use byteorder::ReadBytesExt;
31
use rle_decode_fast::rle_decode;
42
use std::cmp;
53
use std::io;
@@ -73,8 +71,11 @@ where
7371

7472
fn read_non_compressed_block(&mut self) -> io::Result<()> {
7573
self.bit_reader.reset();
76-
let len = self.bit_reader.as_inner_mut().read_u16::<LittleEndian>()?;
77-
let nlen = self.bit_reader.as_inner_mut().read_u16::<LittleEndian>()?;
74+
let mut buf = [0; 2];
75+
self.bit_reader.as_inner_mut().read_exact(&mut buf)?;
76+
let len = u16::from_le_bytes(buf);
77+
self.bit_reader.as_inner_mut().read_exact(&mut buf)?;
78+
let nlen = u16::from_le_bytes(buf);
7879
if !len != nlen {
7980
Err(invalid_data_error!(
8081
"LEN={} is not the one's complement of NLEN={}",

Diff for: src/deflate/encode.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use byteorder::LittleEndian;
2-
use byteorder::WriteBytesExt;
31
use std::cmp;
42
use std::io;
53

@@ -357,10 +355,10 @@ impl RawBuf {
357355
writer.flush()?;
358356
writer
359357
.as_inner_mut()
360-
.write_u16::<LittleEndian>(size as u16)?;
358+
.write_all(&(size as u16).to_le_bytes())?;
361359
writer
362360
.as_inner_mut()
363-
.write_u16::<LittleEndian>(!size as u16)?;
361+
.write_all(&(!size as u16).to_le_bytes())?;
364362
writer.as_inner_mut().write_all(&self.buf[..size])?;
365363
self.buf.drain(0..size);
366364
Ok(())

Diff for: src/gzip.rs

+37-33
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,7 @@
1919
//!
2020
//! assert_eq!(decoded_data, b"Hello World!");
2121
//! ```
22-
use byteorder::LittleEndian;
23-
use byteorder::ReadBytesExt;
24-
use byteorder::WriteBytesExt;
25-
use std::ffi::CString;
26-
use std::io;
27-
use std::time;
22+
use std::{ffi::CString, io, time};
2823

2924
use checksum;
3025
use deflate;
@@ -107,17 +102,19 @@ impl Trailer {
107102
where
108103
R: io::Read,
109104
{
110-
Ok(Trailer {
111-
crc32: reader.read_u32::<LittleEndian>()?,
112-
input_size: reader.read_u32::<LittleEndian>()?,
113-
})
105+
let mut buf = [0; 4];
106+
reader.read_exact(&mut buf)?;
107+
let crc32 = u32::from_le_bytes(buf);
108+
reader.read_exact(&mut buf)?;
109+
let input_size = u32::from_le_bytes(buf);
110+
Ok(Trailer { crc32, input_size })
114111
}
115112
fn write_to<W>(&self, mut writer: W) -> io::Result<()>
116113
where
117114
W: io::Write,
118115
{
119-
writer.write_u32::<LittleEndian>(self.crc32)?;
120-
writer.write_u32::<LittleEndian>(self.input_size)?;
116+
writer.write_all(&self.crc32.to_le_bytes())?;
117+
writer.write_all(&self.input_size.to_le_bytes())?;
121118
Ok(())
122119
}
123120
}
@@ -361,11 +358,9 @@ impl Header {
361358
W: io::Write,
362359
{
363360
writer.write_all(&GZIP_ID)?;
364-
writer.write_u8(COMPRESSION_METHOD_DEFLATE)?;
365-
writer.write_u8(self.flags())?;
366-
writer.write_u32::<LittleEndian>(self.modification_time)?;
367-
writer.write_u8(self.compression_level.to_u8())?;
368-
writer.write_u8(self.os.to_u8())?;
361+
writer.write_all(&[COMPRESSION_METHOD_DEFLATE, self.flags()])?;
362+
writer.write_all(&self.modification_time.to_le_bytes())?;
363+
writer.write_all(&[self.compression_level.to_u8(), self.os.to_u8()])?;
369364
if let Some(ref x) = self.extra_field {
370365
x.write_to(&mut writer)?;
371366
}
@@ -376,7 +371,7 @@ impl Header {
376371
writer.write_all(x.as_bytes_with_nul())?;
377372
}
378373
if self.is_verified {
379-
writer.write_u16::<LittleEndian>(self.crc16())?;
374+
writer.write_all(&self.crc16().to_le_bytes())?;
380375
}
381376
Ok(())
382377
}
@@ -385,8 +380,9 @@ impl Header {
385380
R: io::Read,
386381
{
387382
let mut this = HeaderBuilder::new().finish();
388-
let mut id = [0; 2];
389-
reader.read_exact(&mut id)?;
383+
let mut buf = [0; 2 + 1 + 1 + 4 + 1 + 1];
384+
reader.read_exact(&mut buf)?;
385+
let id = &buf[0..2];
390386
if id != GZIP_ID {
391387
return Err(invalid_data_error!(
392388
"Unexpected GZIP ID: value={:?}, \
@@ -395,18 +391,19 @@ impl Header {
395391
GZIP_ID
396392
));
397393
}
398-
let compression_method = reader.read_u8()?;
394+
let compression_method = buf[2];
399395
if compression_method != COMPRESSION_METHOD_DEFLATE {
400396
return Err(invalid_data_error!(
401397
"Compression methods other than DEFLATE(8) are \
402398
unsupported: method={}",
403399
compression_method
404400
));
405401
}
406-
let flags = reader.read_u8()?;
407-
this.modification_time = reader.read_u32::<LittleEndian>()?;
408-
this.compression_level = CompressionLevel::from_u8(reader.read_u8()?);
409-
this.os = Os::from_u8(reader.read_u8()?);
402+
let flags = buf[3];
403+
this.modification_time =
404+
u32::from_le_bytes([buf[4], buf[5], buf[6], buf[7]]);
405+
this.compression_level = CompressionLevel::from_u8(buf[8]);
406+
this.os = Os::from_u8(buf[9]);
410407
if flags & F_EXTRA != 0 {
411408
this.extra_field = Some(ExtraField::read_from(&mut reader)?);
412409
}
@@ -420,7 +417,9 @@ impl Header {
420417
// so that random data from fuzzer can reach actually interesting code.
421418
// Compilation flag 'fuzzing' is automatically set by all 3 Rust fuzzers.
422419
if flags & F_HCRC != 0 && cfg!(not(fuzzing)) {
423-
let crc = reader.read_u16::<LittleEndian>()?;
420+
let mut buf = [0; 2];
421+
reader.read_exact(&mut buf)?;
422+
let crc = u16::from_le_bytes(buf);
424423
let expected = this.crc16();
425424
if crc != expected {
426425
return Err(invalid_data_error!(
@@ -442,11 +441,12 @@ where
442441
{
443442
let mut buf = Vec::new();
444443
loop {
445-
let b = reader.read_u8()?;
446-
if b == 0 {
444+
let mut cbuf = [0; 1];
445+
reader.read_exact(&mut cbuf)?;
446+
if cbuf[0] == 0 {
447447
return Ok(unsafe { CString::from_vec_unchecked(buf) });
448448
}
449-
buf.push(b);
449+
buf.push(cbuf[0]);
450450
}
451451
}
452452

@@ -462,7 +462,9 @@ impl ExtraField {
462462
R: io::Read,
463463
{
464464
let mut subfields = Vec::new();
465-
let data_size = reader.read_u16::<LittleEndian>()? as usize;
465+
let mut buf = [0; 2];
466+
reader.read_exact(&mut buf)?;
467+
let data_size = u16::from_le_bytes(buf) as usize;
466468
let mut reader = reader.take(data_size as u64);
467469
while reader.limit() > 0 {
468470
subfields.push(ExtraSubField::read_from(&mut reader)?);
@@ -477,7 +479,7 @@ impl ExtraField {
477479
if len > 0xFFFF {
478480
return Err(invalid_data_error!("extra field too long: {}", len));
479481
}
480-
writer.write_u16::<LittleEndian>(len as u16)?;
482+
writer.write_all(&(len as u16).to_le_bytes())?;
481483
for f in &self.subfields {
482484
f.write_to(&mut writer)?;
483485
}
@@ -505,7 +507,9 @@ impl ExtraSubField {
505507
};
506508

507509
reader.read_exact(&mut field.id)?;
508-
let data_size = reader.read_u16::<LittleEndian>()? as usize;
510+
let mut buf = [0; 2];
511+
reader.read_exact(&mut buf)?;
512+
let data_size = u16::from_le_bytes(buf) as usize;
509513
field.data.resize(data_size, 0);
510514
reader.read_exact(&mut field.data)?;
511515

@@ -516,7 +520,7 @@ impl ExtraSubField {
516520
W: io::Write,
517521
{
518522
writer.write_all(&self.id)?;
519-
writer.write_u16::<LittleEndian>(self.data.len() as u16)?;
523+
writer.write_all(&(self.data.len() as u16).to_le_bytes())?;
520524
writer.write_all(&self.data)?;
521525
Ok(())
522526
}

Diff for: src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! A Rust implementation of DEFLATE algorithm and related formats (ZLIB, GZIP).
22
#![warn(missing_docs)]
33
extern crate adler32;
4-
extern crate byteorder;
54
extern crate crc32fast;
65
extern crate rle_decode_fast;
76
extern crate take_mut;

Diff for: src/non_blocking/deflate/decode.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use byteorder::LittleEndian;
2-
use byteorder::ReadBytesExt;
31
use rle_decode_fast::rle_decode;
42
use std::cmp;
53
use std::io;
@@ -99,8 +97,11 @@ impl<R: Read> Read for Decoder<R> {
9997
DecoderState::ReadNonCompressedBlockLen => {
10098
let len = self.bit_reader.transaction(|r| {
10199
r.reset();
102-
let len = r.as_inner_mut().read_u16::<LittleEndian>()?;
103-
let nlen = r.as_inner_mut().read_u16::<LittleEndian>()?;
100+
let mut buf = [0; 2];
101+
r.as_inner_mut().read_exact(&mut buf)?;
102+
let len = u16::from_le_bytes(buf);
103+
r.as_inner_mut().read_exact(&mut buf)?;
104+
let nlen = u16::from_le_bytes(buf);
104105
if !len != nlen {
105106
Err(invalid_data_error!(
106107
"LEN={} is not the one's complement of NLEN={}",

Diff for: src/non_blocking/zlib.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020
//!
2121
//! assert_eq!(decoded_data, b"Hello World!");
2222
//! ```
23-
use byteorder::BigEndian;
24-
use byteorder::ReadBytesExt;
2523
use std::io::{self, Read};
2624

2725
use checksum;
@@ -128,10 +126,12 @@ impl<R: Read> Read for Decoder<R> {
128126
} else {
129127
let read_size = self.reader.read(buf)?;
130128
if read_size == 0 {
131-
let adler32 = self
132-
.reader
133-
.bit_reader_mut()
134-
.transaction(|r| r.as_inner_mut().read_u32::<BigEndian>())?;
129+
let adler32 = self.reader.bit_reader_mut().transaction(|r| {
130+
let mut buf = [0; 4];
131+
r.as_inner_mut()
132+
.read_exact(&mut buf)
133+
.and(Ok(u32::from_be_bytes(buf)))
134+
})?;
135135
self.eos = true;
136136
// checksum verification is skipped during fuzzing
137137
// so that random data from fuzzer can reach actually interesting code

Diff for: src/zlib.rs

+12-10
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@
1919
//!
2020
//! assert_eq!(decoded_data, b"Hello World!");
2121
//! ```
22-
use byteorder::BigEndian;
23-
use byteorder::ReadBytesExt;
24-
use byteorder::WriteBytesExt;
2522
use std::io;
2623

2724
use checksum;
@@ -203,8 +200,9 @@ impl Header {
203200
where
204201
R: io::Read,
205202
{
206-
let cmf = reader.read_u8()?;
207-
let flg = reader.read_u8()?;
203+
let mut buf = [0; 2];
204+
reader.read_exact(&mut buf)?;
205+
let (cmf, flg) = (buf[0], buf[1]);
208206
let check = (u16::from(cmf) << 8) + u16::from(flg);
209207
if check % 31 != 0 {
210208
return Err(invalid_data_error!(
@@ -230,7 +228,9 @@ impl Header {
230228

231229
let dict_flag = (flg & 0b100_000) != 0;
232230
if dict_flag {
233-
let dictionary_id = reader.read_u32::<BigEndian>()?;
231+
let mut buf = [0; 4];
232+
reader.read_exact(&mut buf)?;
233+
let dictionary_id = u32::from_be_bytes(buf);
234234
return Err(invalid_data_error!(
235235
"Preset dictionaries are not supported: \
236236
dictionary_id=0x{:X}",
@@ -253,8 +253,7 @@ impl Header {
253253
if check % 31 != 0 {
254254
flg += (31 - check % 31) as u8;
255255
}
256-
writer.write_u8(cmf)?;
257-
writer.write_u8(flg)?;
256+
writer.write_all(&[cmf, flg])?;
258257
Ok(())
259258
}
260259
}
@@ -354,7 +353,10 @@ where
354353
let read_size = self.reader.read(buf)?;
355354
if read_size == 0 {
356355
self.eos = true;
357-
let adler32 = self.reader.as_inner_mut().read_u32::<BigEndian>()?;
356+
let mut buf = [0; 4];
357+
self.reader.as_inner_mut().read_exact(&mut buf)?;
358+
let adler32 = u32::from_be_bytes(buf);
359+
358360
// checksum verification is skipped during fuzzing
359361
// so that random data from fuzzer can reach actually interesting code
360362
// Compilation flag 'fuzzing' is automatically set by all 3 Rust fuzzers.
@@ -582,7 +584,7 @@ where
582584
pub fn finish(self) -> Finish<W, io::Error> {
583585
let mut inner = finish_try!(self.writer.finish());
584586
match inner
585-
.write_u32::<BigEndian>(self.adler32.value())
587+
.write_all(&self.adler32.value().to_be_bytes())
586588
.and_then(|_| inner.flush())
587589
{
588590
Ok(_) => Finish::new(inner, None),

0 commit comments

Comments
 (0)