Skip to content

Commit 89747e2

Browse files
committed
ptx: warn on invalid regex instead of failing
1 parent 6e84797 commit 89747e2

File tree

2 files changed

+30
-23
lines changed

2 files changed

+30
-23
lines changed

src/uu/ptx/src/ptx.rs

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,20 @@ fn get_config(matches: &mut clap::ArgMatches) -> UResult<Config> {
273273
Ok(config)
274274
}
275275

276+
/// Try to compile a regex, printing a warning and returning None on failure.
277+
fn try_compile_regex(pattern: &str) -> Option<Regex> {
278+
match Regex::new(pattern) {
279+
Ok(re) => Some(re),
280+
Err(e) => {
281+
uucore::show_error!(
282+
"{}",
283+
translate!("ptx-error-invalid-regexp", "error" => format!("{}", e))
284+
);
285+
None
286+
}
287+
}
288+
}
289+
276290
struct FileContent {
277291
lines: Vec<String>,
278292
chars_lines: Vec<Vec<char>>,
@@ -285,16 +299,10 @@ fn read_input(input_files: &[OsString], config: &Config) -> std::io::Result<File
285299
let mut file_map: FileMap = HashMap::new();
286300
let mut offset: usize = 0;
287301

288-
let sentence_splitter = if let Some(re_str) = &config.sentence_regex {
289-
Some(Regex::new(re_str).map_err(|e| {
290-
std::io::Error::new(
291-
std::io::ErrorKind::InvalidInput,
292-
translate!("ptx-error-invalid-regexp", "error" => e),
293-
)
294-
})?)
295-
} else {
296-
None
297-
};
302+
let sentence_splitter = config
303+
.sentence_regex
304+
.as_ref()
305+
.and_then(|re_str| try_compile_regex(re_str));
298306

299307
for filename in input_files {
300308
let mut reader: BufReader<Box<dyn Read>> = BufReader::new(if filename == "-" {
@@ -342,15 +350,14 @@ fn read_lines(
342350
}
343351

344352
/// Go through every lines in the input files and record each match occurrence as a `WordRef`.
345-
fn create_word_set(
346-
config: &Config,
347-
filter: &WordFilter,
348-
file_map: &FileMap,
349-
) -> UResult<BTreeSet<WordRef>> {
350-
let reg = Regex::new(&filter.word_regex)
351-
.map_err(|e| USimpleError::new(1, translate!("ptx-error-invalid-regexp", "error" => e)))?;
352-
let ref_reg = Regex::new(&config.context_regex)
353-
.map_err(|e| USimpleError::new(1, translate!("ptx-error-invalid-regexp", "error" => e)))?;
353+
fn create_word_set(config: &Config, filter: &WordFilter, file_map: &FileMap) -> BTreeSet<WordRef> {
354+
let Some(reg) = try_compile_regex(&filter.word_regex) else {
355+
return BTreeSet::new();
356+
};
357+
let Some(ref_reg) = try_compile_regex(&config.context_regex) else {
358+
return BTreeSet::new();
359+
};
360+
354361
let mut word_set: BTreeSet<WordRef> = BTreeSet::new();
355362
for (file, lines) in file_map {
356363
let mut count: usize = 0;
@@ -389,7 +396,7 @@ fn create_word_set(
389396
count += 1;
390397
}
391398
}
392-
Ok(word_set)
399+
word_set
393400
}
394401

395402
fn get_reference(config: &Config, word_ref: &WordRef, line: &str, context_reg: &Regex) -> String {
@@ -933,7 +940,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
933940

934941
let word_filter = WordFilter::new(&matches, &config)?;
935942
let file_map = read_input(&input_files, &config).map_err_context(String::new)?;
936-
let word_set = create_word_set(&config, &word_filter, &file_map)?;
943+
let word_set = create_word_set(&config, &word_filter, &file_map);
937944
write_traditional_output(&mut config, &file_map, &word_set, &output_file)
938945
}
939946

tests/by-util/test_ptx.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -352,14 +352,14 @@ fn test_narrow_width_with_long_reference_no_panic() {
352352
fn test_invalid_regex_word_trailing_backslash() {
353353
new_ucmd!()
354354
.args(&["-W", "bar\\"])
355-
.fails_with_code(1)
355+
.succeeds()
356356
.stderr_contains("ptx: Invalid regexp");
357357
}
358358

359359
#[test]
360360
fn test_invalid_regex_word_unclosed_group() {
361361
new_ucmd!()
362362
.args(&["-W", "(wrong"])
363-
.fails_with_code(1)
363+
.succeeds()
364364
.stderr_contains("ptx: Invalid regexp");
365365
}

0 commit comments

Comments
 (0)