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言語ソースを見る […]