diff --git a/Lib/grep.py b/Lib/grep.py index 21ef8d80171..019d91646fc 100644 --- a/Lib/grep.py +++ b/Lib/grep.py @@ -4,41 +4,59 @@ import regex from regex_syntax import * import string -def grep(pat, filename): - return ggrep(RE_SYNTAX_GREP, pat, filename) +opt_show_where = 0 +opt_show_filename = 0 +opt_show_lineno = 1 -def egrep(pat, filename): - return ggrep(RE_SYNTAX_EGREP, pat, filename) +def grep(pat, +files): + return ggrep(RE_SYNTAX_GREP, pat, files) -def emgrep(pat, filename): - return ggrep(RE_SYNTAX_EMACS, pat, filename) +def egrep(pat, +files): + return ggrep(RE_SYNTAX_EGREP, pat, files) -def ggrep(syntax, pat, filename): +def emgrep(pat, +files): + return ggrep(RE_SYNTAX_EMACS, pat, files) + +def ggrep(syntax, pat, files): + if len(files) == 1 and type(files[0]) == type([]): + files = files[0] + global opt_show_filename + opt_show_filename = (len(files) != 1) syntax = regex.set_syntax(syntax) try: prog = regex.compile(pat) finally: syntax = regex.set_syntax(syntax) - fp = open(filename, 'r') - lineno = 0 - while 1: - line = fp.readline() - if not line: break - lineno = lineno + 1 - if prog.search(line) >= 0: - if line[-1:] == '\n': line = line[:-1] - prefix = string.rjust(`lineno`, 3) + ': ' - print prefix + line - if 0: # XXX - start, end = prog.regs[0] - line = line[:start] - if '\t' not in line: - prefix = ' ' * (len(prefix) + start) - else: - prefix = ' ' * len(prefix) - for c in line: - if c <> '\t': c = ' ' - prefix = prefix + c - if start == end: prefix = prefix + '\\' - else: prefix = prefix + '^'*(end-start) - print prefix + for filename in files: + fp = open(filename, 'r') + lineno = 0 + while 1: + line = fp.readline() + if not line: break + lineno = lineno + 1 + if prog.search(line) >= 0: + showline(filename, lineno, line, prog) + fp.close() + +def showline(filename, lineno, line, prog): + if line[-1:] == '\n': line = line[:-1] + if opt_show_lineno: + prefix = string.rjust(`lineno`, 3) + ': ' + else: + prefix = '' + if opt_show_filename: + prefix = filename + ': ' + prefix + print prefix + line + if opt_show_where: + start, end = prog.regs()[0] + line = line[:start] + if '\t' not in line: + prefix = ' ' * (len(prefix) + start) + else: + prefix = ' ' * len(prefix) + for c in line: + if c <> '\t': c = ' ' + prefix = prefix + c + if start == end: prefix = prefix + '\\' + else: prefix = prefix + '^'*(end-start) + print prefix diff --git a/Lib/lib-old/grep.py b/Lib/lib-old/grep.py index 21ef8d80171..019d91646fc 100644 --- a/Lib/lib-old/grep.py +++ b/Lib/lib-old/grep.py @@ -4,41 +4,59 @@ import regex from regex_syntax import * import string -def grep(pat, filename): - return ggrep(RE_SYNTAX_GREP, pat, filename) +opt_show_where = 0 +opt_show_filename = 0 +opt_show_lineno = 1 -def egrep(pat, filename): - return ggrep(RE_SYNTAX_EGREP, pat, filename) +def grep(pat, +files): + return ggrep(RE_SYNTAX_GREP, pat, files) -def emgrep(pat, filename): - return ggrep(RE_SYNTAX_EMACS, pat, filename) +def egrep(pat, +files): + return ggrep(RE_SYNTAX_EGREP, pat, files) -def ggrep(syntax, pat, filename): +def emgrep(pat, +files): + return ggrep(RE_SYNTAX_EMACS, pat, files) + +def ggrep(syntax, pat, files): + if len(files) == 1 and type(files[0]) == type([]): + files = files[0] + global opt_show_filename + opt_show_filename = (len(files) != 1) syntax = regex.set_syntax(syntax) try: prog = regex.compile(pat) finally: syntax = regex.set_syntax(syntax) - fp = open(filename, 'r') - lineno = 0 - while 1: - line = fp.readline() - if not line: break - lineno = lineno + 1 - if prog.search(line) >= 0: - if line[-1:] == '\n': line = line[:-1] - prefix = string.rjust(`lineno`, 3) + ': ' - print prefix + line - if 0: # XXX - start, end = prog.regs[0] - line = line[:start] - if '\t' not in line: - prefix = ' ' * (len(prefix) + start) - else: - prefix = ' ' * len(prefix) - for c in line: - if c <> '\t': c = ' ' - prefix = prefix + c - if start == end: prefix = prefix + '\\' - else: prefix = prefix + '^'*(end-start) - print prefix + for filename in files: + fp = open(filename, 'r') + lineno = 0 + while 1: + line = fp.readline() + if not line: break + lineno = lineno + 1 + if prog.search(line) >= 0: + showline(filename, lineno, line, prog) + fp.close() + +def showline(filename, lineno, line, prog): + if line[-1:] == '\n': line = line[:-1] + if opt_show_lineno: + prefix = string.rjust(`lineno`, 3) + ': ' + else: + prefix = '' + if opt_show_filename: + prefix = filename + ': ' + prefix + print prefix + line + if opt_show_where: + start, end = prog.regs()[0] + line = line[:start] + if '\t' not in line: + prefix = ' ' * (len(prefix) + start) + else: + prefix = ' ' * len(prefix) + for c in line: + if c <> '\t': c = ' ' + prefix = prefix + c + if start == end: prefix = prefix + '\\' + else: prefix = prefix + '^'*(end-start) + print prefix