1. 程式人生 > 其它 >Linux Tips: 一種批量修改C語言工程的函式命名風格的方法

Linux Tips: 一種批量修改C語言工程的函式命名風格的方法

  • 通過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. 執行轉換,再次檢視函式定義