我有一个作为参数的 C 函数,FILE*
我想在 Lua 中使用这个函数,传递 Lua 文件。我想我需要一个%typemap
。怎么写?(我刚开始学习Lua)。
问问题
562 次
3 回答
5
这是我最终想出的解决方案。
在 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;
}
}
这个类型图也接受 nil,因为我需要一种将 NULL 传递给 C 函数的方法。
于 2009-11-26T09:42:52.653 回答
0
您正在使用 SWIG 为您的 C 代码生成 Lua 绑定?为什么不直接使用 Lua C API,或者如果你可以使用 C++,Luabind?我认为其中任何一个都比尝试使其与 SWIG 一起工作更好,除非你已经对 SWIG 有很强的依恋。
于 2009-11-21T19:32:57.550 回答
0
没有简单的方法来做你所要求的。
Lua File 类接口抽象了底层实现。您不能简单地对它进行类型映射。但是,您可以创建一个 C 代理来包装您需要的 FILE 操作,并使用 SWIG 在 Lua 中创建此代理的实例。然后,您可以生成类型映射以将 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。
于 2009-11-24T18:10:48.803 回答