Class around PixMap objects that allows more python-like access. By Joe Strout.
[python/dscho.git] / Lib / grep.py
blob423c065af78507f732667f3640ab5d84a744d7ce
1 # 'grep'
3 import regex
4 from regex_syntax import *
5 import string
7 opt_show_where = 0
8 opt_show_filename = 0
9 opt_show_lineno = 1
11 def grep(pat, *files):
12 return ggrep(RE_SYNTAX_GREP, pat, files)
14 def egrep(pat, *files):
15 return ggrep(RE_SYNTAX_EGREP, pat, files)
17 def emgrep(pat, *files):
18 return ggrep(RE_SYNTAX_EMACS, pat, files)
20 def ggrep(syntax, pat, files):
21 if len(files) == 1 and type(files[0]) == type([]):
22 files = files[0]
23 global opt_show_filename
24 opt_show_filename = (len(files) != 1)
25 syntax = regex.set_syntax(syntax)
26 try:
27 prog = regex.compile(pat)
28 finally:
29 syntax = regex.set_syntax(syntax)
30 for filename in files:
31 fp = open(filename, 'r')
32 lineno = 0
33 while 1:
34 line = fp.readline()
35 if not line: break
36 lineno = lineno + 1
37 if prog.search(line) >= 0:
38 showline(filename, lineno, line, prog)
39 fp.close()
41 def pgrep(pat, *files):
42 if len(files) == 1 and type(files[0]) == type([]):
43 files = files[0]
44 global opt_show_filename
45 opt_show_filename = (len(files) != 1)
46 import re
47 prog = re.compile(pat)
48 for filename in files:
49 fp = open(filename, 'r')
50 lineno = 0
51 while 1:
52 line = fp.readline()
53 if not line: break
54 lineno = lineno + 1
55 if prog.search(line):
56 showline(filename, lineno, line, prog)
57 fp.close()
59 def showline(filename, lineno, line, prog):
60 if line[-1:] == '\n': line = line[:-1]
61 if opt_show_lineno:
62 prefix = string.rjust(`lineno`, 3) + ': '
63 else:
64 prefix = ''
65 if opt_show_filename:
66 prefix = filename + ': ' + prefix
67 print prefix + line
68 if opt_show_where:
69 start, end = prog.regs()[0]
70 line = line[:start]
71 if '\t' not in line:
72 prefix = ' ' * (len(prefix) + start)
73 else:
74 prefix = ' ' * len(prefix)
75 for c in line:
76 if c <> '\t': c = ' '
77 prefix = prefix + c
78 if start == end: prefix = prefix + '\\'
79 else: prefix = prefix + '^'*(end-start)
80 print prefix