# 'grep'

import regex
from regex_syntax import *
import string

opt_show_where = 0
opt_show_filename = 0
opt_show_lineno = 1

def grep(pat, *files):
	return ggrep(RE_SYNTAX_GREP, pat, files)

def egrep(pat, *files):
	return ggrep(RE_SYNTAX_EGREP, pat, files)

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)
	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
