https://github.com/pgimalac/rust-graphviz
FFI bindings for the graphviz C lib generated with rust-bindgen.
https://github.com/pgimalac/rust-graphviz
Last synced: 8 months ago
JSON representation
FFI bindings for the graphviz C lib generated with rust-bindgen.
- Host: GitHub
- URL: https://github.com/pgimalac/rust-graphviz
- Owner: pgimalac
- License: mit
- Created: 2020-07-29T07:03:07.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2021-09-14T08:52:41.000Z (almost 5 years ago)
- Last Synced: 2025-01-21T08:19:40.860Z (over 1 year ago)
- Language: Rust
- Size: 7.81 KB
- Stars: 5
- Watchers: 2
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: Readme.md
- License: LICENSE
Awesome Lists containing this project
README
### Description
FFI bindings for the [Graphviz C library](https://graphviz.org/) generated with [Rust-bindgen](https://github.com/rust-lang/rust-bindgen). Very unsafe and not very usable in my opinion.
### Other similar crates
I discovered that the [graphviz-sys crate](https://crates.io/crates/graphviz-sys) (which is almost exactly the same as this crate) existed when I decided to publish this crate on [crates.io](https://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](https://www.graphviz.org/pdf/libguide.pdf), although slightly modified) is
```C
#include
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
```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))
}
}
```