Cプログラムで関数を見つけるスクリプト

Cプログラムで関数を見つけるスクリプト

次の問題に対する解決策を見つけようとします。

与えられたディレクトリ構造:

project/
bridge/
    mysql_bridge.c
    postgres_bridge.c

私のコードは、.cファイルのすべての関数とルートフォルダのサブディレクトリにあるすべてのcプログラム*を検索する必要があります。

  • mysql_bridge.c
  • postgres_bridge.c

ソースファイルが見つからない場合、スクリプトは「ソースファイルが見つかりません」を出力する必要があります。特に、検索する唯一のソースファイルは.cファイルです(ヘッダーは無視されます)。

プロジェクトのルートとしてコマンドラインパラメータを使用したいと思います。シナリオは次のとおりです。

例1:

./findfn.sh project_1
project_1/ever/jump.c:
void logical_jump(int loc)
int ngoto()

project_1/indent/handle.c:
FILE* figure_out_this(char* name)
void kill_all()

project_1/mac.c:
void some(void)
int super_function(int xx, int ya)

project_1/test.c:
void this_function()

例2:無効なディレクトリ

./findfn.sh file
file is not a directory

例3:機能が見つかりません

./findfn.sh project_2
Unable to find any functions

ベストアンサー1

ACソースファイルは、他の構造化データファイルと同じように解析するのが困難です。直接処理しようとするのではなく、言語の構文を理解するパーサーを使用する方が良いです。

あなたが持っていると仮定活気に満ちたcタグ次のようにインストールされますectags

find top-dir -type f -name '*.[ch]' -exec ectags -x --c-kinds=f {} ';' >table

その後、その中またはその下のすべてのファイルを見つけて.cファイルを作成します。内容は次のとおりです(この例では)。.htop-dirtabletabletop-dir.

GetTimeSeed      function    373 ./src/bayes.c    void GetTimeSeed (void)
InitializeMrBayes function    443 ./src/bayes.c    int InitializeMrBayes (void)
PrintHeader      function    821 ./src/bayes.c    void PrintHeader (void)
ReinitializeMrBayes function    838 ./src/bayes.c    int ReinitializeMrBayes (void)
main             function    101 ./src/bayes.c    int main (int argc, char *argv[])
readline_completion function    359 ./src/bayes.c    char **readline_completion (const char *text, int start, int stop)

(等)

awkこの出力形式は、たとえば目的の形式を取得するために簡単に解析する必要があります。

おすすめ記事