#!/usr/bin/env python """ Create the winerror module from the data found in the Windows Platform SDK WinError.h file. (c) 2006, Marc-Andre Lemburg. All Rights Reserved. """ import re WINERROR_H = 'WinError.h' MODULE_LAYOUT = """\ # # winerror module # # Generated from the Windows Platform SDK include file WinError.h # # Lookup object; later to be replaced by an implementation written in C class _WinError: # Code to name dictionary %s # Lookup code def __init__(self): namespace = self.__dict__ for code, name in self.code2name.iteritems(): namespace[name] = code def get_name(self, code): return self.code2name[code] # Create the lookup object winerror = _WinError() """ ERROR_DEF_RE = re.compile('#define\s+(ERROR_[A-Z0-9_]+)\s+([0-9]+)') def parse_defs(filename): file = open(filename) d = {} for line in file: m = ERROR_DEF_RE.match(line) if m is None: continue symbol, value = m.groups() d[symbol] = int(value) return d def generate_python_dict_literal(dictname, data, indent=''): items = data.items() items.sort() maxkeylength = max([len(repr(key)) for key in data.iterkeys()]) formatstring = '%s %%-%ir: %%r,' % (indent, maxkeylength) l = ['%s%s = {' % (indent, dictname)] l.extend([formatstring % (key, value) for (key, value) in items]) l.append('%s}' % indent) return '\n'.join(l) def invdict(d): return dict([(value, key) for (key, value) in d.iteritems()]) def generate_python_attribute_definitions(data, indent=''): items = data.items() items.sort() maxkeylength = max([len(repr(key)) for key in data.iterkeys()]) formatstring = '%s%%-%is = %%r' % (indent, maxkeylength) l = [formatstring % (key, value) for (key, value) in items] return '\n'.join(l) def generate_winerror_module(data): return MODULE_LAYOUT % ( generate_python_dict_literal('code2name', invdict(data), indent=' ')) if __name__ == '__main__': import sys if len(sys.argv) < 2: winerror_h = WINERROR_H else: winerror_h = sys.argv[1] data = parse_defs(winerror_h) print generate_winerror_module(data)