diff options
-rw-r--r-- | Cargo.toml | 7 | ||||
-rw-r--r-- | build.rs | 16 | ||||
-rw-r--r-- | src/lib.rs | 11 | ||||
-rw-r--r-- | src/screen.rs | 35 | ||||
-rw-r--r-- | tests/basic.rs | 11 |
5 files changed, 74 insertions, 6 deletions
@@ -3,3 +3,10 @@ name = "vt100" version = "0.1.0" authors = ["Jesse Luehrs <doy@tozt.net>"] build = "build.rs" + +[build-dependencies] +pkg-config = "0.3.8" + +[dependencies] +libc = "0.2.10" +glib-sys = "0.3.0" @@ -1,3 +1,5 @@ +extern crate pkg_config; + fn main() { std::env::set_current_dir("libvt100") .unwrap_or_else(|e| { panic!("failed to chdir: {}", e) }); @@ -9,4 +11,18 @@ fn main() { println!("{}", std::string::String::from_utf8_lossy(&out.stderr)); std::process::exit(out.status.code().unwrap_or(255)); } + + println!("cargo:rustc-link-search=native=libvt100"); + println!("cargo:rustc-link-lib=static=vt100"); + + let lib_def = pkg_config::probe_library("glib-2.0") + .unwrap_or_else(|e| { + panic!("Couldn't find required dependency glib-2.0: {}", e); + }); + for dir in lib_def.link_paths { + println!("cargo:rustc-link-search=native={:?}", dir); + } + for lib in lib_def.libs { + println!("cargo:rustc-link-lib={}", lib); + } } @@ -1,6 +1,5 @@ -#[cfg(test)] -mod tests { - #[test] - fn it_works() { - } -} +extern crate libc; + +mod screen; + +pub use screen::Screen; diff --git a/src/screen.rs b/src/screen.rs new file mode 100644 index 0000000..b448a20 --- /dev/null +++ b/src/screen.rs @@ -0,0 +1,35 @@ +use libc; + +enum ScreenImpl {} +pub struct Screen(*mut ScreenImpl); + +impl Screen { + pub fn new(rows: u32, cols: u32) -> Screen { + let screen_impl = unsafe { + vt100_screen_new(rows as libc::c_int, cols as libc::c_int) + }; + Screen(screen_impl) + } +} + +impl Drop for Screen { + fn drop(&mut self) { + let &mut Screen(screen_impl) = self; + unsafe { vt100_screen_delete(screen_impl) }; + } +} + +extern "C" { + fn vt100_screen_new(rows: libc::c_int, cols: libc::c_int) -> *mut ScreenImpl; + fn vt100_screen_delete(screen: *mut ScreenImpl); +} + +#[cfg(test)] +mod tests { + #[test] + fn ffi() { + let ptr = unsafe { super::vt100_screen_new(24, 80) }; + assert!(!ptr.is_null()); + unsafe { super::vt100_screen_delete(ptr) }; + } +} diff --git a/tests/basic.rs b/tests/basic.rs new file mode 100644 index 0000000..c52a574 --- /dev/null +++ b/tests/basic.rs @@ -0,0 +1,11 @@ +extern crate vt100; + +#[cfg(test)] +mod tests { + use vt100; + + #[test] + fn object_creation() { + let _ = vt100::Screen::new(24, 80); + } +} |