#graphviz #dot #graph #ffi #c

sys graphviz-ffi

使用rust-bindgen生成的Graphviz C库的FFI绑定

3个版本

0.1.2 2021年9月14日
0.1.1 2020年7月29日
0.1.0 2020年7月29日

#468 in 可视化

MIT 许可证

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