import os
import gparser
#================================================================================
class genClassDicts:
#--------------------------------------------------------------------------------
def __init__(self, godRoot, dictOutputDir, srcOutputDir):
self.godRoot = godRoot
self.dictOutputDir = dictOutputDir
if srcOutputDir == '.' : self.srcOutputDir = 'Event/'
else : self.srcOutputDir = srcOutputDir.replace('\\','/').replace('../','')
if self.srcOutputDir[-1] != '/' : self.srcOutputDir += '/'
self.packageDict = {}
self.sIncludes = []
self.sDictInstances = []
self.sClassSelections = []
self.sClassExclusions = []
#--------------------------------------------------------------------------------
def conc(self, to, src):
if src not in to : to.append(src)
return to
#--------------------------------------------------------------------------------
def clean(self, str):
str = str.replace('*','p')
str = str.replace(':','_')
str = str.replace(' ','_')
return str
#--------------------------------------------------------------------------------
def genFirstLevelIncludes(self, godPackage):
if godPackage.has_key('class'):
pass
elif godPackage.has_key('namespace'):
pass
#--------------------------------------------------------------------------------
def genPackageDict(self,godPackage):
if godPackage.has_key('class'):
self.genPackageDictClass(godPackage)
if godPackage.has_key('namespace'):
self.genPackageDictNamespace(godPackage)
return
#--------------------------------------------------------------------------------
def genPackageDictNamespace(self, godPackage):
pkg_namespace = godPackage['attrs']['namespace']
for ns in godPackage['namespace']:
ns_name = ns['attrs']['name']
includes_xml = '#include "%s%s.h"' % (self.srcOutputDir, ns_name)
self.sIncludes = self.conc(self.sIncludes, includes_xml)
typetags = [('enum','enum'),('method','function')]
for typ,tag in typetags:
try:
things = ns[typ]
for thing in things:
xml_str = ' <%s name="%s::%s::%s"/>'%(tag,pkg_namespace,ns_name,thing['attrs']['name'])
self.sClassSelections = self.conc(self.sClassSelections, xml_str)
except KeyError:
pass
return
#--------------------------------------------------------------------------------
def genPackageDictClass(self,godPackage):
pkg_namespace = godPackage['attrs']['namespace']
for cl in godPackage['class']:
clnamespace = cl['attrs'].get('namespace',pkg_namespace)
clname = clnamespace+'::'+cl['attrs']['name']
#clname = cl['attrs']['namespace']+'::'+cl['attrs']['name']
##clname = cl['attrs']['name']
# add include file line
self.sIncludes = self.conc(self.sIncludes, '#include "%s%s.h"' % (self.srcOutputDir, cl['attrs']['name']))
# get the class id
if cl['attrs'].has_key('id'):
id = cl['attrs']['id']
sid = ' id="%08x-0000-0000-0000-000000000000"' %int(id)
else:
sid=''
cnstr = ' '
trans = True
cnstr += ' ' % (attr['attrs']['name'])
if trans:
cnstr += ' '
else:
cnstr += '/>'
# add class name for selection file
self.sClassSelections = self.conc(self.sClassSelections, cnstr)
if cl.has_key('template'):
for t in cl['template']:
# name of template class
tcname = t['attrs']['name']
if tcname[-4:] == 'Dict' : tcname = tcname[:-4]
# name of first template parameter (THIS is a short cut to the class name)
t1name = t['attrs']['t1'].replace('THIS',clname)
# stl vector is a bit special
if tcname.lower() == 'vector':
# include header file
self.sIncludes = self.conc(self.sIncludes, '#include ')
# include template instantiation
self.sDictInstances = self.conc(self.sDictInstances, 'std::vector<%s> m_std_vector_%s;' % (t1name, self.clean(t1name)))
# include element for selection file
self.sClassSelections = self.conc(self.sClassSelections, ' ' % t1name)
elif tcname.lower() == 'list':
# include header file
self.sIncludes = self.conc(self.sIncludes, '#include ')
# include template instantiation
self.sDictInstances = self.conc(self.sDictInstances, 'std::list<%s> m_std_list_%s;' % (t1name, self.clean(t1name)))
# include element for selection file
self.sClassSelections = self.conc(self.sClassSelections, ' ' % t1name)
elif tcname.lower() == 'map':
t2name = t['attrs']['t2'].replace('THIS',clname)
# include header file
self.sIncludes = self.conc(self.sIncludes, '#include