#!/usr/bin/env python """ Create the winerror module from the data found in the Windows Platform SDK WinError.h file. """ import re WINERROR_H = './WinError.h' MODULE_LAYOUT = """\ # # winerror module # # Generated from the Windows Platform SDK include file WinError.h # # Error symbols %s # Error codes dictionary %s """ 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): items = data.items() items.sort() maxkeylength = max([len(repr(key)) for key in data.iterkeys()]) formatstring = ' %%-%ir: %%r,' % maxkeylength l = ['%s = {' % dictname] l.extend([formatstring % (key, value) for (key, value) in items]) l.append('}') return '\n'.join(l) def invdict(d): return dict([(value, key) for (key, value) in d.iteritems()]) def generate_python_attribute_definitions(data): items = data.items() items.sort() maxkeylength = max([len(repr(key)) for key in data.iterkeys()]) formatstring = '%%-%is = %%r' % maxkeylength l = [formatstring % (key, value) for (key, value) in items] return '\n'.join(l) def generate_winerror_module(data): return MODULE_LAYOUT % ( generate_python_attribute_definitions(data), generate_python_dict_literal('errorcode', invdict(data))) if __name__ == '__main__': data = parse_defs(WINERROR_H) print generate_winerror_module(data)