Exemplo n.º 1
0
def func(directory):
    for root,_,files in os.walk(directory):
        for f in files:
            if f.endswith('.c'):
                filename = os.path.join(root, f)
                print(filename)
                with tempfile.TemporaryFile() as fp:
                    with open(filename) as f:
                        change_count = 0
                        for line in f:
                            if line.strip().endswith(';') and ',' in line:
                                if line.count('(') == line.count(')'):
                                    doc = domutil.get_doc_from_code(line)
                                    unit_nodes = doc.getElementsByTagName('unit')
                                    unit_node = unit_nodes.item(0)
                                    decl_stmt_node = domutil.get_first_child_by_tagname(unit_node, 'decl_stmt')
                                    if domutil.is_element(decl_stmt_node) and decl_stmt_node.tagName == 'decl_stmt':
                                        decl_nodes = domutil.get_children_by_tagname(decl_stmt_node, 'decl')
                                        if len(decl_nodes) > 1:
                                            change_count+=1
                                            # result = syntaxutil.parse_decl_stmt_code(line)
                                            full_type = get_type(line)
                                            # FIXME job *job, *sj = deserializeJob(nextjob,remlen,&nextjob,SER_MESSAGE);
                                            if full_type and '(' not in line:
                                                variables = line.split(',')[:]
                                                var1 = variables[0]
                                                line = var1 + ';\n' + ';\n'.join([full_type + ' ' + var for var in variables[1:]])
                            fp.write(line.encode('utf8'))
                        print('made '+str(change_count)+' changes to file: ' + filename)
                    fp.seek(0)
                    content = fp.read().decode('utf8')
                    with open(filename, 'w') as f:
                        f.write(content)
Exemplo n.º 2
0
def parse_parameter_list(node):
    """Parse a <parameter_list> of a function.
    :return ((type1,var1), (type2,var2), ...)
    """
    assert(domutil.is_element(node) and node.tagName == 'parameter_list')
    result = []
    for param_node in domutil.get_children_by_tagname(node, 'param'):
        decl_node = domutil.get_first_child_by_tagname(param_node, 'decl')
        if decl_node:
            type_name,var_name,_ = parse_decl(decl_node)
            result.append((type_name, var_name))
    return result
Exemplo n.º 3
0
def parse_struct(node):
    """Parse a <struct> node
    Do not anonymous inner enum, union or structs.
    :return (name, [(type1, field1), (type1, field1), ...])
    """
    assert(domutil.is_element(node) and node.tagName == 'struct')
    name_node = domutil.get_first_child_by_tagname(node, 'name')
    block_node = domutil.get_first_child_by_tagname(node, 'block')
    if name_node:
        name = domutil.get_text_content(name_node)
    else:
        name = ''
    fields = []
    for decl_stmt_node in domutil.get_children_by_tagname(block_node, 'decl_stmt'):
        decl = parse_decl_stmt(decl_stmt_node)
        fields.append(decl[0:2])
    return (name, fields)
Exemplo n.º 4
0
def parse_expr(node):
    """Parse a <expr>
    :retrn a set of variable names used.
    :bug it=(item*)ptr; the type cast will be recognized as name
    :bug there may be <expr> inside <expr>
    """
    assert(domutil.is_element(node) and node.tagName == 'expr')
    name_nodes = domutil.get_children_by_tagname(node, 'name')
    names = set()
    for name_node in name_nodes:
        name = domutil.get_text_content(name_node)
        # TODO move array related code into util
        names.add(simplify_variable_name(name))
    # for a->b
    double_name_node = domutil.get_first_child_by_tagnames(node, 'name', 'name')
    if double_name_node:
        name = domutil.get_text_content(double_name_node)
        names.add(simplify_variable_name(name))
    return names