| 
									
										
										
										
											1990-12-26 15:40:07 +00:00
										 |  |  | # 'grep' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1991-12-31 00:00:35 +00:00
										 |  |  | import regex | 
					
						
							|  |  |  | from regex_syntax import * | 
					
						
							| 
									
										
										
										
											1990-12-26 15:40:07 +00:00
										 |  |  | import string | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-01-12 23:33:52 +00:00
										 |  |  | opt_show_where = 0 | 
					
						
							|  |  |  | opt_show_filename = 0 | 
					
						
							|  |  |  | opt_show_lineno = 1 | 
					
						
							| 
									
										
										
										
											1991-12-31 00:00:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-04-06 14:03:53 +00:00
										 |  |  | def grep(pat, *files): | 
					
						
							| 
									
										
										
										
											1992-01-12 23:33:52 +00:00
										 |  |  | 	return ggrep(RE_SYNTAX_GREP, pat, files) | 
					
						
							| 
									
										
										
										
											1991-12-31 00:00:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-04-06 14:03:53 +00:00
										 |  |  | def egrep(pat, *files): | 
					
						
							| 
									
										
										
										
											1992-01-12 23:33:52 +00:00
										 |  |  | 	return ggrep(RE_SYNTAX_EGREP, pat, files) | 
					
						
							| 
									
										
										
										
											1991-12-31 00:00:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-04-06 14:03:53 +00:00
										 |  |  | def emgrep(pat, *files): | 
					
						
							| 
									
										
										
										
											1992-01-12 23:33:52 +00:00
										 |  |  | 	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) | 
					
						
							| 
									
										
										
										
											1991-12-31 00:00:35 +00:00
										 |  |  | 	syntax = regex.set_syntax(syntax) | 
					
						
							|  |  |  | 	try: | 
					
						
							|  |  |  | 		prog = regex.compile(pat) | 
					
						
							|  |  |  | 	finally: | 
					
						
							|  |  |  | 		syntax = regex.set_syntax(syntax) | 
					
						
							| 
									
										
										
										
											1992-01-12 23:33:52 +00:00
										 |  |  | 	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 |