Linux Tips: 批量修改C语言工程的函数命名风格(Shell+Python方法)

  • 通过ctags解析工程目录中所有函数
# 遍历所有C文件并将解析出的函数名放在funcs文件中
find ./ -name "*.[ch]" -exec ctags -x --c-types=f {} \; | awk '{print $1}' >> funcs
  • 通过python脚本生成函数转换表并转换
#!/usr/bin/python3
# -*- coding=utf-8 -*-

import os
import sys
import subprocess

def style_convert(func):
    ''' 函数命名风格转换
    小写加下划线转换为驼峰方式'''

    new_func = func[0]
    for i in range(1, len(func)):
        if func[i] == '_':
            func[i + 1] = func[i + 1].upper()
        else:
            new_func += func[i]

    return new_func

def codestyle_covert(prj_dir):
    ''' 转换一个工程目录下所有C文件的函数命名风格 '''

    # 读取待转换函数
    funcs_file = '{}/funcs'.format(prj_dir)
    with open(funcs_file, 'r') as f:
        funcs = f.readlines()

    # 去掉换行符
    funcs = [func.strip() for func in funcs]

    # 生成函数转换表
    funcmap = [(func, style_convert(list(func))) for func in funcs]

    # 获取工程目录下所有.c.h文件
    cmd = ['find', prj_dir, '-name', '*.[ch]']
    files = subprocess.check_output(cmd).decode('utf-8').split()

    # 对所有文件执行函数替换操作
    for f in files:
        print("Coverting {}...".format(f), end='', flush=True)
        for fm in funcmap:
            cmd = ['sed', '-i', r's/\<{}\>/{}/g'.format(fm[0], fm[1]), f]
            subprocess.call(cmd)
            print('.', end='', flush=True)
        print('.done')


def main():
    if len(sys.argv) < 2:
        print("[Error]: No input project directory.")
        exit(0)

    prj_dir = sys.argv[1];
    if not os.path.isdir(prj_dir):
        print("Invalid project directory:", prj_dir)
        exit(0)

    codestyle_covert(prj_dir)

if __name__ == '__main__':
    main()
  • 实例展示
  1. 转换前工程目录状况和函数定义

  2. 解析所有函数

  3. 执行转换,再次查看函数定义

posted @ 2021-10-26 14:01  TpCode  阅读(236)  评论(0编辑  收藏  举报