閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

GC(GreatCode) を hack してみた

GC(GreatCode) という C/C++ソースコードを整形するためのツールがあります。日本ではあまり知られていないようで、検索してもあんまりヒットしませんが、たぶん C++ ソースを整形できるツールの中では一番強力なものではないかと思います。設定できる条件がとても多くて自分好みにカスタマイズできて楽しいです。その分設定が大変ではありますが。

ただ、それだけたくさんの設定項目があっても、まだ物足りない部分が。コンストラクタの初期化リストを自分はいつも以下のように書いているのですが、これができないため違和感のあるコードに整形されてしまって、ちょっと不満がありました。

//! クラス hoge のコンストラクタ
hoge::hoge()
  : super(0)
  , member1(permanent)
  , member2(megane)
{}

GC だと、初期化リストを改行無しに挿入するか、あるいはカンマの後に改行する、といったものしか用意されていないのです。整形かけてから手で修正するなんて有り得ないし……誰かぼすけて、と脳の中心でヘルプを求めても誰も助けてくれやしないので、自分で hack してこの整形に対応させてしまおうと思い立ち、やってみました。

オープンソースなのでソースは手元にあるし、ドキュメントは何もないけど小規模なプログラムなのでソースだけでもなんとかなるだろう、ととりあえずソースを読んでみる。C 言語のソースだけど読みやすい。変数名はちゃんとしているし、コメントもちゃんと書いてある(英語なので読めないけど)ので意味もわかる。これならいけるかな?

いけました。

*** indent_eol_org.c	Tue Jul 19 08:13:06 2005
--- indent_eol.c	Fri Oct 21 10:42:39 2005
***************
*** 2434,2439 ****
--- 2434,2446 ----
  					pcur->ForceEOLAfter = 0;
  					pcur->ForceSpaceAfter = 1;
  				}
+ 				else if(Config.ConstructStyle == 3)
+ 				{
+ 					pcur->ForceEOLAfter = 0;
+ 					pcur->ForceSpaceAfter = 1;
+ 					pcur->pst_Prev->ForceEOLAfter = 1;
+ 					pcur->pst_Prev->ForceSpaceAfter = 0;
+ 				}
  				else
  				{
  					Tool_ForceEOLAfterComments(pcur, 1);
***************
*** 2481,2486 ****
--- 2488,2498 ----
  						{
  							pnext->ForceSpaceAfter = 1;
  							pnext->ForceEOLAfter = 0;
+ 						}
+ 						else if(Config.ConstructStyle == 3)
+ 						{
+ 							pnext->ForceEOLAfter = 0;
+ 							pnext->pst_Prev->ForceEOLAfter = 1;
  						}
  						else
  							Tool_ForceEOLAfterComments(pnext, 1);

このパッチを当ててから GC.exe をリビルドして、 -code_constructor_style- オプションに 3 を指定してやれば、最初に上げたようなスタイルで整形してくれます。ちなみに、バージョンは現時点で最新の 1.140 を対称にしています。

パッチなんて作ったことが無いので検索して作り方から調べてしまいましたが、コマンド一発でできるんですね。 今後も使うかもしれないので覚えておこう。