@@ -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+
276290struct 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
395402fn 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
0 commit comments