2013-06-02 5 views
6

私はCファイルと関数名を渡すスクリプトが必要であり、そのC関数をファイルから削除します。これを行うユーティリティはありますか?Cファイルから関数を削除するプログラム(またはsedスクリプト)はありますか?

私は基本的に、内部で開発されたライブラリをオープンソースにしたいと考えています。しかし、私はソースをオープンできない特定の機能があります。私はオープンソースではないファイル全体を削除するためにgit filter-branchを使用していましたが、ファイルの一部がオープンソースであるかもしれないファイルから特定の関数を削除する必要があるところに達しました。 git filter-branchはコミットごとにコマンドを実行するので、リポジトリのコミットごとにこの関数を削除する自動化されたものが必要です。

+0

「リファクタリングツール」は多分探していますか? –

+0

+1の質問 – nsd

答えて

2

開いていないC関数をすべて別のファイル/ライブラリにリファクタリングできませんか?これはうまくいくものですが、公開されるたびにソースコードを変更するよりもきれいで、おそらく長期的には維持しやすくなります。

リファクタリングがオプションでない場合、perlベースのCソースコードパーサーがhttp://search.cpan.org/~jtbraun/Parse-RecDescent-1.967009/demo/demo_another_Cgrammar.plにあります。いくつかのハッキングのように見えますが、不要な機能を除外することができます。

0

実際にawkは簡単に削除できるようにフォームにご希望の関数定義を正規化することであろうCコードを解析せずに移動するための方法は、「}」

sometype_t *function (type_t arg, ...) 
{ 
    ... 
} 

言うと、その後のマッチングに関数定義から削除します行の先頭に固定されています。既に適切なインデントを使用している場合は、それは簡単にする必要があります。このような理由から、戻り値の型の下に関数名を置く必要があるというコーディング規則を見てきました。これはこれをさらに簡単にします。

+0

FYI、コーディングスタイルはGNUスタイルです。 –

3

lreederと同じように、オープンソースと非公開のものが異なるファイル/ライブラリになるようにリファクタリングすることをお勧めします。

しかし、それがうまくいかない場合は、でなく、のコードを完全に解析する必要があります。代わりに、//PRIVATE//END-PRIVATEのようなコメントの間にファイルのプライベート部分を置くような簡単なことができます。その後、プライベートセクションを削除するには、このrubyスクリプトを使用することができます。

#!/usr/bin/ruby 

# remove_private.rb: Removes all lines between "PRIVATE" and "END-PRIVATE" 
# 
# Usage 1, output to STDIO: cat filename.c | ruby remove_private.rb 
# Usage 2, output to STDIO: ruby remove_private.rb filename.c 
# Usage 3, in-place editing of file (and creating a backup): ruby -i.bak remove_private.rb filename.c 

while line = ARGF.gets 
    unless (line =~ /PRIVATE/)..(line =~ /END-PRIVATE/) 
    puts line 
    end 
end 

これは、コードを短くするためにルビーのいくつかの魔法と便利な機能を使用していますが、私はフルよりデバッグし、維持するために非常に簡単になると思いますCパーサ。また、開発者は、コードで作業している間に、どの機能がプライベートであるかを簡単に確認することができます。私はMakefileの一部をリリースしたいところで作業していたプロジェクトで、これに非常に似た何かをしましたが、全部ではありません。たぶん、会社のお気に入りのスクリプト言語で書き直すことができます。

+0

あるいは、コードを '#ifdef PRIVATE' ...' #endif/* PRIVATE */'に入れて、コードが欠落していないことを簡単にテストできます。 – tripleee

0

Emacs。関数定義を含むテキストの領域を選択する方法はすでに分かっており、他の多くの方法よりも特定のコーディングスタイルに依存することは少ないでしょう。そうすれば、何かが見逃される可能性は低くなります。 emacsのlispスクリプトを少し使って、ソースツリー全体を非対話的に検索させることができます。

関連する問題