3个版本
0.1.2 | 2021年9月14日 |
---|---|
0.1.1 | 2020年7月29日 |
0.1.0 | 2020年7月29日 |
#468 in 可视化
6KB
描述
使用Rust-bindgen生成的Graphviz C库的FFI绑定。在我看来非常不安全,不太可用。
其他类似的crate
当我决定在crates.io上发布这个crate时,我发现了一个名为graphviz-sys crate(几乎与这个crate完全相同)的crate存在。尽管如此,我还是决定发布它,因为我希望(有一天)为Graphviz库创建安全的API绑定。任何帮助都将受到欢迎。
如何使用
下面是一个使用Graphviz C库的例子(来自此文档,虽然略有修改):
#include <graphviz/gvc.h>
int main(int argc, char**argv){
FILE *fp;
if (argc > 1)
fp = fopen(argv[1], "r");
else
fp = stdin;
GVC_t *gvc = gvContext();
Agraph_t *g = agread(fp, 0);
gvLayout(gvc, g, "dot");
gvRender(gvc, g, "plain", stdout);
gvFreeLayout(gvc, g);
agclose(g);
return gvFreeContext(gvc);
}
相应的Rust代码将是:
use graphviz_ffi::{
agclose, agread, fopen, gvContext, gvFreeContext, gvFreeLayout, gvLayout, gvRender, stdin,
stdout,
};
macro_rules! to_c_string {
($str:expr) => {
std::ffi::CString::new($str).unwrap().as_ptr()
};
}
fn main() {
unsafe {
let fp = match std::env::args().nth(1) {
Some(path) => fopen(to_c_string!(path), to_c_string!("r")),
None => stdin,
};
let gvc = gvContext();
let g = agread(fp as _, 0 as _);
gvLayout(gvc, g, to_c_string!("dot"));
gvRender(gvc, g, to_c_string!("plain"), stdout);
gvFreeLayout(gvc, g);
agclose(g);
std::process::exit(gvFreeContext(gvc))
}
}
无运行时依赖
~0–1.8MB
~34K SLoC