#! /usr/bin/python

import os, re, string, sys, getopt, signal

def version():
    print "Generic Colouriser 1.3"
    sys.exit()

def help():
    print "Generic Colouriser 1.3"
    print
    print "grc [options] command [args]"
    print
    print "Options:"
    print "-e --stderr    redirect stderr. If this option is selected, "
    print "               do not automatically redirect stdout"
    print "-s --stdout    redirect stdout, even if -e is selected"
    print "-c name --config=name    use name as configuration file for grcat"
    print "--colour=word  word is one of: on, off, auto"
    print
    sys.exit()


def keybint(signum, frame):
    global pidp
    try:
        os.kill(pidp, signal.SIGINT)
    except OSError: # if the subprocess already died
        pass


try:
    optlist, args = getopt.getopt(sys.argv[1:], "sec:", ["stdout", "stderr", "config=", "colour="] )
except:
    help()

if not args:
    help()

stdoutf = 0
stderrf = 0

# configure file for grcat
cfile = ""

colour = 1

for i in optlist:
    if i[0] in ["--stderr", "-e"]:
        stderrf = 1
    elif i[0] in ["--stdout", "-s"]:
        stdoutf = 1
    elif i[0] in ["--config", "-c"]:
        cfile = i[1]
    elif i[0] == "--colour":
        if i[1] == "on":
            colour = 1
        elif i[1] == "off":
            colour = 0
        elif i[1] == "auto":
            colour = sys.stdout.isatty()
        else:
            help()

stdoutff = 1
stderrff = 0
if stderrf == 1:
    stdoutff = 0
    stderrff = 1
if stdoutf == 1:
    stdoutff = 1

conffile = None
if cfile == "":
    home = []
    if os.environ.has_key('HOME'):
        home = [os.environ['HOME']+"/.grc/grc.conf"]
    conffilenames = home + ["/etc/grc.conf"]
    for i in conffilenames:
        if os.path.isfile(i):
            conffile = i
            break
    regexplist = []

    if conffile:
        f = open(conffile, "r")
        while 1:
            l = f.readline()
            if l == "":
                break
            if l[0] == "#" or l[0] == '\012':
                continue
            regexp = l[:-1]
            if re.search(regexp, string.join(args)):
                cfile = f.readline()[:-1]
                break

signal.signal(signal.SIGINT, keybint)

if cfile != "" and colour:
    if stdoutff:
        choo, chio = os.pipe()
    if stderrff:
        choe, chie = os.pipe()


    pidp = os.fork()
    if pidp == 0: # child
        if stdoutff:
            os.dup2(chio, 1)
            os.close(choo)
            os.close(chio)
        if stderrff:
            os.dup2(chie, 2)
            os.close(choe)
            os.close(chie)
        os.execvp(args[0], args)


    if stdoutff:
        pido = os.fork()
        if pido == 0: # child
            os.dup2(choo, 0)
            os.close(choo)
            os.close(chio)
            if stderrff:
                os.close(choe)
                os.close(chie)
            os.execvp("grcat", ["grcat", cfile])

    if stderrff:
        pide = os.fork()
        if pide == 0: # child
            os.dup2(choe, 0)
            os.dup2(2, 1)
            os.close(choe)
            os.close(chie)
            if stdoutff:
                os.close(choo)
                os.close(chio)
            os.execvp("grcat", ["grcat", cfile])

    try:
        status = os.waitpid(pidp, 0)[1]
    except OSError: # interrupted system call
        status = None
        pass # this is probably not correct
    if stderrff:
        os.close(chie)
        os.waitpid(pide, 0)
        os.close(choe)
    if stdoutff:
        os.close(chio)
        os.waitpid(pido, 0)
        os.close(choo)
    sys.exit(status and os.WEXITSTATUS(status))

else:
    pidp = os.fork() 
    if pidp == 0:
        os.execvp(args[0], args)
    try:
        status = os.wait()[1]
    except OSError: # interrupted system call
        status = None
        pass # this is probably not correct

sys.exit(status and os.WEXITSTATUS(status))


