Skip to content

Commit 2d5a8c1

Browse files
ezekielnewrengitster
authored andcommitted
xdiff: implement xdl_trim_ends() in Rust
Replace the C implementation of xdl_trim_ends() with a Rust implementation. Signed-off-by: Ezekiel Newren <ezekielnewren@gmail.com>
1 parent 797d8ac commit 2d5a8c1

4 files changed

Lines changed: 62 additions & 27 deletions

File tree

rust/xdiff/src/lib.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
pub mod xprepare;
2+
pub mod xtypes;
3+
4+
use crate::xprepare::trim_ends;
5+
use crate::xtypes::xdfile;
6+
7+
#[no_mangle]
8+
unsafe extern "C" fn xdl_trim_ends(xdf1: *mut xdfile, xdf2: *mut xdfile) -> i32 {
9+
let xdf1 = xdf1.as_mut().expect("null pointer");
10+
let xdf2 = xdf2.as_mut().expect("null pointer");
11+
12+
trim_ends(xdf1, xdf2);
13+
14+
0
15+
}

rust/xdiff/src/xprepare.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use crate::xtypes::xdfile;
2+
3+
///
4+
/// Early trim initial and terminal matching records.
5+
///
6+
pub(crate) fn trim_ends(xdf1: &mut xdfile, xdf2: &mut xdfile) {
7+
let mut lim = std::cmp::min(xdf1.record.len(), xdf2.record.len());
8+
9+
for i in 0..lim {
10+
if xdf1.record[i].ha != xdf2.record[i].ha {
11+
xdf1.dstart = i as isize;
12+
xdf2.dstart = i as isize;
13+
lim -= i;
14+
break;
15+
}
16+
}
17+
18+
for i in 0..lim {
19+
let f1i = xdf1.record.len() - 1 - i;
20+
let f2i = xdf2.record.len() - 1 - i;
21+
if xdf1.record[f1i].ha != xdf2.record[f2i].ha {
22+
xdf1.dend = f1i as isize;
23+
xdf2.dend = f2i as isize;
24+
break;
25+
}
26+
}
27+
}

rust/xdiff/src/xtypes.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
use interop::ivec::IVec;
2+
3+
#[repr(C)]
4+
pub(crate) struct xrecord {
5+
pub(crate) ptr: *const u8,
6+
pub(crate) size: usize,
7+
pub(crate) ha: u64,
8+
}
9+
10+
#[repr(C)]
11+
pub(crate) struct xdfile {
12+
pub(crate) record: IVec<xrecord>,
13+
pub(crate) dstart: isize,
14+
pub(crate) dend: isize,
15+
pub(crate) rchg: *mut u8,
16+
pub(crate) rindex: *mut usize,
17+
pub(crate) nreff: usize,
18+
pub(crate) ha: *mut u64,
19+
}

xdiff/xprepare.c

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -318,33 +318,7 @@ static int xdl_cleanup_records(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xd
318318
}
319319

320320

321-
/*
322-
* Early trim initial and terminal matching records.
323-
*/
324-
static int xdl_trim_ends(xdfile_t *xdf1, xdfile_t *xdf2) {
325-
long i, lim;
326-
xrecord_t *recs1, *recs2;
327-
328-
recs1 = xdf1->record.ptr;
329-
recs2 = xdf2->record.ptr;
330-
for (i = 0, lim = XDL_MIN(xdf1->record.length, xdf2->record.length); i < lim;
331-
i++, recs1++, recs2++)
332-
if (recs1->ha != recs2->ha)
333-
break;
334-
335-
xdf1->dstart = xdf2->dstart = i;
336-
337-
recs1 = xdf1->record.ptr + xdf1->record.length - 1;
338-
recs2 = xdf2->record.ptr + xdf2->record.length - 1;
339-
for (lim -= i, i = 0; i < lim; i++, recs1--, recs2--)
340-
if (recs1->ha != recs2->ha)
341-
break;
342-
343-
xdf1->dend = xdf1->record.length - i - 1;
344-
xdf2->dend = xdf2->record.length - i - 1;
345-
346-
return 0;
347-
}
321+
extern i32 xdl_trim_ends(xdfile_t *xdf1, xdfile_t *xdf2);
348322

349323

350324
static int xdl_optimize_ctxs(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xdf2) {

0 commit comments

Comments
 (0)