読者です 読者をやめる 読者になる 読者になる

TCC Parser Ruby module

Program Bin

Tiny C Compiler のパーサを用いてヘッダをパースし、 Ruby/DL 等で使用できる関数だの構造体だのマクロだのの一覧を吐き出すモジュールです。

http://shinh.skr.jp/binary/tccparser.tgz

スクリプト言語から C とかの関数をシームレスに触る、っていうのはだらだらと考えてる話なのですが、ukaiさんに指摘いただいた通り、シグネチャがどうなってるか調べにゃまともに使えんわけです。(いや、 f で始まる変数は float とかでも私はいいんですけど)

それまでのノリでは DWARF2 とか見る感じだったんですが、どう考えてもヘッダ見る方が良い。これも指摘いただいたりしました。理由はポータブルであることとマクロが読めることの2点が大きいです。ヘッダの問題点は開発時にしか無いことですがデバッグ情報もリリース時には無いんじゃないかとか。

単なるパーサじゃなくてコンパイラであるところの TCC ベースにしたのはインライン関数を実行時生成する可能性を留保するためなどです。

バインディング書くことなく下記の SDL プログラムくらいが動いてるのは、まぁ幸せな感じなんじゃないでしょうか。

SDL.init(SDL::INIT_VIDEO)
s = SDL.setVideoMode(640, 480, 16, SDL::SWSURFACE)
print "#{s.w}x#{s.h}@#{SDL::PixelFormat.new(s.format).BitsPerPixel}bpp\n"
tmp = SDL.loadBMP('icon.bmp')
b = SDL.displayFormat(tmp)
SDL.freeSurface(tmp)
SDL.setColorKey(b, SDL::SRCCOLORKEY|SDL::RLEACCEL,
                SDL.mapRGB(b.format, 255,255,255))
dr = SDL::Rect.malloc
for i in 0...50
  dr.x = 100+i*8
  dr.y = 100+i*5
  SDL.blitSurface(b, nil, s, dr)
end
SDL.flip(s)
SDL.delay(1000)
SDL.freeSurface(b)
SDL.quit()

ヘッダから D のインポートライブラリ作るとかの方向もやってみたいと思っています。打倒 SWIG ウソ。

そういえばまたしてもメモリ解放してません。まだ色々ひどいので気が向いたらもうちょっと遊びます。あ、エラーメッセージ消すの忘れてた。

あと TCC のソースは面白いと思いました。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h