def parse_recursive(include_path): """recursively parse a header file, including all the includes inside it. :param include_path: stdio.h :return a set contains all defines,structs,functions """ logger.info('parsing: '+include_path) typedefs = set() defines = set() functions = set() to_parse_set = set() to_parse_set.add(include_path) parsed_set = set() while to_parse_set: include_path = to_parse_set.pop() parsed_set.add(include_path) full_path = include_path_to_full_path(include_path) if not full_path: logger.warning('this header does not exists: '+include_path) continue xml = srcmlutil.get_xml_from_file(full_path) doc = parseString(xml) for typedef_node in doc.getElementsByTagName('typedef'): name_node = domutil.get_first_child_by_tagname(typedef_node, 'name') name = domutil.get_text_content(name_node) if name and not name.startswith('_'): typedefs.add(name) for struct_node in doc.getElementsByTagName('struct'): name_node = domutil.get_first_child_by_tagname(struct_node, 'name') name = domutil.get_text_content(name_node) if name and not name.startswith('_'): typedefs.add(name) for define_node in doc.getElementsByTagName('cpp:define'): name_node = domutil.get_first_child_by_tagnames(define_node, 'cpp:macro', 'name') name = domutil.get_text_content(name_node) if name and not name.startswith('_'): defines.add(name) for function_node in doc.getElementsByTagName('function_decl'): name_node = domutil.get_first_child_by_tagname(function_node, 'name') name = domutil.get_text_content(name_node) if name and not name.startswith('_'): functions.add(name) for include_node in doc.getElementsByTagName('cpp:include'): name_node = domutil.get_first_child_by_tagname(include_node, 'cpp:file') name = domutil.get_text_content(name_node) name = name[1:-1] # remove "<>" if name not in parsed_set | to_parse_set: to_parse_set.add(name) return typedefs | defines | functions
def get_doc_from_c_file(file): xml = srcmlutil.get_xml_from_file(file) doc = parseString(xml) return doc