From 3331c1bd5008993f56bab6f9f067683201b2476b Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 28 Apr 2016 02:19:13 -0400 Subject: implement get_string_formatted --- src/ffi.rs | 7 +++++++ src/screen.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/ffi.rs b/src/ffi.rs index 0d95603..6072d07 100644 --- a/src/ffi.rs +++ b/src/ffi.rs @@ -21,6 +21,13 @@ extern "C" { outp: *mut *mut libc::c_char, outlen: *mut libc::size_t, ); + pub fn vt100_screen_get_string_formatted( + screen: *mut types::ScreenImpl, + start: *const types::Loc, + end: *const types::Loc, + outp: *mut *mut libc::c_char, + outlen: *mut libc::size_t, + ); pub fn vt100_screen_set_window_size( screen: *mut types::ScreenImpl, diff --git a/src/screen.rs b/src/screen.rs index f670ede..2312243 100644 --- a/src/screen.rs +++ b/src/screen.rs @@ -119,6 +119,53 @@ impl Screen { std::string::String::from_utf8(rust_plaintext).unwrap() } + pub fn window_contents_formatted(&self, + row_start: i32, + col_start: i32, + row_end: i32, + col_end: i32 + ) -> String { + let Screen(screen_impl) = *self; + let row_start = std::cmp::min( + std::cmp::max(row_start, 0), + self.rows() - 1 + ); + let col_start = std::cmp::min( + std::cmp::max(col_start, 0), + self.cols() - 1 + ); + let row_end = std::cmp::min( + std::cmp::max(row_end, 0), + self.rows() - 1 + ); + let col_end = std::cmp::min( + std::cmp::max(col_end, 0), + self.cols() - 1 + ); + + let start_loc = types::Loc { row: row_start, col: col_start }; + let end_loc = types::Loc { row: row_end, col: col_end }; + + let mut formatted: *mut libc::c_char = unsafe { std::mem::uninitialized() }; + let mut len: libc::size_t = unsafe { std::mem::uninitialized() }; + unsafe { + ffi::vt100_screen_get_string_formatted( + screen_impl, + &start_loc as *const types::Loc, + &end_loc as *const types::Loc, + &mut formatted as *mut *mut libc::c_char, + &mut len as *mut libc::size_t, + ) + }; + let rust_formatted = unsafe { + std::slice::from_raw_parts( + formatted as *mut libc::c_uchar, + len + ) + }.to_vec(); + std::string::String::from_utf8(rust_formatted).unwrap() + } + pub fn cell(&self, row: i32, col: i32) -> Option { let Screen(screen_impl) = *self; if row < 0 || row >= self.rows() || col < 0 || col >= self.cols() { -- cgit v1.2.3-54-g00ecf