summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiayi Zhao <jeff.no.zhao@gmail.com>2019-01-05 10:33:58 -0500
committerJiayi Zhao <jeff.no.zhao@gmail.com>2019-01-05 10:33:58 -0500
commit215a9e19006574e088036e52cbb698e1265f0cc5 (patch)
tree5d8ffc8cc9566a5b9ca1a362f9d978b87e404ee8
parentde6e54aa996ae9c1b4e5c2d3317970695773a286 (diff)
fix index out of bounds when cursor_move movement not -1 or 1
- this also allowed cursor_move_page_up/down cursor_move_home/end to make use of cursor_move code which greatly reduced code size
-rw-r--r--src/joshuto/command/cursor_move.rs283
1 files changed, 87 insertions, 196 deletions
diff --git a/src/joshuto/command/cursor_move.rs b/src/joshuto/command/cursor_move.rs
index e2f6050..8f5c73d 100644
--- a/src/joshuto/command/cursor_move.rs
+++ b/src/joshuto/command/cursor_move.rs
@@ -36,50 +36,57 @@ impl std::fmt::Display for CursorMove {
impl command::Runnable for CursorMove {
fn execute(&self, context: &mut joshuto::JoshutoContext)
{
- match context.curr_list {
- Some(ref mut curr_list) => {
- let curr_index = curr_list.index;
+ if let Some(ref mut curr_list) = context.curr_list {
+ let curr_index = curr_list.index;
+ let dir_len = curr_list.contents.len() as i32;
- let new_index = curr_list.index + self.movement;
-
- let dir_len = curr_list.contents.len() as i32;
- if new_index <= 0 && curr_index <= 0 ||
- new_index >= dir_len && curr_index == dir_len - 1 {
+ let mut new_index = curr_list.index + self.movement;
+ if new_index <= 0 {
+ new_index = 0;
+ if curr_index <= 0 {
return;
}
-
- let dir_list = context.preview_list.take();
- if let Some(s) = dir_list {
- context.history.insert(s);
+ } else if new_index >= dir_len {
+ new_index = dir_len - 1;
+ if curr_index == dir_len - 1 {
+ return;
}
+ }
- curr_list.index = new_index;
- let curr_index = curr_list.index as usize;
- let new_path = &curr_list.contents[curr_index].path;
-
- if new_path.is_dir() {
- match context.history.pop_or_create(new_path.as_path(),
- &context.config_t.sort_type) {
- Ok(s) => {
- context.preview_list = Some(s);
- ui::redraw_view(&context.views.right_win, context.preview_list.as_ref());
- },
- Err(e) => ui::wprint_err(&context.views.right_win, format!("{}", e).as_str()),
- }
- } else {
- ncurses::werase(context.views.right_win.win);
- ncurses::wnoutrefresh(context.views.right_win.win);
- }
- },
- None => {},
+ let dir_list = context.preview_list.take();
+ if let Some(s) = dir_list {
+ context.history.insert(s);
+ }
+
+ curr_list.index = new_index;
}
- ui::redraw_view(&context.views.mid_win, context.curr_list.as_ref());
+ if let Some(ref curr_list) = context.curr_list {
+ let curr_index = curr_list.index as usize;
+ let new_path = &curr_list.contents[curr_index].path;
+
+ curr_list.display_contents(&context.views.mid_win);
+ ncurses::wnoutrefresh(context.views.mid_win.win);
+
+ if new_path.is_dir() {
+ match context.history.pop_or_create(new_path.as_path(),
+ &context.config_t.sort_type) {
+ Ok(s) => {
+ context.preview_list = Some(s);
+ ui::redraw_view(&context.views.right_win, context.preview_list.as_ref());
+ },
+ Err(e) => ui::wprint_err(&context.views.right_win, format!("{}", e).as_str()),
+ }
+ } else {
+ ncurses::werase(context.views.right_win.win);
+ ncurses::wnoutrefresh(context.views.right_win.win);
+ }
- ui::redraw_status(&context.views, context.curr_list.as_ref(), &context.curr_path,
- &context.config_t.username, &context.config_t.hostname);
+ ui::redraw_status(&context.views, context.curr_list.as_ref(), &context.curr_path,
+ &context.config_t.username, &context.config_t.hostname);
- ncurses::doupdate();
+ ncurses::doupdate();
+ }
}
}
@@ -103,53 +110,20 @@ impl std::fmt::Display for CursorMovePageUp {
impl command::Runnable for CursorMovePageUp {
fn execute(&self, context: &mut joshuto::JoshutoContext)
{
- match context.curr_list {
- Some(ref mut curr_list) => {
- let curr_index = curr_list.index;
-
- if curr_index <= 0 {
- return;
- }
+ let mut command: Option<CursorMove> = None;
- let half_page = context.views.mid_win.cols as usize / 2;
+ if let Some(ref curr_list) = context.curr_list {
+ let curr_index = curr_list.index;
+ if curr_index <= 0 {
+ return;
+ }
- let new_index = if curr_index <= half_page as i32 {
- 0
- } else {
- curr_index - half_page as i32
- };
-
- let dir_list = context.preview_list.take();
- if let Some(s) = dir_list {
- context.history.insert(s);
- }
-
- curr_list.index = new_index;
- let curr_index = curr_list.index as usize;
- let new_path = &curr_list.contents[curr_index].path;
-
- if new_path.is_dir() {
- match context.history.pop_or_create(new_path.as_path(),
- &context.config_t.sort_type) {
- Ok(s) => {
- context.preview_list = Some(s);
- ui::redraw_view(&context.views.right_win, context.preview_list.as_ref());
- },
- Err(e) => ui::wprint_err(&context.views.right_win, format!("{}", e).as_str()),
- }
- } else {
- ncurses::werase(context.views.right_win.win);
- ncurses::wnoutrefresh(context.views.right_win.win);
- }
- },
- None => {},
+ let half_page = -(context.views.mid_win.cols / 2);
+ command = Some(CursorMove::new(half_page));
+ }
+ if let Some(s) = command {
+ s.execute(context);
}
-
- ui::redraw_view(&context.views.mid_win, context.curr_list.as_ref());
-
- ui::redraw_status(&context.views, context.curr_list.as_ref(), &context.curr_path,
- &context.config_t.username, &context.config_t.hostname);
- ncurses::doupdate();
}
}
@@ -173,54 +147,21 @@ impl std::fmt::Display for CursorMovePageDown {
impl command::Runnable for CursorMovePageDown {
fn execute(&self, context: &mut joshuto::JoshutoContext)
{
- match context.curr_list {
- Some(ref mut curr_list) => {
- let curr_index = curr_list.index;
- let dir_len = curr_list.contents.len();
-
- if curr_index >= dir_len as i32 - 1 {
- return;
- }
-
- let half_page = context.views.mid_win.cols as usize / 2;
+ let mut command: Option<CursorMove> = None;
- let new_index = if curr_index + half_page as i32 >= dir_len as i32 {
- (dir_len - 1) as i32
- } else {
- curr_index + half_page as i32
- };
+ if let Some(ref curr_list) = context.curr_list {
+ let curr_index = curr_list.index;
+ let dir_len = curr_list.contents.len();
+ if curr_index >= dir_len as i32 - 1 {
+ return;
+ }
- let dir_list = context.preview_list.take();
- if let Some(s) = dir_list {
- context.history.insert(s);
- }
-
- curr_list.index = new_index;
- let curr_index = curr_list.index as usize;
- let new_path = &curr_list.contents[curr_index].path;
-
- if new_path.is_dir() {
- match context.history.pop_or_create(new_path.as_path(),
- &context.config_t.sort_type) {
- Ok(s) => {
- context.preview_list = Some(s);
- ui::redraw_view(&context.views.right_win, context.preview_list.as_ref());
- },
- Err(e) => ui::wprint_err(&context.views.right_win, format!("{}", e).as_str()),
- }
- } else {
- ncurses::werase(context.views.right_win.win);
- ncurses::wnoutrefresh(context.views.right_win.win);
- }
- },
- None => {},
+ let half_page = context.views.mid_win.cols / 2;
+ command = Some(CursorMove::new(half_page));
+ }
+ if let Some(s) = command {
+ s.execute(context);
}
-
- ui::redraw_view(&context.views.mid_win, context.curr_list.as_ref());
-
- ui::redraw_status(&context.views, context.curr_list.as_ref(), &context.curr_path,
- &context.config_t.username, &context.config_t.hostname);
- ncurses::doupdate();
}
}
@@ -244,44 +185,19 @@ impl std::fmt::Display for CursorMoveHome {
impl command::Runnable for CursorMoveHome {
fn execute(&self, context: &mut joshuto::JoshutoContext)
{
+ let mut command: Option<CursorMove> = None;
- match context.curr_list {
- Some(ref mut curr_list) => {
- if curr_list.index <= 0 {
- return;
- }
-
- let dir_list = context.preview_list.take();
- if let Some(s) = dir_list {
- context.history.insert(s);
- }
+ if let Some(ref curr_list) = context.curr_list {
+ let curr_index = curr_list.index;
+ if curr_index <= 0 {
+ return;
+ }
- curr_list.index = 0;
- let new_path = &curr_list.contents[curr_list.index as usize].path;
-
- if new_path.is_dir() {
- match context.history.pop_or_create(new_path.as_path(),
- &context.config_t.sort_type) {
- Ok(s) => {
- context.preview_list = Some(s);
- ui::redraw_view(&context.views.right_win, context.preview_list.as_ref());
- },
- Err(e) => ui::wprint_err(&context.views.right_win, format!("{}", e).as_str()),
- }
- } else {
- ncurses::werase(context.views.right_win.win);
- ncurses::wnoutrefresh(context.views.right_win.win);
- }
- },
- None => {},
+ command = Some(CursorMove::new(-curr_index));
+ }
+ if let Some(s) = command {
+ s.execute(context);
}
-
- ui::redraw_view(&context.views.mid_win, context.curr_list.as_ref());
-
- ui::redraw_status(&context.views, context.curr_list.as_ref(), &context.curr_path,
- &context.config_t.username, &context.config_t.hostname);
-
- ncurses::doupdate();
}
}
@@ -305,45 +221,20 @@ impl std::fmt::Display for CursorMoveEnd {
impl command::Runnable for CursorMoveEnd {
fn execute(&self, context: &mut joshuto::JoshutoContext)
{
- match context.curr_list {
- Some(ref mut curr_list) => {
- let dir_len = curr_list.contents.len();
-
- if curr_list.index >= dir_len as i32 - 1 {
- return;
- }
+ let mut command: Option<CursorMove> = None;
- let dir_list = context.preview_list.take();
- if let Some(s) = dir_list {
- context.history.insert(s);
- }
+ if let Some(ref curr_list) = context.curr_list {
+ let curr_index = curr_list.index;
+ let dir_len = curr_list.contents.len();
+ if curr_index >= dir_len as i32 - 1 {
+ return;
+ }
- curr_list.index = dir_len as i32 - 1;
- let curr_index = curr_list.index as usize;
- let new_path = &curr_list.contents[curr_index].path;
-
- if new_path.is_dir() {
- match context.history.pop_or_create(new_path.as_path(),
- &context.config_t.sort_type) {
- Ok(s) => {
- context.preview_list = Some(s);
- ui::redraw_view(&context.views.right_win, context.preview_list.as_ref());
- },
- Err(e) => ui::wprint_err(&context.views.right_win, format!("{}", e).as_str()),
- }
- } else {
- ncurses::werase(context.views.right_win.win);
- ncurses::wnoutrefresh(context.views.right_win.win);
- }
- },
- None => {},
+ let movement = dir_len as i32 - 1 - curr_index;
+ command = Some(CursorMove::new(movement));
+ }
+ if let Some(s) = command {
+ s.execute(context);
}
-
- ui::redraw_view(&context.views.mid_win, context.curr_list.as_ref());
-
- ui::redraw_status(&context.views, context.curr_list.as_ref(), &context.curr_path,
- &context.config_t.username, &context.config_t.hostname);
-
- ncurses::doupdate();
}
}