[英]Swig and Lua: how to map Lua file to FILE*
我有一个使用FILE*
作为参数的C函数,我想在Lua中使用此函数,并传递Lua文件。 我想我需要一个%typemap
。 怎么写呢? (我刚刚开始学习Lua)。
这是我最终想出的解决方案。
在Lua源FILE *tofile (lua_State *L)
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函数的方法。
您正在使用SWIG为C代码生成Lua绑定吗? 为什么不直接使用Lua C API,或者如果可以使用C ++,则使用Luabind? 我认为这两种方法都比尝试使其与SWIG更好,除非您已经对SWIG有了强烈的依恋。
没有简单的方法可以完成您要问的事情。
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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.