GNU GlobalでC言語ソースを見る

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$ 

コメント

  1. […] ← GNU GlobalでC言語ソースを見る […]

タイトルとURLをコピーしました