Example #1
0
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
Example #2
0
def get_doc_from_c_file(file):
    xml = srcmlutil.get_xml_from_file(file)
    doc = parseString(xml)
    return doc