aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2016-04-26 02:40:23 -0400
committerJesse Luehrs <doy@tozt.net>2016-04-26 02:40:23 -0400
commit88e064a448756bb4a9045a9260702f60ba492990 (patch)
tree88edf10c96d95dc3eb83f7a3f3d0dfc57ab27f83
parent0c22a51ab36f1c6b84796400a2c85dbb23b956fc (diff)
downloadvt100-rust-88e064a448756bb4a9045a9260702f60ba492990.tar.gz
vt100-rust-88e064a448756bb4a9045a9260702f60ba492990.zip
get ffi framework in place
-rw-r--r--Cargo.toml7
-rw-r--r--build.rs16
-rw-r--r--src/lib.rs11
-rw-r--r--src/screen.rs35
-rw-r--r--tests/basic.rs11
5 files changed, 74 insertions, 6 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 09b94f4..c703990 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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"
diff --git a/build.rs b/build.rs
index 14c4082..e5bb100 100644
--- a/build.rs
+++ b/build.rs
@@ -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);
+ }
}
diff --git a/src/lib.rs b/src/lib.rs
index cdfbe1a..92267a1 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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);
+ }
+}