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:
parent
c6ad244142
commit
b0567670d1
1 changed files with 39 additions and 4 deletions
|
@ -88,6 +88,17 @@ fn read_word_filter_file(
|
|||
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)]
|
||||
struct WordFilter {
|
||||
only_specified: bool,
|
||||
|
@ -113,9 +124,23 @@ impl WordFilter {
|
|||
} else {
|
||||
(false, HashSet::new())
|
||||
};
|
||||
if matches.is_present(options::BREAK_FILE) {
|
||||
return Err(PtxError::NotImplemented("-b").into());
|
||||
}
|
||||
let break_set: Option<HashSet<char>> = if matches.is_present(options::BREAK_FILE)
|
||||
&& !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
|
||||
let arg_reg: Option<String> = if matches.is_present(options::WORD_REGEXP) {
|
||||
match matches.value_of(options::WORD_REGEXP) {
|
||||
|
@ -134,7 +159,17 @@ impl WordFilter {
|
|||
let reg = match arg_reg {
|
||||
Some(arg_reg) => arg_reg,
|
||||
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()
|
||||
} else {
|
||||
"[^ \t\n]+".to_owned()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue