1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-31 13:07:46 +00:00

clean up use of u16s and patterns

This commit is contained in:
Terts Diepraam 2024-05-14 12:30:48 +02:00 committed by Sylvestre Ledru
parent 2fef5be8f7
commit b2510feb46

View file

@ -98,10 +98,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
println!("{panic_info}"); println!("{panic_info}");
})); }));
let matches = match uu_app().try_get_matches_from(args) { let matches = uu_app().try_get_matches_from(args)?;
Ok(m) => m,
Err(e) => return Err(e.into()),
};
let mut options = Options::from(&matches); let mut options = Options::from(&matches);
@ -308,12 +305,12 @@ fn more(
rows = number; rows = number;
} }
let lines = break_buff(buff, usize::from(cols)); let lines = break_buff(buff, cols as usize);
let mut pager = Pager::new(rows, lines, next_file, options); let mut pager = Pager::new(rows, lines, next_file, options);
if options.pattern.is_some() { if let Some(pat) = options.pattern.as_ref() {
match search_pattern_in_file(&pager.lines, &options.pattern) { match search_pattern_in_file(&pager.lines, pat) {
Some(number) => pager.upper_mark = number, Some(number) => pager.upper_mark = number,
None => { None => {
execute!(stdout, terminal::Clear(terminal::ClearType::CurrentLine))?; execute!(stdout, terminal::Clear(terminal::ClearType::CurrentLine))?;
@ -446,7 +443,7 @@ struct Pager<'a> {
// The current line at the top of the screen // The current line at the top of the screen
upper_mark: usize, upper_mark: usize,
// The number of rows that fit on the screen // The number of rows that fit on the screen
content_rows: u16, content_rows: usize,
lines: Vec<&'a str>, lines: Vec<&'a str>,
next_file: Option<&'a str>, next_file: Option<&'a str>,
line_count: usize, line_count: usize,
@ -460,7 +457,7 @@ impl<'a> Pager<'a> {
let line_count = lines.len(); let line_count = lines.len();
Self { Self {
upper_mark: options.from_line, upper_mark: options.from_line,
content_rows: rows.saturating_sub(1), content_rows: rows.saturating_sub(1) as usize,
lines, lines,
next_file, next_file,
line_count, line_count,
@ -481,10 +478,10 @@ impl<'a> Pager<'a> {
// the upper mark must not grow past top of the screen at the end of the open file. // the upper mark must not grow past top of the screen at the end of the open file.
if self if self
.upper_mark .upper_mark
.saturating_add(self.content_rows as usize * 2) .saturating_add(self.content_rows * 2)
.ge(&self.line_count) >= self.line_count
{ {
self.upper_mark = self.line_count - self.content_rows as usize; self.upper_mark = self.line_count - self.content_rows;
return; return;
} }
@ -492,10 +489,9 @@ impl<'a> Pager<'a> {
} }
fn page_up(&mut self) { fn page_up(&mut self) {
let content_row_usize: usize = self.content_rows.into();
self.upper_mark = self self.upper_mark = self
.upper_mark .upper_mark
.saturating_sub(content_row_usize.saturating_add(self.line_squeezed)); .saturating_sub(self.content_rows.saturating_add(self.line_squeezed));
if self.squeeze { if self.squeeze {
let iter = self.lines.iter().take(self.upper_mark).rev(); let iter = self.lines.iter().take(self.upper_mark).rev();
@ -520,7 +516,7 @@ impl<'a> Pager<'a> {
// TODO: Deal with column size changes. // TODO: Deal with column size changes.
fn page_resize(&mut self, _: u16, row: u16, option_line: Option<u16>) { fn page_resize(&mut self, _: u16, row: u16, option_line: Option<u16>) {
if option_line.is_none() { if option_line.is_none() {
self.content_rows = row.saturating_sub(1); self.content_rows = row.saturating_sub(1) as usize;
}; };
} }
@ -541,7 +537,7 @@ impl<'a> Pager<'a> {
let mut displayed_lines = Vec::new(); let mut displayed_lines = Vec::new();
let mut iter = self.lines.iter().skip(self.upper_mark); let mut iter = self.lines.iter().skip(self.upper_mark);
while displayed_lines.len() < self.content_rows as usize { while displayed_lines.len() < self.content_rows {
match iter.next() { match iter.next() {
Some(line) => { Some(line) => {
if self.squeeze { if self.squeeze {
@ -608,13 +604,12 @@ impl<'a> Pager<'a> {
} }
} }
fn search_pattern_in_file(lines: &[&str], pattern: &Option<String>) -> Option<usize> { fn search_pattern_in_file(lines: &[&str], pattern: &str) -> Option<usize> {
let pattern = pattern.clone().unwrap_or_default();
if lines.is_empty() || pattern.is_empty() { if lines.is_empty() || pattern.is_empty() {
return None; return None;
} }
for (line_number, line) in lines.iter().enumerate() { for (line_number, line) in lines.iter().enumerate() {
if line.contains(pattern.as_str()) { if line.contains(pattern) {
return Some(line_number); return Some(line_number);
} }
} }
@ -723,15 +718,15 @@ mod tests {
#[test] #[test]
fn test_search_pattern_empty_lines() { fn test_search_pattern_empty_lines() {
let lines = vec![]; let lines = vec![];
let pattern = Some(String::from("pattern")); let pattern = "pattern";
assert_eq!(None, search_pattern_in_file(&lines, &pattern)); assert_eq!(None, search_pattern_in_file(&lines, pattern));
} }
#[test] #[test]
fn test_search_pattern_empty_pattern() { fn test_search_pattern_empty_pattern() {
let lines = vec!["line1", "line2"]; let lines = vec!["line1", "line2"];
let pattern = None; let pattern = "";
assert_eq!(None, search_pattern_in_file(&lines, &pattern)); assert_eq!(None, search_pattern_in_file(&lines, pattern));
} }
#[test] #[test]
@ -739,16 +734,16 @@ mod tests {
let lines = vec!["line1", "line2", "pattern"]; let lines = vec!["line1", "line2", "pattern"];
let lines2 = vec!["line1", "line2", "pattern", "pattern2"]; let lines2 = vec!["line1", "line2", "pattern", "pattern2"];
let lines3 = vec!["line1", "line2", "other_pattern"]; let lines3 = vec!["line1", "line2", "other_pattern"];
let pattern = Some(String::from("pattern")); let pattern = "pattern";
assert_eq!(2, search_pattern_in_file(&lines, &pattern).unwrap()); assert_eq!(2, search_pattern_in_file(&lines, pattern).unwrap());
assert_eq!(2, search_pattern_in_file(&lines2, &pattern).unwrap()); assert_eq!(2, search_pattern_in_file(&lines2, pattern).unwrap());
assert_eq!(2, search_pattern_in_file(&lines3, &pattern).unwrap()); assert_eq!(2, search_pattern_in_file(&lines3, pattern).unwrap());
} }
#[test] #[test]
fn test_search_pattern_not_found_pattern() { fn test_search_pattern_not_found_pattern() {
let lines = vec!["line1", "line2", "something"]; let lines = vec!["line1", "line2", "something"];
let pattern = Some(String::from("pattern")); let pattern = "pattern";
assert_eq!(None, search_pattern_in_file(&lines, &pattern)); assert_eq!(None, search_pattern_in_file(&lines, pattern));
} }
} }