From ad7ee771d541448b90b8ebaf5190b098bde783f7 Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Wed, 13 May 2026 12:27:24 +0200 Subject: [PATCH 1/4] use polyfil `cfg_select!` --- c2rust-lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/c2rust-lib.rs b/c2rust-lib.rs index 584a2c61..da55ef8e 100644 --- a/c2rust-lib.rs +++ b/c2rust-lib.rs @@ -184,7 +184,7 @@ pub mod internal { }; } -cfg_select!( +crate::lib::polyfill::cfg_select!( feature = "custom-prefix" => { #[cfg(feature = "export-symbols")] macro_rules! prefix { From 674d5e5bd60c45390ed2b3a7f6df2fe74d7e6320 Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Fri, 8 May 2026 16:02:56 +0200 Subject: [PATCH 2/4] `BIT_CStream_t` functions: pass `&mut BIT_CStream_t` instead of `*mut BIT_CStream_t` --- lib/common/bitstream.rs | 59 ++++++++++++++++++------------------ lib/common/fse.rs | 4 +-- lib/compress/fse_compress.rs | 2 +- 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/lib/common/bitstream.rs b/lib/common/bitstream.rs index d1a47677..debe1047 100644 --- a/lib/common/bitstream.rs +++ b/lib/common/bitstream.rs @@ -20,15 +20,15 @@ pub(crate) struct BIT_CStream_t { #[inline] pub(crate) unsafe fn BIT_initCStream( - bitC: *mut BIT_CStream_t, + bitC: &mut BIT_CStream_t, startPtr: *mut core::ffi::c_void, dstCapacity: size_t, ) -> size_t { - (*bitC).bitContainer = 0; - (*bitC).bitPos = 0; - (*bitC).startPtr = startPtr as *mut core::ffi::c_char; - (*bitC).ptr = (*bitC).startPtr; - (*bitC).endPtr = ((*bitC).startPtr) + bitC.bitContainer = 0; + bitC.bitPos = 0; + bitC.startPtr = startPtr as *mut core::ffi::c_char; + bitC.ptr = bitC.startPtr; + bitC.endPtr = (bitC.startPtr) .add(dstCapacity) .offset(-(::core::mem::size_of::() as core::ffi::c_ulong as isize)); if dstCapacity <= ::core::mem::size_of::() { @@ -50,54 +50,53 @@ unsafe fn BIT_getLowerBits(bitContainer: BitContainerType, nbBits: u32) -> BitCo #[inline] pub(crate) unsafe fn BIT_addBits( - bitC: *mut BIT_CStream_t, + bitC: &mut BIT_CStream_t, value: BitContainerType, nbBits: core::ffi::c_uint, ) { - (*bitC).bitContainer |= BIT_getLowerBits(value, nbBits) << (*bitC).bitPos; - (*bitC).bitPos = ((*bitC).bitPos).wrapping_add(nbBits); + bitC.bitContainer |= BIT_getLowerBits(value, nbBits) << bitC.bitPos; + bitC.bitPos = bitC.bitPos.wrapping_add(nbBits); } #[inline] unsafe fn BIT_addBitsFast( - bitC: *mut BIT_CStream_t, + bitC: &mut BIT_CStream_t, value: BitContainerType, nbBits: core::ffi::c_uint, ) { - (*bitC).bitContainer |= value << (*bitC).bitPos; - (*bitC).bitPos = ((*bitC).bitPos).wrapping_add(nbBits); + bitC.bitContainer |= value << bitC.bitPos; + bitC.bitPos = bitC.bitPos.wrapping_add(nbBits); } #[inline] -pub(crate) unsafe fn BIT_flushBits(bitC: *mut BIT_CStream_t) { - let nbBytes = ((*bitC).bitPos >> 3) as size_t; - MEM_writeLEST((*bitC).ptr as *mut core::ffi::c_void, (*bitC).bitContainer); - (*bitC).ptr = ((*bitC).ptr).add(nbBytes); - if (*bitC).ptr > (*bitC).endPtr { - (*bitC).ptr = (*bitC).endPtr; +pub(crate) unsafe fn BIT_flushBits(bitC: &mut BIT_CStream_t) { + let nbBytes = (bitC.bitPos >> 3) as size_t; + MEM_writeLEST(bitC.ptr as *mut core::ffi::c_void, bitC.bitContainer); + bitC.ptr = bitC.ptr.add(nbBytes); + if bitC.ptr > bitC.endPtr { + bitC.ptr = bitC.endPtr; } - (*bitC).bitPos &= 7; - (*bitC).bitContainer >>= nbBytes * 8; + bitC.bitPos &= 7; + bitC.bitContainer >>= nbBytes * 8; } #[inline] -pub(crate) unsafe fn BIT_flushBitsFast(bitC: *mut BIT_CStream_t) { - let nbBytes = ((*bitC).bitPos >> 3) as size_t; - MEM_writeLEST((*bitC).ptr as *mut core::ffi::c_void, (*bitC).bitContainer); - (*bitC).ptr = ((*bitC).ptr).add(nbBytes); - (*bitC).bitPos &= 7; - (*bitC).bitContainer >>= nbBytes * 8; +pub(crate) unsafe fn BIT_flushBitsFast(bitC: &mut BIT_CStream_t) { + let nbBytes = (bitC.bitPos >> 3) as size_t; + MEM_writeLEST(bitC.ptr as *mut core::ffi::c_void, bitC.bitContainer); + bitC.ptr = bitC.ptr.add(nbBytes); + bitC.bitPos &= 7; + bitC.bitContainer >>= nbBytes * 8; } #[inline] -pub(crate) unsafe fn BIT_closeCStream(bitC: *mut BIT_CStream_t) -> size_t { +pub(crate) unsafe fn BIT_closeCStream(bitC: &mut BIT_CStream_t) -> size_t { BIT_addBitsFast(bitC, 1, 1); BIT_flushBits(bitC); - if (*bitC).ptr >= (*bitC).endPtr { + if bitC.ptr >= bitC.endPtr { return 0; } - (((*bitC).ptr).offset_from((*bitC).startPtr) as usize) - .wrapping_add(((*bitC).bitPos > 0) as usize) + (bitC.ptr.offset_from(bitC.startPtr) as usize).wrapping_add((bitC.bitPos > 0) as usize) } /// Bitstream decoder diff --git a/lib/common/fse.rs b/lib/common/fse.rs index 56e2f41d..a3cb408f 100644 --- a/lib/common/fse.rs +++ b/lib/common/fse.rs @@ -105,7 +105,7 @@ pub(crate) unsafe fn FSE_initCState2( #[inline] pub(crate) unsafe fn FSE_encodeSymbol( - bitC: *mut BIT_CStream_t, + bitC: &mut BIT_CStream_t, statePtr: *mut FSE_CState_t, symbol: core::ffi::c_uint, ) { @@ -120,7 +120,7 @@ pub(crate) unsafe fn FSE_encodeSymbol( } #[inline] -pub(crate) unsafe fn FSE_flushCState(bitC: *mut BIT_CStream_t, statePtr: *const FSE_CState_t) { +pub(crate) unsafe fn FSE_flushCState(bitC: &mut BIT_CStream_t, statePtr: *const FSE_CState_t) { BIT_addBits( bitC, (*statePtr).value as BitContainerType, diff --git a/lib/compress/fse_compress.rs b/lib/compress/fse_compress.rs index b712639c..24926094 100644 --- a/lib/compress/fse_compress.rs +++ b/lib/compress/fse_compress.rs @@ -41,7 +41,7 @@ unsafe fn FSE_initCState2(statePtr: *mut FSE_CState_t, ct: *const FSE_CTable, sy as ptrdiff_t; } #[inline] -unsafe fn FSE_flushCState(bitC: *mut BIT_CStream_t, statePtr: *const FSE_CState_t) { +unsafe fn FSE_flushCState(bitC: &mut BIT_CStream_t, statePtr: *const FSE_CState_t) { BIT_addBits( bitC, (*statePtr).value as BitContainerType, From e643c9c8a48a355b10383331e04a23dcee0d59fe Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Fri, 8 May 2026 16:04:22 +0200 Subject: [PATCH 3/4] use array indexing in `BIT_getLowerBits` --- lib/common/bitstream.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/common/bitstream.rs b/lib/common/bitstream.rs index debe1047..922eedc5 100644 --- a/lib/common/bitstream.rs +++ b/lib/common/bitstream.rs @@ -44,8 +44,8 @@ static BIT_mask: [core::ffi::c_uint; 32] = [ ]; #[inline(always)] -unsafe fn BIT_getLowerBits(bitContainer: BitContainerType, nbBits: u32) -> BitContainerType { - bitContainer & *BIT_mask.as_ptr().offset(nbBits as isize) as BitContainerType +fn BIT_getLowerBits(bitContainer: BitContainerType, nbBits: u32) -> BitContainerType { + bitContainer & BIT_mask[nbBits as usize] as BitContainerType } #[inline] From b9210d553c712bd29bb11b8bcfc635060313bb14 Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Fri, 8 May 2026 16:07:37 +0200 Subject: [PATCH 4/4] use `.sub()` in `BIT_initCStream` --- lib/common/bitstream.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/common/bitstream.rs b/lib/common/bitstream.rs index 922eedc5..a403f4af 100644 --- a/lib/common/bitstream.rs +++ b/lib/common/bitstream.rs @@ -28,10 +28,11 @@ pub(crate) unsafe fn BIT_initCStream( bitC.bitPos = 0; bitC.startPtr = startPtr as *mut core::ffi::c_char; bitC.ptr = bitC.startPtr; - bitC.endPtr = (bitC.startPtr) + bitC.endPtr = bitC + .startPtr .add(dstCapacity) - .offset(-(::core::mem::size_of::() as core::ffi::c_ulong as isize)); - if dstCapacity <= ::core::mem::size_of::() { + .sub(size_of::()); + if dstCapacity <= size_of::() { return Error::dstSize_tooSmall.to_error_code(); } 0