3 releases
0.1.2 | Sep 14, 2021 |
---|---|
0.1.1 | Jul 29, 2020 |
0.1.0 | Jul 29, 2020 |
#524 in Visualization
6KB
Description
FFI bindings for the Graphviz C library generated with Rust-bindgen. Very unsafe and not very usable in my opinion.
Other similar crates
I discovered that the graphviz-sys crate (which is almost exactly the same as this crate) existed when I decided to publish this crate on crates.io. Nevertheless I decided to publish it since I'd like (one day) to crate safe API bindings for the graphviz library. Any help with that would be appreciated.
How to use
One example of use of the graphviz C library (from this document, although slightly modified) is
#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);
}
A similar Rust code would be
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))
}
}
No runtime deps
~0–1.9MB
~36K SLoC