import os,re,sys
from generator import *
class PyOutputGenerator(OutputGenerator):
def __init__(self,
errFile = sys.stderr,
warnFile = sys.stderr,
diagFile = sys.stdout):
OutputGenerator.__init__(self, errFile, warnFile, diagFile)
def beginFile(self, genOpts):
OutputGenerator.beginFile(self, genOpts)
self.basetypes = {}
self.consts = {}
self.enums = {}
self.flags = {}
self.funcpointers = {}
self.protos = {}
self.structs = {}
self.handles = {}
self.defines = {}
self.typeCategory = {}
self.mapDict = {}
def endFile(self):
dicts = [ [ self.basetypes, 'basetypes' ],
[ self.consts, 'consts' ],
[ self.enums, 'enums' ],
[ self.flags, 'flags' ],
[ self.funcpointers, 'funcpointers' ],
[ self.protos, 'protos' ],
[ self.structs, 'structs' ],
[ self.handles, 'handles' ],
[ self.defines, 'defines' ],
[ self.typeCategory, 'typeCategory' ] ]
for (dict, name) in dicts:
write(name + ' = {}', file=self.outFile)
for key in sorted(dict.keys()):
write(name + '[' + enquote(key) + '] = ', dict[key], file=self.outFile)
write('mapDict = {}', file=self.outFile)
for baseType in sorted(self.mapDict.keys()):
write('mapDict[' + enquote(baseType) + '] = ', self.mapDict[baseType], file=self.outFile)
OutputGenerator.endFile(self)
def addName(self, dict, name, value):
dict[name] = enquote(value)
def addMapping(self, baseType, refType):
if (not apiName(baseType) or not apiName(refType)):
self.logMsg('diag', 'PyOutputGenerator::addMapping: IGNORE map from', baseType, '<->', refType)
return
else:
self.logMsg('diag', 'PyOutputGenerator::addMapping: map from', baseType, '<->', refType)
if (not baseType in self.mapDict.keys()):
baseDict = {}
self.mapDict[baseType] = baseDict
else:
baseDict = self.mapDict[baseType]
if (not refType in self.mapDict.keys()):
refDict = {}
self.mapDict[refType] = refDict
else:
refDict = self.mapDict[refType]
baseDict[refType] = None
refDict[baseType] = None
def genType(self, typeinfo, name):
OutputGenerator.genType(self, typeinfo, name)
typeElem = typeinfo.elem
category = typeElem.get('category')
self.addName(self.typeCategory, name, category)
if (category == 'struct' or category == 'union'):
self.genStruct(typeinfo, name)
else:
count = len(noneStr(typeElem.text))
for elem in typeElem:
count += len(noneStr(elem.text)) + len(noneStr(elem.tail))
if (count > 0):
if (category == 'bitmask'):
requiredEnum = typeElem.get('requires')
self.addName(self.flags, name, requiredEnum)
if (requiredEnum != None):
self.addMapping(name, requiredEnum)
elif (category == 'enum'):
self.logMsg('warn', 'PyOutputGenerator::genType: invalid \'enum\' category for name:', name)
elif (category == 'funcpointer'):
self.funcpointers[name] = None
elif (category == 'handle'):
self.handles[name] = None
elif (category == 'define'):
self.defines[name] = None
elif (category == 'basetype'):
if (apiName(name)):
self.basetypes[name] = None
self.addName(self.typeCategory, name, 'basetype')
else:
self.logMsg('diag', 'PyOutputGenerator::genType: unprocessed type:', name, 'category:', category)
else:
self.logMsg('diag', 'PyOutputGenerator::genType: unprocessed type:', name)
def genStruct(self, typeinfo, typeName):
OutputGenerator.genStruct(self, typeinfo, typeName)
members = [member.text for member in typeinfo.elem.findall('.//member/name')]
self.structs[typeName] = members
memberTypes = [member.text for member in typeinfo.elem.findall('.//member/type')]
for type in memberTypes:
self.addMapping(typeName, type)
def genGroup(self, groupinfo, groupName):
OutputGenerator.genGroup(self, groupinfo, groupName)
groupElem = groupinfo.elem
enumerants = [elem.get('name') for elem in groupElem.findall('enum')]
for name in enumerants:
self.addName(self.consts, name, groupName)
self.enums[groupName] = enumerants
def genEnum(self, enuminfo, name):
OutputGenerator.genEnum(self, enuminfo, name)
self.addName(self.typeCategory, name, 'consts')
self.consts[name] = None
def genCmd(self, cmdinfo, name):
OutputGenerator.genCmd(self, cmdinfo, name)
self.addName(self.typeCategory, name, 'protos')
params = [param.text for param in cmdinfo.elem.findall('param/name')]
self.protos[name] = params
paramTypes = [param.text for param in cmdinfo.elem.findall('param/type')]
for type in paramTypes:
self.addMapping(name, type)