From fbd3fa3f21952cbc9e26408b58334bbca50291fb Mon Sep 17 00:00:00 2001 From: Ideflop Date: Wed, 7 Feb 2024 21:47:11 +0100 Subject: [PATCH] more: implementing pattern option --- src/uu/more/src/more.rs | 46 ++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/src/uu/more/src/more.rs b/src/uu/more/src/more.rs index a03e64a49..401508d90 100644 --- a/src/uu/more/src/more.rs +++ b/src/uu/more/src/more.rs @@ -54,6 +54,7 @@ struct Options { clean_print: bool, from_line: usize, lines: Option, + pattern: Option, print_over: bool, silent: bool, squeeze: bool, @@ -75,10 +76,14 @@ impl Options { Some(number) if number > 1 => number - 1, _ => 0, }; + let pattern = matches + .get_one::(options::PATTERN) + .map(|s| s.to_owned()); Self { clean_print: matches.get_flag(options::CLEAN_PRINT), from_line, lines, + pattern, print_over: matches.get_flag(options::PRINT_OVER), silent: matches.get_flag(options::SILENT), squeeze: matches.get_flag(options::SQUEEZE), @@ -206,6 +211,15 @@ pub fn uu_app() -> Command { .action(ArgAction::SetTrue) .hide(true), ) + .arg( + Arg::new(options::PATTERN) + .short('P') + .long(options::PATTERN) + .allow_hyphen_values(true) + .required(false) + .value_name("pattern") + .help("Display file beginning from pattern match"), + ) .arg( Arg::new(options::FROM_LINE) .short('F') @@ -245,14 +259,6 @@ pub fn uu_app() -> Command { .long(options::NO_PAUSE) .help("Suppress pause after form feed"), ) - .arg( - Arg::new(options::PATTERN) - .short('P') - .allow_hyphen_values(true) - .required(false) - .takes_value(true) - .help("Display file beginning from pattern match"), - ) */ .arg( Arg::new(options::FILES) @@ -307,6 +313,17 @@ fn more( let mut pager = Pager::new(rows, lines, next_file, options); + if options.pattern.is_some() { + match search_pattern_in_file(&pager.lines, &options.pattern) { + Some(number) => pager.upper_mark = number, + None => { + execute!(stdout, terminal::Clear(terminal::ClearType::CurrentLine))?; + stdout.write_all("\rPattern not found\n".as_bytes())?; + pager.content_rows -= 1; + } + } + } + if multiple_file { execute!(stdout, terminal::Clear(terminal::ClearType::CurrentLine)).unwrap(); stdout.write_all( @@ -592,6 +609,19 @@ impl<'a> Pager<'a> { } } +fn search_pattern_in_file(lines: &[String], pattern: &Option) -> Option { + let pattern = pattern.clone().unwrap_or_default(); + if lines.is_empty() || pattern.is_empty() { + return None; + } + for (line_number, line) in lines.iter().enumerate() { + if line.contains(pattern.as_str()) { + return Some(line_number); + } + } + None +} + fn paging_add_back_message(options: &Options, stdout: &mut std::io::Stdout) -> UResult<()> { if options.lines.is_some() { execute!(stdout, MoveUp(1))?;