+ return elem.getElementsByTagName(path)
+
+def get_text_contents(node):
+ result = ""
+ for c in node.childNodes:
+ if c.nodeType==xml.dom.Node.TEXT_NODE or c.nodeType==xml.dom.Node.CDATA_SECTION_NODE:
+ result += c.data
+ else:
+ result += get_text_contents(c)
+ return result
+
+def parse_file(fn):
+ doc = xml.dom.minidom.parse(fn)
+ root = doc.documentElement
+ commands = get_nested_elements(root, "commands/command")
+ for cmd in commands:
+ proto = cmd.getElementsByTagName("proto")[0]
+ name = get_text_contents(proto.getElementsByTagName("name")[0])
+ func = things.get(name)
+ if not func:
+ func = Function(name)
+ things[name] = func
+
+ aliases = cmd.getElementsByTagName("alias")
+ for a in aliases:
+ func.aliases.append(a.getAttribute("name"))
+
+ vec = cmd.getElementsByTagName("vecequiv")
+ if vec:
+ func.vectorequiv = vec[0].getAttribute("name")
+
+ ptype = proto.getElementsByTagName("ptype")
+ if ptype:
+ func.return_type = get_text_contents(ptype[0])
+ else:
+ for c in proto.childNodes:
+ if c.nodeType==xml.dom.Node.TEXT_NODE and c.data.strip():
+ func.return_type = c.data.strip()
+ break
+
+ params = cmd.getElementsByTagName("param")
+ for p in params:
+ func.params.append(get_text_contents(p))
+
+ enums = get_nested_elements(root, "enums/enum")
+ for en in enums:
+ name = en.getAttribute("name")
+ enum = things.get(name)
+ if not enum:
+ enum = Enum(name)
+ things[name] = enum
+
+ enum.value = int(en.getAttribute("value"), 16)
+
+ features = root.getElementsByTagName("feature")
+ for feat in features:
+ api = feat.getAttribute("api")
+ if api=="gl":
+ version = feat.getAttribute("number")
+
+ commands = get_nested_elements(feat, "require/command")
+ enums = get_nested_elements(feat, "require/enum")
+ for t in itertools.chain(commands, enums):
+ name = t.getAttribute("name")
+ thing = things.get(name)
+ if thing:
+ thing.version = version
+
+ if feat.getAttribute("name")=="MSPGL_REMOVE":
+ commands = get_nested_elements(feat, "remove/command")
+ enums = get_nested_elements(feat, "require/enum")
+ for t in itertools.chain(commands, enums):
+ name = t.getAttribute("name")
+ if name in things:
+ del things[name]