1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 11:37:44 +00:00

ptx: implement breakfile option

This commit is contained in:
Michael Kefeder 2022-04-28 16:51:06 +02:00
parent c6ad244142
commit b0567670d1

View file

@ -88,6 +88,17 @@ fn read_word_filter_file(
Ok(words) Ok(words)
} }
fn read_char_filter_file(
matches: &clap::ArgMatches,
option: &str,
) -> std::io::Result<HashSet<char>> {
let filename = matches.value_of(option).expect("parsing options failed!");
let mut reader = File::open(filename)?;
let mut buffer = String::new();
reader.read_to_string(&mut buffer)?;
Ok(buffer.chars().collect())
}
#[derive(Debug)] #[derive(Debug)]
struct WordFilter { struct WordFilter {
only_specified: bool, only_specified: bool,
@ -113,9 +124,23 @@ impl WordFilter {
} else { } else {
(false, HashSet::new()) (false, HashSet::new())
}; };
if matches.is_present(options::BREAK_FILE) { let break_set: Option<HashSet<char>> = if matches.is_present(options::BREAK_FILE)
return Err(PtxError::NotImplemented("-b").into()); && !matches.is_present(options::WORD_REGEXP)
} {
let chars =
read_char_filter_file(matches, options::BREAK_FILE).map_err_context(String::new)?;
let mut hs: HashSet<char> = if config.gnu_ext {
HashSet::new() // really only chars found in file
} else {
// GNU off means at least these are considered
[' ', '\t', '\n'].iter().cloned().collect()
};
hs.extend(chars);
Some(hs)
} else {
// if -W takes precedence or default
None
};
// Ignore empty string regex from cmd-line-args // Ignore empty string regex from cmd-line-args
let arg_reg: Option<String> = if matches.is_present(options::WORD_REGEXP) { let arg_reg: Option<String> = if matches.is_present(options::WORD_REGEXP) {
match matches.value_of(options::WORD_REGEXP) { match matches.value_of(options::WORD_REGEXP) {
@ -134,7 +159,17 @@ impl WordFilter {
let reg = match arg_reg { let reg = match arg_reg {
Some(arg_reg) => arg_reg, Some(arg_reg) => arg_reg,
None => { None => {
if config.gnu_ext { if break_set.is_some() {
format!(
"[^{}]+",
break_set
.unwrap()
.into_iter()
.map(|c| c.to_string())
.collect::<Vec<String>>()
.join("")
)
} else if config.gnu_ext {
"\\w+".to_owned() "\\w+".to_owned()
} else { } else {
"[^ \t\n]+".to_owned() "[^ \t\n]+".to_owned()