@@ -25,17 +25,17 @@ def findall(patterns, line):
2525 m = pat .search (line , i )
2626 if m is not None :
2727 # Find the longest of the first matches.
28- best_span = min (best_span , (m .begin (), - m .end ()))
28+ best_span = min (best_span , (m .start (), - m .end ()))
2929 if best_span == (i , - len (line )):
3030 # Matches the rest of line.
3131 break
32- begin = best_span [0 ]
32+ start = best_span [0 ]
3333 end = - best_span [1 ]
3434 if end < 0 :
3535 break
36- yield line [begin :end ]
36+ yield line [start :end ]
3737 i = end
38- if begin == end :
38+ if start == end :
3939 i += 1
4040
4141def grep (opts , patterns , file , filename ):
@@ -98,7 +98,7 @@ def read_from_file(filename):
9898 errors = sys .stdin .errors ) as f :
9999 return [line .removesuffix ('\n ' ) for line in f .readlines ()]
100100
101- def main ():
101+ def make_parser ():
102102 parser = argparse .ArgumentParser (add_help = False )
103103 # Add --help option explicitly to avoid conflict in the -h option.
104104 parser .add_argument ('--help' ,
@@ -188,19 +188,12 @@ def main():
188188 grp .add_argument ('-C' , '--context' ,
189189 type = int , default = 0 , metavar = 'NUM' ,
190190 help = 'Print NUM lines of output context.' )
191+ return parser
191192
193+ def parse_args ():
194+ parser = make_parser ()
192195 opts = parser .parse_args ()
193196
194- patterns = opts .patterns or []
195- if opts .fixed_strings :
196- patterns = [re .escape (pat ) for pat in patterns ]
197- if opts .line_regexp :
198- patterns = [fr'\A(?:{ pat } )\Z' for pat in patterns ]
199- elif opts .word_regexp :
200- patterns = [fr'\b(?:{ pat } )\b' for pat in patterns ]
201- flags = re .IGNORECASE if opts .ignore_case else 0
202- patterns = [re .compile (pat , flags ) for pat in patterns ]
203-
204197 # By default print filenames only if more than one file is specified.
205198 if opts .filename is None :
206199 opts .filename = len (opts .files ) > 1
@@ -223,6 +216,22 @@ def main():
223216 # Only print group separator for non-zero context.
224217 if not (opts .after_context or opts .before_context ):
225218 opts .group_separator = None
219+ return opts
220+
221+ def compile_patterns (opts ):
222+ patterns = opts .patterns or []
223+ if opts .fixed_strings :
224+ patterns = [re .escape (pat ) for pat in patterns ]
225+ if opts .line_regexp :
226+ patterns = [fr'\A(?:{ pat } )\Z' for pat in patterns ]
227+ elif opts .word_regexp :
228+ patterns = [fr'\b(?:{ pat } )\b' for pat in patterns ]
229+ flags = re .IGNORECASE if opts .ignore_case else 0
230+ return [re .compile (pat , flags ) for pat in patterns ]
231+
232+ def main ():
233+ opts = parse_args ()
234+ patterns = compile_patterns (opts )
226235
227236 found = False
228237 for filename in opts .files or ['-' ]:
0 commit comments