次の問題に対する解決策を見つけようとします。
与えられたディレクトリ構造:
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
ファイルを作成します。内容は次のとおりです(この例では)。.h
top-dir
table
table
top-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
この出力形式は、たとえば目的の形式を取得するために簡単に解析する必要があります。