引数として取る C 関数がありFILE*
、Lua ファイルを渡してこの関数を Lua で使用したいと考えています。これには が必要だと思い%typemap
ます。書き方は?(Luaの学習を始めたばかりです)。
3 に答える
これが私が最終的に思いついた解決策です。
Lua ソースの liolib.c には、FILE *tofile (lua_State *L)
Lua ファイルを C FILE* に変換する関数がありますが、API の一部ではありません。タイプマップを作成するために少し変更しました。
%typemap(in) FILE * {
FILE **f;
if (lua_isnil(L, $input))
$1=NULL;
else {
f = (FILE **)luaL_checkudata(L, $input, "FILE*");
if (*f == NULL)
luaL_error(L, "attempt to use a closed file");
$1=*f;
}
}
C 関数に NULL を渡す方法が必要だったので、この typemap は nil も受け入れます。
SWIG を使用して C コードの Lua バインディングを生成していますか? Lua C API を直接使用しない理由、または C++ を使用できる場合は Luabind を使用しないのはなぜですか? すでに SWIG に強い愛着を持っている場合を除き、SWIG で動作させるよりも、どちらか一方の方が優れていると思います。
あなたが求めていることを行う簡単な方法はありません。
Lua File クラス インターフェイスは、基礎となる実装を抽象化します。単純にタイプマップすることはできません。ただし、必要な FILE 操作をラップする C プロキシを作成し、SWIG を使用して Lua でこのプロキシのインスタンスを作成することはできます。その後、typemap を生成して FILE* をラッパー プロキシ インスタンスに変換できます。
何かのようなもの:
class MyFileProxy {
private:
FILE* fp;
public:
MyFileProxy(FILE* fp);
MyFileProxy(const char* path);
FILE* GetFilePointer();
Seek(...
SWIG では、バインディングは単純です。
%module "MyFile"
%{
#include "MyFileProxy.h"
%}
// Tell SWIG how to use a proxy for functions that take a FILE*
%typemap(in) FILE*
{
void* tmp = 0;
SWIG_ConvertPtr(L,$argnum,(void**)&tmp,$1_descriptor,1);
if (tmp)
{
MyFileProxy* proxy = (MyFileProxy)tmp;
arg$argnum = proxy->GetFilePointer();
}
}
// Tell SWIG how to create a proxy when returning FILE*
%typemap(out) FILE*
{
MyFileProxy* pResult = new MyFileProxy($arg);
SWIG_NewPointerObj(L, pResult, $1_descriptor, 1);
}
%include "MyFileProxy.h
}
ただし、io:File を直接使用することはできません。