福嶋です。

Noritsugu Nakamura <nnakamur / mxq.mesh.ne.jp> wrote:
> swigruby でのファイルの扱いについて質問です。
> 
> wkf.i に
> %name(guessKanjiCodeOfFile) extern kcode_t	wkfGuessKanjiCodeOfFile(FILE *);
> 
> と書いて swigruby-0.4.3 で wkf_wrap.c を生成したのですが、
> ruby から呼び出す方法が良く分かりません。

swigはデフォルトではFILE*は扱えません。
FILE*を扱うためのtypemapがtypemaps.iに入っています。以下のように
typemaps.iを取り込んで、FILE *READと指定すると、IOから読み込める
ようになると思います。

%include typemaps.i
%name(guessKanjiCodeOfFile) extern kcode_t wkfGuessKanjiCodeOfFile(FILE *READ);

> f = open("hoge", "r")
> Wkf.guessKanjiCodeOfFile(f)
> とすると、
> in `guessKanjiCodeOfFile': wrong argument type File (expected String) (TypeError)
> と言われてしまうし、
> # Check_Type(varg0, T_STRING); で引っかかる
> 
> Wkf.guessKanjiCodeOfFile("hoge")
> とすると、
> in `guessKanjiCodeOfFile': Expected a _FILE_p (TypeError)
> と言われてしまうんですが…

swigは未知のポインタ型に対しては、型とアドレスを文字列にエンコー
ドして扱おうとするので、こうなってしまいます。

---
福嶋正機