#!/usr/bin/python -tt import warnings import traceback import sys import os import re # output "constants" LOG_FATAL = 0 LOG_ERROR = 1 LOG_WARN = 2 LOG_ALWAYS = 2.5 LOG_NORMAL = 3 LOG_INFO = 4 LOG_DEBUG = 5 msgPrefixes = [ "FATAL: ", "ERROR: ", "WARNING: ", "", "INFO: ", "DEBUG: " ] null = open('/dev/null', 'r+') #local variables currentLevel = LOG_NORMAL logFile = None targets = [] headerFile = '/usr/include/iguanaIR.h' def dieCleanly(level = None): """Exit the application with proper cleanup.""" if level == None: level = LOG_ERROR #exit with appropriate value if level == LOG_FATAL: sys.exit(1) sys.exit(0) def message(level, msg): """Print a message to a certain debug level""" retval = None if level <= currentLevel or level == LOG_ALWAYS: out = sys.stdout # if logfile is open print to it instead if logFile == "-": out = sys.log elif level <= LOG_WARN: out = sys.stderr retval = msgPrefixes[int(level + 0.5)] + msg out.write(retval) retval = len(retval) if level <= LOG_FATAL: dieCleanly(level) return retval def printUsage(msg = None): usage = "Usage: " + sys.argv[0] + " [OPTION]..." + """ -h --help : Print this usage message. --header : Where to get the header to parse apart. -l --log-file : Specify a log to receive all messages. -q --quiet : Decrease verbosity. -v --verbose : Increase verbosity. """ if msg != None: message(LOG_FATAL, msg + usage) message(LOG_ALWAYS, usage) dieCleanly(LOG_ALWAYS) index = 1 while index < len(sys.argv): arg = sys.argv[index] if arg == "-h" or arg == "--help": printUsage() elif arg == "--header": index += 1 headerFile = sys.argv[index] elif arg == "-l" or arg == "--log-file": index += 1 logFile = sys.argv[index] if logFile == "-": logFile = None elif arg == "-q" or arg == "--quiet": if currentLevel > LOG_FATAL: currentLevel -= 1 elif arg == "-v" or arg == "--verbose": currentLevel += 1 else: targets.append(arg) index += 1 # open the log file if specified if logFile != None: sys.log = open(logFile, "a", 1) logFile = "-" input = open(headerFile, 'r') bodies = {} filename = None for line in input: # reformat the max after a blank line if filename and not line.strip(): while True: match = re.search('([^\s:]*:)EQU', bodies[filename]['body']) if match: bodies[filename]['body'] = bodies[filename]['body'].replace(match.group(1), match.group(1) + (' ' * (bodies[filename]['max'] - len(match.group(1)) + 2))) else: break match = re.match('\s*(IG_.*?)\s*=\s*(.*),', line) if match: if filename is not None: (name, value) = match.groups() name = name.replace('IG_DEV', 'CTL') name = name.replace('IG_', '') bodies[filename]['body'] += '%s:EQU %s\n' % (name, value) if len(name) > bodies[filename]['max']: bodies[filename]['max'] = len(name) else: match = re.match('\s*/\*\s*([^\s:]+):([^\s]+)\s*(.*?)\s*\*/', line) if match: filename = None if match.group(1) == 'FILE': filename = match.group(2) if filename not in bodies: bodies[filename] = { 'body' : '', 'max' : 0 } else: bodies[filename]['body'] += '\n' bodies[filename]['body'] += '; %s\n' % match.group(3) else: match = re.match('\s*/\*(.*?)\s*\*/', line) if match: filename = None input.close() for path in targets: filename = os.path.split(path)[1] try: input = open('%s.in' % path, 'r') except IOError: message(LOG_WARN, "Failed to find %s.in\n" % filename) else: message(LOG_INFO, "Inserting text into %s.in\n" % filename) output = open(path, 'w') for line in input: if line == ';INSERT_CODES_HERE\n': output.write(bodies[filename]['body']) else: output.write(line) output.close() input.close()