def _bitfield_types(self, fname): with cxxheader(fname, self.hdr_bitfields_h, ['df']) as f: for e in etx('bitfield-type')(self.woot): type_t, lines, unused = bitfield_t(e) self.emitted.add(type_t) for l in lines: f.write(self.indent + l + "\n");
def getaddr(name): xpa = "symbol-table[@name='{version}']/global-address[@name='{global_name}']".format( version = self._version, global_name = name) el = etx(xpa)(self.woot) try: return el[0].get('value') except IndexError: return None
def eat(self, fname): t = etree.parse(fname, self._p).getroot() etree.strip_elements(t, "comment", "code-helper") etree.strip_tags(t, "virtual-methods") for e in t.iter(): if isinstance(e, etree._Comment): e.getparent().remove(e) else: e.tail = e.text = None try: e.set("xmlfilename", fname) except TypeError: pass self.woot.extend( etx('*')(t) )
def _compound_types(self, fname): global df_type_tab els = etx("struct-type")(self.woot) + etx("class-type")(self.woot) types = {} for e in els: type_t, lines, deps = struct_t(e) df_type_tab[e.get('type-name')] = 'df::' + type_t types[e.get('type-name')] = (lines, deps) all = set(types.keys()) with cxxheader(fname, self.hdr_structs_h, ['df']) as f, io.StringIO() as stuff: f.write(self.indent.join(self.df_helper_defs)) for tname in all: # emit forward decls for all f.write(self.indent + 'struct ' + tname + ";\n") while len(all) > 0: for tname in all: #print("{} :{}".format(tname, types[tname][1])) if len(types[tname][1]) == 0: for l in types[tname][0]: stuff.write(self.indent + l + "\n") self.emitted.add(tname) _a = len(all) _e = len(self.emitted) all.difference_update(self.emitted) if _a == len(all): print("error: type dependency loop.") for tn in all: deps = types[tn][1] aid = all.intersection(deps) if len(aid) == 0: # deps of type can't be fullfilled by any in all print("{}: {}".format(tn, deps)) for d in deps: print (d, types[d][1]) raise Error for tname in all: types[tname][1].difference_update(self.emitted) f.write(stuff.getvalue())
def _globals(self, hfname, ccfname): global df_type_tab, static_crap def getaddr(name): xpa = "symbol-table[@name='{version}']/global-address[@name='{global_name}']".format( version = self._version, global_name = name) el = etx(xpa)(self.woot) try: return el[0].get('value') except IndexError: return None gcode = open(ccfname, "w") gcode.write(self.hdr_globals_h) gcode.write('#include "globals.h"\n\n') with cxxheader(hfname, self.hdr_globals_h, ['df', 'global']) as ghead: for e in etx("global-object")(self.woot): name = e.get('name') type_t, decl, deps = pointer_t(e) if decl: for l in decl: ghead.write(self.indent + l + "\n") df_type_tab[type_t] = 'df::global::' + type_t ghead.write("{indent}extern {type_t} const {name};\n".format( type_t = type_t, name = name, indent = self.indent)) address = getaddr(name) name = 'df::global::' + name if address is None: print("warning: no address for ``{} {}'', assuming NULL.".format(type_t, name)) address = 'NULL' gcode.write("{type_t} const {name} = ({type_t}) {value};\n".format( type_t = df_type_tab.get(type_t, type_t), name = name, value = address)) for l in static_crap: gcode.write(l + "\n") gcode.close()