はい、それができるツールがあります。必要なのは、CをASTに解析し、関数内のデータフローを判別し、データフローをガイドとして使用してASTを変換し、変換されたツリーからテキストを再生成できるプログラム変換ツールです。
直面しなければならない問題の1つは、関数を分割する場所をツールに指示する方法です。サブ機能としてどの部分が必要ですか?間違いなく、任意のセットを指定できます関数内の関数(割り当て、部分式、またはステートメント)の操作をサブ関数に入れるには、一般にそれだけの制御が必要です。これは、かなり長く詳細な説明になる可能性があります(おそらく行/列のペアのセット)。ただし、「操作のみをサポートするすべてのものを置く」などの自動選択が必要になることがよくあります。データフロー分析を備えたツールは、操作から後方スライスを計算し、後方スライスのどの部分が操作にのみ使用されているかを調べ、対応するコードを移動できます。実際問題として、これらのアイデアを組み合わせる必要があります。いずれの場合も、ツールは何を移動する必要があるかを認識します。指定されたコードをサブルーチンに移動することは、「単なる」一連の標準的なプログラム変換です。ほとんどのコンパイラには、これを行うための内部機構があります。
この決定を下せるように、ツールにコードのインタラクティブなグラフィカルスライスビューを提供することもできます。(Grammatechは、まさにこれを行うCodeSurferと呼ばれるCスライシングツールを提供しています)。
このようなスライスを計算してコード変換を実行できるツールは、 Cフロントエンドを備えたDMSソフトウェアリエンジニアリングツールキットです。(CodeSurferのようにインタラクティブではありませんが、CodeSurferはコードを変更できません)。その特定のタスクを実装するようにDMSを構成する必要があります。上記のすべての機械があります。実際問題として、これは、1つの機能を手作業で分割するのにかかる労力よりも多くの作業になる可能性があります。
そうは言っても、あなたはまだ関数を分割する方法を決めることに固執しています。そして、それはツールではなく、あなたが抱えている実際の問題のようです。