aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs34
-rw-r--r--src/tiocgwinsz.rs18
2 files changed, 42 insertions, 10 deletions
diff --git a/src/main.rs b/src/main.rs
index 5302d59..bb3797d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,22 +1,36 @@
mod rope;
+mod tiocgwinsz;
use rope::Rope;
-use std::ffi::OsString;
+use std::ffi::{OsStr, OsString};
use std::path::Path;
+fn edit(file: &OsStr) -> Result<(), String> {
+ let r = match Rope::open(Path::new(file)) {
+ Ok(r) => r,
+ Err(err) => {
+ return Err(format!("open file {}: {}", file.to_string_lossy(), err));
+ }
+ };
+ println!("{}", r);
+ let size = match tiocgwinsz::size() {
+ Some(size) => size,
+ None => {
+ return Err(String::from("cannot get terminal size"));
+ }
+ };
+ println!("{}, {}", size.ws_row, size.ws_col);
+ return Ok(());
+}
+
fn main() {
let args: Vec<OsString> = std::env::args_os().collect();
if args.len() != 2 {
println!("Usage: edit <filename>");
std::process::exit(1);
}
- let file = Path::new(&args[1]);
- let r = match Rope::open(file) {
- Ok(r) => r,
- Err(err) => {
- println!("FAIL: open file {}: {}", file.to_string_lossy(), err);
- std::process::exit(1);
- }
- };
- println!("{}", r);
+ if let Err(err) = edit(&args[0]) {
+ println!("FAIL: {}", err);
+ std::process::exit(1);
+ }
}
diff --git a/src/tiocgwinsz.rs b/src/tiocgwinsz.rs
new file mode 100644
index 0000000..9fdf9a4
--- /dev/null
+++ b/src/tiocgwinsz.rs
@@ -0,0 +1,18 @@
+use libc::{c_int, winsize};
+
+pub fn size() -> Option<winsize> {
+ let mut window: winsize = winsize {
+ ws_row: 0,
+ ws_col: 0,
+ ws_xpixel: 0,
+ ws_ypixel: 0,
+ };
+ let result: c_int;
+ unsafe {
+ result = libc::ioctl(0, libc::TIOCGWINSZ, &mut window);
+ }
+ if result < 0 {
+ return None;
+ }
+ return Some(window);
+}