def c_file_data_get2(self, filename): f = open(filename, 'r') allfile = f.read() f.close() ttt = self.fetch_data(allfile) #for each class which was found it c-file for key, data in ttt.iteritems(): cl_id = key lst = [] lst.append(data[0]) lst += data[1] lst = filter(lambda l: False if l == "NULL" else True, lst) if cl_id in self.cl_data: verbose_print("Class %s from file %s won't be added in the tree"%(cl_id, filename)) verbose_print("Class %s from file %s will be used as parent in inheritance"%(cl_id, self.cl_data[cl_id][const.C_FILE])) return self.cl_data[cl_id] = {const.PARENTS:lst, const.C_FILE:filename, const.FUNCS:{}} cl_name = data[2] self.cl_data[cl_id][const.C_NAME] = cl_name self.cl_data[cl_id][const.MODULE] = normalize_names([cl_name])[0].lower() self.cl_data[cl_id][const.TYPE] = data[3] self.cl_data[cl_id][const.EV_DESC] = data[5] # self.cl_data[cl_id][const.CLASS_CONSTRUCTOR] = lst[5] class_desc_ops = data[4] self.cl_data[cl_id][const.OP_DESC] = class_desc_ops[1] for tup in class_desc_ops[1]: self.cl_data[cl_id][const.FUNCS][tup[1]] = {const.OP_ID : tup[0], const.C_MACRO: ""} self.cl_data[cl_id][const.BASE_ID] = class_desc_ops[0]
def build_xml(self, cl_id): self.cl_data[cl_id][const.XML_FILE] = os.path.join(self.outdir, normalize_names([self.cl_data[cl_id][const.C_NAME]])[0] + ".xml") cl_data = self.cl_data[cl_id] module = Element(const.MODULE) module.set(const.NAME, cl_data[const.C_NAME]) SubElement(module, const.PARSE_VERSION, {const.NUM : const.VER_NUM} ) SubElement(module, const.INCLUDE, {const.NAME: os.path.split(cl_data[const.H_FILE])[1]}) cl_parent = "" cl_brothers = [] for i, l in enumerate(cl_data[const.PARENTS]): tmp = {} if l in self.cl_data: tmp = self.cl_data elif l in self.cl_incl: tmp = self.cl_incl else: print "ERROR: no parent class \"%s\" was found"%l exit(1) if i == 0: cl_parent = tmp[l][const.C_NAME] else: cl_brothers.append(tmp[l][const.C_NAME]) SubElement(module, const.EXTERN_FUNCTION, {const.NAME:cl_data[const.GET_FUNCTION]+"()", const.TYPENAME:"Eo_Class*"}) cl_brothers = ",".join(cl_brothers) instantiateable = "False" if cl_data[const.TYPE] == const.CLASS_TYPE_REGULAR: instantiateable = "True" cl = SubElement(module, const.CLASS, { const.C_NAME : cl_data[const.C_NAME], const.PARENT:cl_parent, const.EXTENSIONS:cl_brothers, const.MACRO:cl_id, const.GET_FUNCTION: cl_data[const.GET_FUNCTION], const.TYPE : cl_data[const.TYPE], const.INSTANTIATEABLE : instantiateable}) op_tag = SubElement(cl, const.OP_ID) ev_tag = SubElement(cl, const.EVENTS) m_tag = SubElement(cl, const.METHODS) if cl_data[const.BASE_ID] != "NULL": SubElement(op_tag, const.BASE_ID, {const.NAME:cl_data[const.BASE_ID]}) for k in cl_data[const.FUNCS]: SubElement(op_tag, const.XML_SUB_ID, {const.NAME:cl_data[const.FUNCS][k][const.OP_ID]}) c_macro = cl_data[const.FUNCS][k][const.C_MACRO] #if generating XML not for base class, change func name to avoid name clash func_name = k if cl_id == "EO_BASE_CLASS" else c_macro m = SubElement(m_tag, const.METHOD, {const.NAME : func_name, const.OP_ID:cl_data[const.FUNCS][k][const.OP_ID], const.C_MACRO:c_macro}) #defining parameter type if const.PARAMETERS in cl_data[const.FUNCS][k]: params = cl_data[const.FUNCS][k][const.PARAMETERS] for v_name, modifier, t, d in params: p = SubElement(m, const.PARAMETER, {const.NAME:v_name, const.MODIFIER:modifier, const.C_TYPENAME:t, const.PRIMARY_TYPE : self.typedef_resolve(t),const.DIRECTION:d}) if const.EV_DESC in cl_data: lst = cl_data[const.EV_DESC] for l in lst: SubElement(ev_tag, const.EVENT,{const.NAME:l}) res = tostring(module, "utf-8") res = minidom.parseString(res) res = res.toprettyxml(indent=" ") (h, t) = os.path.split(self.cl_data[cl_id][const.XML_FILE]) if not os.path.isdir(h): os.makedirs(h) f = open (self.cl_data[cl_id][const.XML_FILE], 'w') f.write(res) f.close()