Gaucheから共有ライブラリ内の関数を呼び出します。 コードの一部はChickenのeggs:lazy-ffiから頂いています。
- 必要なもの
- 動作環境
- 配布物
- 使用法
- lazy-ffi:lazy-ffi? obj
- lazy-ffi:strerr
- lazy-ffi:open solib
- lazy-ffi:close obj
- lazy-ffi:function-to-pointer obj pred
- lazy-ffi:function obj pred item
- lazy-ffi:pointer? obj
- lazy-ffi:pointer-address obj
- lazy-ffi:make-null-pointer
- lazy-ffi:make-pointer int
- lazy-ffi:allocate-foreign-object size
- lazy-ffi:allocate-foreign-string size
- lazy-ffi:free-foreign-object obj
- lazy-ffi:convert-from-foreign-string obj
- lazy-ffi:convert-to-foreign-string string
- lazy-ffi:pointer-to-TAGvector size obj
- lazy-ffi:TAGvector-to-pointer obj
- 注意
必要なもの
- Gauche
- libffi
動作環境
libffiがインストールできて、dlcfn(3)が動くなら動作可能だと思います。
配布物
使用法
- まだ仕様が固まっていません。変更の可能性があります
CでのポインタをGaucheから扱うには、 lazy-ffiパッケージにて組み込まれる、オブジェクト<c-pointer>を使用します。
lazy-ffi:lazy-ffi? obj
objが<lazy-ffi>オブジェクトならば#tを返します。
lazy-ffi:strerr
最後に失敗した操作に対するエラー文字列を返します。
lazy-ffi:open solib
solibを開きます。成功するとlazy-ffiオブジェクトを返し、失敗すると#fを返します。
例
libm.soを開いて<lazy-ffi>オブジェクトをlibmで呼び出せるようにします。
(define libm (lazy-ffi:open "libm.so"))
lazy-ffi:close obj
objを閉じます。
lazy-ffi:function-to-pointer obj pred
obj内から関数名predを検索し、predのアドレスを<c-pointer>オブジェクトにして返します。 失敗すると#fを返します。
lazy-ffi:function obj pred item
obj内のpredを呼び出します。 predは文字列、または<c-pointer>オブジェクトを指定します。 itemはオブジェクト単体、 またはtype objectのキーワード形式でtypeには以下のものを指定します。 オブジェクト単体のみの場合、自動的に型を判定します。
keywordが:returnのとき以外は引数のリストを指定したことになります。
:returnが省略された場合、返り値はvoidを指定したことになります。
キーワード | 意味 |
:return | predの返り値 |
:boolean | int (1 or 0) |
:float, :double | double |
:char | char |
:pointer :locative | <c-pointer> |
:string, :symbol | char * |
:scheme-object | ScmObj |
例
(and-let* ((libm (lazy-ffi:open "libm.so.2.0"))) (lazy-ffi:function libm "sin" :return :double :double 1.0))
lazy-ffi:pointer? obj
objが<c-pointer>オブジェクトならば#tを返します。
lazy-ffi:pointer-address obj
<c-pointer>オブジェクトobjの値を整数で返します。
lazy-ffi:make-null-pointer
nullポインタを持つ<c-pointer>オブジェクトを生成します。
lazy-ffi:make-pointer int
ポインタの値がintである<c-pointer>オブジェクトを生成します。
lazy-ffi:allocate-foreign-object size
sizeの大きさのメモリを持った<c-pointer>オブジェクトを返します。
lazy-ffi:allocate-foreign-string size
sizeの大きさの文字列用のメモリを持った<c-pointer>オブジェクトを返します。
lazy-ffi:free-foreign-object obj
<c-pointer>オブジェクトobjに割り当てられたメモリを開放します。
lazy-ffi:convert-from-foreign-string obj
<c-pointer>オブジェクトobjの保持するメモリ領域を文字列にして返します。
lazy-ffi:convert-to-foreign-string string
文字列stringを内部に保持するポインタオブジェクトを返します。
lazy-ffi:pointer-to-TAGvector size obj
- lazy-ffi:pointer-to-s8vector
- lazy-ffi:pointer-to-u8vector
- lazy-ffi:pointer-to-s16vector
- lazy-ffi:pointer-to-u16vector
- lazy-ffi:pointer-to-s32vector
- lazy-ffi:pointer-to-u32vector
- lazy-ffi:pointer-to-s64vector
- lazy-ffi:pointer-to-u64vector
<c-pointer>オブジェクトobjの保持するポインタの始めからsize分をTAGvectorに変換して返します。
lazy-ffi:TAGvector-to-pointer obj
- lazy-ffi:s8vector-to-pointer
- lazy-ffi:u8vector-to-pointer
- lazy-ffi:s16vector-to-pointer
- lazy-ffi:u16vector-to-pointer
- lazy-ffi:s32vector-to-pointer
- lazy-ffi:u32vector-to-pointer
- lazy-ffi:s64vector-to-pointer
- lazy-ffi:u64vector-to-pointer
TAGvectorオブジェクトobjを<c-pointer>オブジェクトに変換して返します。
注意
<c-pointer>によって確保したメモリはGCの管理から外れるため、 クロージャから出るときに明示的にlazy-ffi:free-foreign-objectを呼ぶ必要があります。 扱いには注意してください。