Skip to content

FFI bindings for the graphviz C lib generated with rust-bindgen.

License

Notifications You must be signed in to change notification settings

DrGabble/rust-graphviz

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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))
    }
}

About

FFI bindings for the graphviz C lib generated with rust-bindgen.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 97.4%
  • C++ 2.6%