C言語のソースコードのタグ打ちをしてくれるツールGNU Globalを使ってみます。
まずインストールから。ncursesもインストールしておきます。
takk@deb8:~$ sudo apt-get install ncurses-dev takk@deb8:~$ wget ftp://ftp.gnu.org/pub/gnu/global/global-6.5.6.tar.gz takk@deb8:~$ tar xzf global-6.5.6.tar.gz takk@deb8:~$ cd global-6.5.6/ takk@deb8:~/global-6.5.6$ sudo ./configure takk@deb8:~/global-6.5.6$ sudo make takk@deb8:~/global-6.5.6$ sudo make install takk@deb8:~/global-6.5.6$ cd takk@deb8:~$ global --version global (GNU GLOBAL) 6.5.6 Copyright (c) 1996-2016 Tama Communications Corporation License GPLv3+: GNU GPL version 3 or later <http://www.gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. takk@deb8:~$
globalを使うための対象C言語ソースを適当に作ります。
100個の関数を作りたいので、数列1〜100を10ファイルに区切って生成。
takk@deb8:~/dummy$ seq 100 | split -dl10 - func_
連番を分割しただけですので、この時の各ファイルの内容は以下のとおり。
takk@deb8:~/dummy$ head func* | perl -pe 's/\n/ / unless/^$/; END{print"\n"}'
==> func_00 <== 1 2 3 4 5 6 7 8 9 10 
==> func_01 <== 11 12 13 14 15 16 17 18 19 20 
==> func_02 <== 21 22 23 24 25 26 27 28 29 30 
==> func_03 <== 31 32 33 34 35 36 37 38 39 40 
==> func_04 <== 41 42 43 44 45 46 47 48 49 50 
==> func_05 <== 51 52 53 54 55 56 57 58 59 60 
==> func_06 <== 61 62 63 64 65 66 67 68 69 70 
==> func_07 <== 71 72 73 74 75 76 77 78 79 80 
==> func_08 <== 81 82 83 84 85 86 87 88 89 90 
==> func_09 <== 91 92 93 94 95 96 97 98 99 100 
takk@deb8:~/dummy$ 
数字だけの中身を関数に置換します。各関数の処理は、次の関数の呼び出しとしています。コメfunc_100が呼び出すfunc_101は存在しません。
takk@deb8:~/dummy$ for i in func_*;do perl -pe 's/^(\d+)$/sprintf"void func_%03d(void)\n{\n\tfunc_%03d();\n}\n",$1,$1+1/e' -i $i;done
各ファイルの拡張子を.cに変更します。
takk@deb8:~/dummy$ rename 's/$/.c/' func_*
takk@deb8:~/dummy$ ls
func_00.c  func_02.c  func_04.c  func_06.c  func_08.c
func_01.c  func_03.c  func_05.c  func_07.c  func_09.c
takk@deb8:~/dummy$ head func_00.c 
void func_001(void)
{
	func_002();
}
void func_002(void)
{
	func_003();
}
takk@deb8:~/dummy$ 
これでglobalの確認用の適当ソースができました。
globalコマンドを使う前の準備としてタグ打ちをします。
takk@deb8:~/dummy$ gtags
では使っていきましょう。
 -fオプションから。
 ファイルに含まれる関数一覧を表示します。
takk@deb8:~/dummy$ global -f func_01.c func_011 1 func_01.c void func_011(void) func_012 6 func_01.c void func_012(void) func_013 11 func_01.c void func_013(void) func_014 16 func_01.c void func_014(void) func_015 21 func_01.c void func_015(void) func_016 26 func_01.c void func_016(void) func_017 31 func_01.c void func_017(void) func_018 36 func_01.c void func_018(void) func_019 41 func_01.c void func_019(void) func_020 46 func_01.c void func_020(void) takk@deb8:~/dummy$
-dオプションは指定関数の定義ファイルを表示します。
takk@deb8:~/dummy$ global -d func_055 func_05.c takk@deb8:~/dummy$
行番号や定義を見たい場合は、xオプションも併用します。
takk@deb8:~/dummy$ global -dx func_056 func_056 26 func_05.c void func_056(void) takk@deb8:~/dummy$
念の為表示された行番号の位置をsedでも表示してみましょう。
takk@deb8:~/dummy$ sed -n 26p func_05.c void func_056(void) takk@deb8:~/dummy$
-rオプションでは、コールされている場所を確認できます。
takk@deb8:~/dummy$ global -rx func_003 func_003 8 func_00.c func_003(); takk@deb8:~/dummy$



コメント
[…] ← GNU GlobalでC言語ソースを見る […]