(ruby)(grep的なプログラム)

 API関数の定数の値を調べるのがめんどいので
VC++2008 や VC++2008ExpressEdition等をインストールする時に 一緒にインストールされる
Windows SDK」 の 「Include」フォルダ内の
(デフォルトだと C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include)
*.hファイル内を 調べて 指定した正規表現にヒットした場合に
それを リストアップしていく rubyスクリプトを考えてみました

 まぁ 同じような事をするソフトはたくさんありますけど
表示の仕方を 自分が好きなように変更できるのが スクリプトの良さですよね
if ARGV[2] == 'i'
  regex = Regexp.new(ARGV[1], Regexp::IGNORECASE)
else
  regex = Regexp.new(ARGV[1])
end
Dir.glob(ARGV[0].gsub(/\\/,'/')).each{|fn|
  isfirstfound = true
  f = File.open(fn, 'r')
  lc = 0
  while line = f.gets()
    lc += 1
    if ( line =~ regex )
      if ( isfirstfound )
        isfirstfound = false
        puts("\n>>>> #{fn.gsub(/\//,'\\')} <<<<")
      end
        puts("#{lc.to_s().rjust(6,"0")}:#{line}")
    end
  end
}
 とりあえず テキストのサーチなので
スクリプト名は 「ts.rb」としておきます
そして こんな感じの バッチファイルを組めば
.rb の 拡張子まで書かなくてもよくなりますね
あとは パスの通った所に 置いておきます
@echo off
.\ts.rb %1 %2 %3

 では 使い方の 一例ですが

例えば API関数関連 の 「DRIVE_・・・」 という 定数の値を知りたい場合なら
コマンドプロンプトで さっきの Includeフォルダ を 開きます
そして 以下のコマンドを実行すれば ヒットした行が 標準出力されます
ts '*.h' "^#define DRIVE_"
ちょっとややこしいですけど
ファイルパターンは 「'」でくくります
正規表現は 「"」でくくります
もし大文字小文字を同一視するなら 第3引数に 「i」オプションを入れます
ts '*.h' "^#define drive_" i
ファイルに出力するなら
ts '*.h' "^#define mci_" i > out.txt
と リダイレクトします
moreで見るなら
ts '*.h' "^#define mci_" i | more
と パイプします