c-wrapper

gauche-sdlについて書いた先日の記事(id:SaitoAtsushi:20070901:1188656543)を見て、Theoria氏がc-wrapperを勧めて下さった。
id:scinfaxi:20070903:1188754567
gaucheの拡張ライブラリはまだそう多くないこともあって、存在を知ってはいたけど、経験的に言ってこのテのものは黒魔術の成果である場合が多く、windowsで動かそうというのは無謀のような気がしていた。けれど、使えたらかなり強力っていうかこの拡張ひとつでWindowsの全部のAPIが使い放題じゃなかろうかと思うと手を出さずにはいられなくなり挑戦してみた。
まずは情報収集からとぐぐってみる。

gauche の c-wrapper が,windows でも動いてくれたら素晴らしいのにねぇ.

http://alohakun.blog7.fc2.com/blog-entry-582.html

動かないってことで結論出しちゃってるし。

今のところc-wrapperではdl_open, dl_symぐらいしか使っていないので、これらが外部から呼び出せればWindows環境下でも共通に使用できる ようになるはずです(libffiとか他のところで引っかかりそうですが)。

http://lists.sourceforge.jp/mailman/archives/gauche-devel-jp/2006-March/001563.html

簡単そうに言っちゃってくれてる。
と、言うわけでぐぐってみても特に参考になる資料は得られず。
自分で取り掛かるしかないかと、このあとなんやかんやがあって結局は部分的な成果は得られた。今のところ以下のような雰囲気。

gosh> puts
*** ERROR: unbound variable: puts
Stack Trace:
_______________________________________
gosh> feof
*** ERROR: unbound variable: feof
Stack Trace:
_______________________________________
gosh> (use c-wrapper)
#<undef>
gosh> (c-load-library "msvcrt")
#<undef>
gosh> (c-include "stdio.h")
#<undef>
gosh> puts
*** ERROR: unbound variable: puts
Stack Trace:
_______________________________________
gosh> feof
#<macro feof>

どういうわけかc-includeでマクロだけが解釈出来ている模様。c-parser.scmにもかなり手を入れたのでどこかで下手なことやってるのかもしれず。引き続き調査する所存。OllyDBGで確認した限りではDLLはロード出来ていたのでc-load-libraryについては問題ないことにしておく。
で、ここに至るまでにどういう経緯があったかは色々とありすぎて細かいことはワケわからんようになっちゃったのでおおまかに箇条書で説明するとこんなカンジ。

  • gauche.package.compileモジュールの改造。
    • runをsys-systemで代用。
    • 引数をシングルクォートで囲っているのをダブルクォートに置き換えたり削ったり。
  • ダイナミックリンク関連の解決。
    • dlopen,dlerror,dlsym,dlcloseの代用関数をc-ffi.cに追加。gauche本体のdl_win.cを参考に。
    • c-ffilib.stubの関連箇所を書換え。RTLD_DEFAULTとかRTLDなんちゃらの定数は使えないので削る。
  • c-parser.scmの改造。
    • call-with-process-ioをsys-systemで代用。パイプを使わずに一時ファイルでデータを受渡し。

ここまで出来たら、あとちょっとで上手くいきそうな気がする。全体を把握せずにいきあたりばったりで引掛ったことを潰してきただけなので、もうちょっと慎重に内容を見ないとダメかも。
Document ID: b2e61050ce93a4a92860ab999eccb0ec