aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2023-12-26 18:11:55 -0800
committerRose Hogenson <rosehogenson@posteo.net>2023-12-26 18:11:55 -0800
commit9f6447adb277ac7ea6332600d56b98666189168e (patch)
tree75a06e33220d93ea682d4c4904bb62e1e1d9c90a
parentd321e38ffa410c7e2136e623245c04eebb842c1f (diff)
downloadeditor-9f6447adb277ac7ea6332600d56b98666189168e.tar.zst
Add function to get terminal size.
-rw-r--r--Cargo.lock9
-rw-r--r--Cargo.toml1
-rw-r--r--src/main.rs34
-rw-r--r--src/tiocgwinsz.rs18
4 files changed, 52 insertions, 10 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 026c1d2..0ade713 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5,3 +5,12 @@ version = 3
[[package]]
name = "edit"
version = "0.1.0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.151"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
diff --git a/Cargo.toml b/Cargo.toml
index 6b7729f..b366879 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,3 +6,4 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+"libc" = "0.2"
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);
+}