#bindings #api-bindings #idiomatic #mm-file

no-std libxdiff

Rust 对 libxdiff C 库的绑定

2 个不稳定版本

0.2.0 2023年8月2日
0.1.0 2023年3月29日

#55 in #idiomatic

LGPL-3.0-only

35KB
831 代码行

libxdiff

libxdiff C 库提供安全、惯用的 Rust 绑定。

Crates.io docs

使用方法

将以下内容添加到您的 Cargo.toml

[dependencies]
libxdiff = "0.2"

示例

use core::str::from_utf8;
use libxdiff::MMFile;

let mut f1 = MMFile::from_bytes(b"hello world\n");
let mut f2 = MMFile::from_bytes(b"hello world!\n");
let mut diff_lines = Vec::<String>::new();
f1.diff_raw(&mut f2, |line: &[u8]| {
    diff_lines.push(from_utf8(line).unwrap().to_owned());
})
.unwrap();
assert_eq!(
    diff_lines,
    vec![
        "@@ -1,1 +1,1 @@\n",
        "-", "hello world\n",
        "+", "hello world!\n",
    ],
);

链接

上游 libxdiff 库体积小且没有依赖,因此此包将其静态链接。


lib.rs:

Rust 的 libxdiff 绑定

此库包含对 libxdiff C 库的绑定。底层库使用非连续缓冲区的链来定义 "MMFiles",以最小化追加和修改时的实际分配。此包装器通过定义所有 MMFile 为紧凑型(由单个缓冲区支持)来结构化 API。非紧凑形式为 MMBlocks

libxdiff 在内部跟踪对缓冲区的迭代,因此一些在概念上是只读的操作最终需要 &mut 参数才能安全执行。

示例

use core::str::from_utf8;
use libxdiff::MMFile;

let mut f1 = MMFile::from_bytes(b"hello world\n");
let mut f2 = MMFile::from_bytes(b"hello world!\n");
let mut diff_lines = Vec::<String>::new();
f1.diff_raw(&mut f2, |line: &[u8]| {
    diff_lines.push(from_utf8(line).unwrap().to_owned());
})
.unwrap();

assert_eq!(
    diff_lines,
    vec![
        "@@ -1,1 +1,1 @@\n",
        "-", "hello world\n",
        "+", "hello world!\n",
    ],
);

依赖项

~0.6–2.5MB
~52K SLoC