#!%%PYTHON_CMD%% import os, re, string, sys, getopt, signal def version(): print "Generic Colouriser 1.1" sys.exit() def help(): print "Generic Colouriser 1.1" 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): try: os.kill(pid1, signal.SIGINT) except: # 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 + ["%%PREFIX%%/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: cho, chi = os.pipe() pid1 = os.fork() if pid1 == 0: # child if stdoutff: os.dup2(chi, 1) if stderrff: os.dup2(chi, 2) os.close(cho) os.close(chi) os.execvp(args[0], args) pid2 = os.fork() if pid2 == 0: # child os.dup2(cho, 0) os.close(chi) os.close(cho) os.execvp("grcat", ["grcat", cfile]) try: status = os.waitpid(pid1, 0)[1] except OSError: # interrupted system call status = None pass # this is probably not correct os.close(chi) os.waitpid(pid2, 0) os.close(cho) sys.exit(status and os.WEXITSTATUS(status)) else: if os.fork() == 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))