Skip to content

Commit 0f2aa60

Browse files
bjorn3folkertdev
authored andcommitted
StreamStatus enum for BITv07_DStream_t
1 parent 01fd923 commit 0f2aa60

File tree

1 file changed

+59
-53
lines changed

1 file changed

+59
-53
lines changed

lib/legacy/zstd_v07.rs

Lines changed: 59 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,19 @@ struct FSEv07_decode_t {
9494
symbol: core::ffi::c_uchar,
9595
nbBits: core::ffi::c_uchar,
9696
}
97-
type BITv07_DStream_status = core::ffi::c_uint;
98-
const BITv07_DStream_overflow: BITv07_DStream_status = 3;
99-
const BITv07_DStream_completed: BITv07_DStream_status = 2;
100-
const BITv07_DStream_endOfBuffer: BITv07_DStream_status = 1;
101-
const BITv07_DStream_unfinished: BITv07_DStream_status = 0;
97+
98+
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
99+
enum StreamStatus {
100+
/// Fully refilled.
101+
Unfinished = 0,
102+
/// Still some bits left in the bitstream.
103+
EndOfBuffer = 1,
104+
/// Bitstream entirely consumed, bit-exact.
105+
Completed = 2,
106+
/// User requested more bits than present in bitstream.
107+
Overflow = 3,
108+
}
109+
102110
#[derive(Copy, Clone)]
103111
#[repr(C)]
104112
struct FSEv07_DTableHeader {
@@ -295,36 +303,36 @@ impl<'a> BITv07_DStream_t<'a> {
295303
value
296304
}
297305
#[inline]
298-
fn reload(&mut self) -> BITv07_DStream_status {
306+
fn reload(&mut self) -> StreamStatus {
299307
if self.bitsConsumed > usize::BITS {
300-
return BITv07_DStream_overflow;
308+
return StreamStatus::Overflow;
301309
}
302-
if self.ptr >= unsafe { (self.start).add(::core::mem::size_of::<usize>()) } {
303-
self.ptr = unsafe { (self.ptr).offset(-((self.bitsConsumed >> 3) as isize)) };
310+
if self.ptr >= unsafe { (self.start).add(size_of::<usize>()) } {
311+
self.ptr = unsafe { (self.ptr).sub(self.bitsConsumed as usize >> 3) };
304312
self.bitsConsumed &= 7;
305313
self.bitContainer = unsafe { MEM_readLEST(self.ptr as *const core::ffi::c_void) };
306-
return BITv07_DStream_unfinished;
314+
return StreamStatus::Unfinished;
307315
}
308316
if self.ptr == self.start {
309317
if self.bitsConsumed < usize::BITS {
310-
return BITv07_DStream_endOfBuffer;
318+
return StreamStatus::EndOfBuffer;
311319
}
312-
return BITv07_DStream_completed;
320+
return StreamStatus::Completed;
313321
}
314322
let mut nbBytes = self.bitsConsumed >> 3;
315-
let mut result = BITv07_DStream_unfinished;
316-
if unsafe { (self.ptr).offset(-(nbBytes as isize)) } < self.start {
323+
let mut result = StreamStatus::Unfinished;
324+
if unsafe { (self.ptr).sub(nbBytes as usize) } < self.start {
317325
nbBytes = unsafe { (self.ptr).offset_from(self.start) } as u32;
318-
result = BITv07_DStream_endOfBuffer;
326+
result = StreamStatus::EndOfBuffer;
319327
}
320-
self.ptr = unsafe { (self.ptr).offset(-(nbBytes as isize)) };
328+
self.ptr = unsafe { (self.ptr).sub(nbBytes as usize) };
321329
self.bitsConsumed = (self.bitsConsumed).wrapping_sub(nbBytes * 8);
322330
self.bitContainer = unsafe { MEM_readLEST(self.ptr as *const core::ffi::c_void) };
323331
result
324332
}
325333
#[inline]
326-
fn is_empty(&self) -> core::ffi::c_uint {
327-
(self.ptr == self.start && self.bitsConsumed == usize::BITS) as core::ffi::c_uint
334+
fn is_empty(&self) -> bool {
335+
self.ptr == self.start && self.bitsConsumed == usize::BITS
328336
}
329337
}
330338

@@ -675,7 +683,7 @@ unsafe fn FSEv07_decompress_usingDTable_generic<const N: usize>(
675683
let mut bitD = BITv07_DStream_t::new(cSrc)?;
676684
let mut state1 = FSEv07_initDState(&mut bitD, dt);
677685
let mut state2 = FSEv07_initDState(&mut bitD, dt);
678-
while bitD.reload() == BITv07_DStream_unfinished && op < olimit {
686+
while bitD.reload() == StreamStatus::Unfinished && op < olimit {
679687
*op = if fast != 0 {
680688
FSEv07_decodeSymbolFast(&mut state1, &mut bitD)
681689
} else {
@@ -690,7 +698,7 @@ unsafe fn FSEv07_decompress_usingDTable_generic<const N: usize>(
690698
FSEv07_decodeSymbol(&mut state2, &mut bitD)
691699
};
692700
if (FSEv07_MAX_TABLELOG * 4 + 7) as u32 > usize::BITS
693-
&& bitD.reload() > BITv07_DStream_unfinished
701+
&& bitD.reload() > StreamStatus::Unfinished
694702
{
695703
op = op.add(2);
696704
break;
@@ -721,7 +729,7 @@ unsafe fn FSEv07_decompress_usingDTable_generic<const N: usize>(
721729
} else {
722730
FSEv07_decodeSymbol(&mut state1, &mut bitD)
723731
};
724-
if bitD.reload() == BITv07_DStream_overflow {
732+
if bitD.reload() == StreamStatus::Overflow {
725733
let fresh8 = op;
726734
op = op.add(1);
727735
*fresh8 = if fast != 0 {
@@ -741,7 +749,7 @@ unsafe fn FSEv07_decompress_usingDTable_generic<const N: usize>(
741749
} else {
742750
FSEv07_decodeSymbol(&mut state2, &mut bitD)
743751
};
744-
if bitD.reload() != BITv07_DStream_overflow {
752+
if bitD.reload() != StreamStatus::Overflow {
745753
continue;
746754
}
747755
let fresh10 = op;
@@ -874,7 +882,7 @@ unsafe fn HUFv07_decodeStreamX2(
874882
dtLog: u32,
875883
) -> usize {
876884
let pStart = p;
877-
while bitDPtr.reload() == BITv07_DStream_unfinished && p <= pEnd.sub(4) {
885+
while bitDPtr.reload() == StreamStatus::Unfinished && p <= pEnd.sub(4) {
878886
if MEM_64bits() {
879887
let fresh12 = p;
880888
p = p.add(1);
@@ -894,7 +902,7 @@ unsafe fn HUFv07_decodeStreamX2(
894902
p = p.add(1);
895903
*fresh15 = HUFv07_decodeSymbolX2(bitDPtr, dt, dtLog);
896904
}
897-
while bitDPtr.reload() == BITv07_DStream_unfinished && p < pEnd {
905+
while bitDPtr.reload() == StreamStatus::Unfinished && p < pEnd {
898906
let fresh16 = p;
899907
p = p.add(1);
900908
*fresh16 = HUFv07_decodeSymbolX2(bitDPtr, dt, dtLog);
@@ -920,7 +928,7 @@ unsafe fn HUFv07_decompress1X2_usingDTable_internal(
920928
let dtLog = dtd.tableLog as u32;
921929
let mut bitD = BITv07_DStream_t::new(cSrc)?;
922930
HUFv07_decodeStreamX2(op, &mut bitD, oend, dt, dtLog);
923-
if bitD.is_empty() == 0 {
931+
if !bitD.is_empty() {
924932
return Err(Error::corruption_detected);
925933
}
926934
Ok(())
@@ -975,7 +983,6 @@ unsafe fn HUFv07_decompress4X2_usingDTable_internal(
975983
let mut op2 = opStart2;
976984
let mut op3 = opStart3;
977985
let mut op4 = opStart4;
978-
let mut endSignal: u32 = 0;
979986
let dtd = HUFv07_getDTableDesc(DTable);
980987
let dtLog = dtd.tableLog as u32;
981988
if length4 > cSrcSize {
@@ -985,11 +992,12 @@ unsafe fn HUFv07_decompress4X2_usingDTable_internal(
985992
let mut bitD2 = BITv07_DStream_t::new(core::slice::from_raw_parts(istart2, length2))?;
986993
let mut bitD3 = BITv07_DStream_t::new(core::slice::from_raw_parts(istart3, length3))?;
987994
let mut bitD4 = BITv07_DStream_t::new(core::slice::from_raw_parts(istart4, length4))?;
988-
endSignal = bitD1.reload() as core::ffi::c_uint
989-
| bitD2.reload() as core::ffi::c_uint
990-
| bitD3.reload() as core::ffi::c_uint
991-
| bitD4.reload() as core::ffi::c_uint;
992-
while endSignal == BITv07_DStream_unfinished as core::ffi::c_int as u32 && op4 < oend.sub(7) {
995+
let mut endSignal = true;
996+
endSignal &= bitD1.reload() == StreamStatus::Unfinished;
997+
endSignal &= bitD2.reload() == StreamStatus::Unfinished;
998+
endSignal &= bitD3.reload() == StreamStatus::Unfinished;
999+
endSignal &= bitD4.reload() == StreamStatus::Unfinished;
1000+
while endSignal && op4 < oend.sub(7) {
9931001
if MEM_64bits() {
9941002
let fresh18 = op1;
9951003
op1 = op1.add(1);
@@ -1062,10 +1070,10 @@ unsafe fn HUFv07_decompress4X2_usingDTable_internal(
10621070
let fresh33 = op4;
10631071
op4 = op4.add(1);
10641072
*fresh33 = HUFv07_decodeSymbolX2(&mut bitD4, dt, dtLog);
1065-
endSignal = bitD1.reload() as core::ffi::c_uint
1066-
| bitD2.reload() as core::ffi::c_uint
1067-
| bitD3.reload() as core::ffi::c_uint
1068-
| bitD4.reload() as core::ffi::c_uint;
1073+
endSignal &= bitD1.reload() == StreamStatus::Unfinished;
1074+
endSignal &= bitD2.reload() == StreamStatus::Unfinished;
1075+
endSignal &= bitD3.reload() == StreamStatus::Unfinished;
1076+
endSignal &= bitD4.reload() == StreamStatus::Unfinished;
10691077
}
10701078
if op1 > opStart2 {
10711079
return Err(Error::corruption_detected);
@@ -1080,8 +1088,7 @@ unsafe fn HUFv07_decompress4X2_usingDTable_internal(
10801088
HUFv07_decodeStreamX2(op2, &mut bitD2, opStart3, dt, dtLog);
10811089
HUFv07_decodeStreamX2(op3, &mut bitD3, opStart4, dt, dtLog);
10821090
HUFv07_decodeStreamX2(op4, &mut bitD4, oend, dt, dtLog);
1083-
endSignal = bitD1.is_empty() & bitD2.is_empty() & bitD3.is_empty() & bitD4.is_empty();
1084-
if endSignal == 0 {
1091+
if !(bitD1.is_empty() && bitD2.is_empty() && bitD3.is_empty() && bitD4.is_empty()) {
10851092
return Err(Error::corruption_detected);
10861093
}
10871094
Ok(dstSize)
@@ -1372,7 +1379,7 @@ unsafe fn HUFv07_decodeStreamX4(
13721379
dtLog: u32,
13731380
) -> usize {
13741381
let pStart = p;
1375-
while bitDPtr.reload() == BITv07_DStream_unfinished && p < pEnd.sub(7) {
1382+
while bitDPtr.reload() == StreamStatus::Unfinished && p < pEnd.sub(7) {
13761383
if MEM_64bits() {
13771384
p = p.offset(
13781385
HUFv07_decodeSymbolX4(p as *mut core::ffi::c_void, bitDPtr, dt, dtLog) as isize,
@@ -1392,7 +1399,7 @@ unsafe fn HUFv07_decodeStreamX4(
13921399
HUFv07_decodeSymbolX4(p as *mut core::ffi::c_void, bitDPtr, dt, dtLog) as isize,
13931400
);
13941401
}
1395-
while bitDPtr.reload() == BITv07_DStream_unfinished && p <= pEnd.sub(2) {
1402+
while bitDPtr.reload() == StreamStatus::Unfinished && p <= pEnd.sub(2) {
13961403
p = p.offset(
13971404
HUFv07_decodeSymbolX4(p as *mut core::ffi::c_void, bitDPtr, dt, dtLog) as isize,
13981405
);
@@ -1422,7 +1429,7 @@ unsafe fn HUFv07_decompress1X4_usingDTable_internal(
14221429
let dt = dtPtr as *const HUFv07_DEltX4;
14231430
let dtd = HUFv07_getDTableDesc(DTable);
14241431
HUFv07_decodeStreamX4(ostart, &mut bitD, oend, dt, dtd.tableLog as u32);
1425-
if bitD.is_empty() == 0 {
1432+
if !bitD.is_empty() {
14261433
return Err(Error::corruption_detected);
14271434
}
14281435
Ok(())
@@ -1474,7 +1481,6 @@ unsafe fn HUFv07_decompress4X4_usingDTable_internal(
14741481
let mut op2 = opStart2;
14751482
let mut op3 = opStart3;
14761483
let mut op4 = opStart4;
1477-
let mut endSignal: u32 = 0;
14781484
let dtd = HUFv07_getDTableDesc(DTable);
14791485
let dtLog = dtd.tableLog as u32;
14801486
if length4 > cSrc.len() {
@@ -1484,11 +1490,12 @@ unsafe fn HUFv07_decompress4X4_usingDTable_internal(
14841490
let mut bitD2 = BITv07_DStream_t::new(core::slice::from_raw_parts(istart2, length2))?;
14851491
let mut bitD3 = BITv07_DStream_t::new(core::slice::from_raw_parts(istart3, length3))?;
14861492
let mut bitD4 = BITv07_DStream_t::new(core::slice::from_raw_parts(istart4, length4))?;
1487-
endSignal = bitD1.reload() as core::ffi::c_uint
1488-
| bitD2.reload() as core::ffi::c_uint
1489-
| bitD3.reload() as core::ffi::c_uint
1490-
| bitD4.reload() as core::ffi::c_uint;
1491-
while endSignal == BITv07_DStream_unfinished as core::ffi::c_int as u32 && op4 < oend.sub(7) {
1493+
let mut endSignal = true;
1494+
endSignal &= bitD1.reload() == StreamStatus::Unfinished;
1495+
endSignal &= bitD2.reload() == StreamStatus::Unfinished;
1496+
endSignal &= bitD3.reload() == StreamStatus::Unfinished;
1497+
endSignal &= bitD4.reload() == StreamStatus::Unfinished;
1498+
while endSignal && op4 < oend.sub(7) {
14921499
if MEM_64bits() {
14931500
op1 = op1.offset(HUFv07_decodeSymbolX4(
14941501
op1 as *mut core::ffi::c_void,
@@ -1597,10 +1604,10 @@ unsafe fn HUFv07_decompress4X4_usingDTable_internal(
15971604
op4 = op4.offset(
15981605
HUFv07_decodeSymbolX4(op4 as *mut core::ffi::c_void, &mut bitD4, dt, dtLog) as isize,
15991606
);
1600-
endSignal = bitD1.reload() as core::ffi::c_uint
1601-
| bitD2.reload() as core::ffi::c_uint
1602-
| bitD3.reload() as core::ffi::c_uint
1603-
| bitD4.reload() as core::ffi::c_uint;
1607+
endSignal &= bitD1.reload() == StreamStatus::Unfinished;
1608+
endSignal &= bitD2.reload() == StreamStatus::Unfinished;
1609+
endSignal &= bitD3.reload() == StreamStatus::Unfinished;
1610+
endSignal &= bitD4.reload() == StreamStatus::Unfinished;
16041611
}
16051612
if op1 > opStart2 {
16061613
return Err(Error::corruption_detected);
@@ -1615,8 +1622,7 @@ unsafe fn HUFv07_decompress4X4_usingDTable_internal(
16151622
HUFv07_decodeStreamX4(op2, &mut bitD2, opStart3, dt, dtLog);
16161623
HUFv07_decodeStreamX4(op3, &mut bitD3, opStart4, dt, dtLog);
16171624
HUFv07_decodeStreamX4(op4, &mut bitD4, oend, dt, dtLog);
1618-
let endCheck = bitD1.is_empty() & bitD2.is_empty() & bitD3.is_empty() & bitD4.is_empty();
1619-
if endCheck == 0 {
1625+
if !(bitD1.is_empty() && bitD2.is_empty() && bitD3.is_empty() && bitD4.is_empty()) {
16201626
return Err(Error::corruption_detected);
16211627
}
16221628
Ok(dstSize)
@@ -2821,7 +2827,7 @@ unsafe fn ZSTDv07_decompressSequences(
28212827
prevOffset,
28222828
};
28232829

2824-
while seqState.DStream.reload() <= BITv07_DStream_completed && nbSeq != 0 {
2830+
while seqState.DStream.reload() <= StreamStatus::Completed && nbSeq != 0 {
28252831
nbSeq -= 1;
28262832
let sequence = ZSTDv07_decodeSequence(&mut seqState);
28272833
let oneSeqSize = ZSTDv07_execSequence(

0 commit comments

Comments
 (0)