mirror of
https://github.com/idapython/src
synced 2026-06-08 14:47:00 +00:00
53 lines
2.1 KiB
Python
53 lines
2.1 KiB
Python
from __future__ import print_function
|
|
|
|
import os
|
|
import xml.etree.ElementTree as ET
|
|
|
|
def load_xml_for_module(xml_dir_path, module_name, or_dummy=True):
|
|
xml_tree = ET.Element("dummy") if or_dummy else None
|
|
for sfx in ["_8hpp", "_8h"]:
|
|
xml_path = os.path.join(xml_dir_path, "%s%s.xml" % (module_name, sfx))
|
|
if os.path.isfile(xml_path):
|
|
with open(xml_path) as fin:
|
|
xml_tree = ET.fromstring(fin.read())
|
|
return xml_tree
|
|
|
|
def get_toplevel_functions(xml_tree, name=None):
|
|
path = "./compounddef/sectiondef[@kind='%s']/memberdef[@kind='function']"
|
|
if name:
|
|
path = "%s/[name='%s']" % (path, name)
|
|
all_nodes = []
|
|
for section_kind in ["func", "user-defined"]:
|
|
nodes = xml_tree.findall(path % section_kind)
|
|
all_nodes.extend(map(lambda n: n, nodes))
|
|
return all_nodes
|
|
|
|
def get_single_child_element_text_contents(el, child_element_tag):
|
|
nodes = el.findall("./%s" % child_element_tag)
|
|
nnodes = len(nodes)
|
|
if nnodes == 0:
|
|
return None
|
|
text = nodes[0].text
|
|
if nnodes > 1:
|
|
print("Warning: more than 1 child element with tag '%s' found; picking first" % (child_element_tag,))
|
|
return text
|
|
|
|
def for_each_param(node, callback):
|
|
assert(node.tag == "memberdef" and node.attrib.get("kind") == "function")
|
|
plist = node.find("./detaileddescription/para/parameterlist[@kind='param']")
|
|
def get_direct_text(n, tag):
|
|
c = n.find("./%s" % tag)
|
|
if c is not None:
|
|
return " ".join(c.itertext()).strip()
|
|
for param in node.findall("./param"):
|
|
name, ptyp, desc = None, None, None
|
|
name = get_direct_text(param, "declname")
|
|
ptyp = get_direct_text(param, "type")
|
|
if name and plist is not None:
|
|
for plist_item in plist.findall("parameteritem"):
|
|
if plist_item.find("./parameternamelist/[parametername='%s']" % name) is not None:
|
|
pdesc_node = plist_item.find("./parameterdescription")
|
|
if pdesc_node is not None:
|
|
desc = " ".join(pdesc_node.itertext()).strip()
|
|
callback(name, ptyp, desc)
|