Swig和Lua:如何将Lua文件映射到FILE*

我有一个以 FILE* 为参数的 C 函数,我想在 Lua 中使用这个函数,传递 Lua 文件。我猜我需要一个 %typemap。该如何编写?(我刚开始学习 Lua)

原文链接 https://stackoverflow.com/questions/1774116

点赞
stackoverflow用户4323
stackoverflow用户4323

你正在使用 SWIG 为你的 C 代码生成 Lua 绑定?为什么不直接使用 Lua C API,或者如果可以使用 C++,使用 Luabind?我认为任何一种都比尝试使用 SWIG 更好,除非你已经对 SWIG 有强烈的执着。

2009-11-21 19:32:57
stackoverflow用户48940
stackoverflow用户48940

没有简单的方法来做你所要求的。

Lua文件类接口抽象了底层的实现。你不能简单地对它进行类型映射。但你可以创建一个C代理来包装你需要的FILE操作,并在Lua中使用SWIG创建此代理的一个实例。然后,你可以生成一个类型映射,将一个FILE \ *转换为包装器代理实例。

例如:

class MyFileProxy {
    private:
        FILE* fp;
    public:
        MyFileProxy(FILE* fp);
        MyFileProxy(const char* path);

        FILE* GetFilePointer();

        Seek(...

在SWIG中,绑定如下:

```` %module“ MyFile”

%{ #include“ MyFileProxy.h” %}

//告诉SWIG如何使用代理函数,该函数使用FILE* %typemap(in)FILE * { void * tmp = 0; SWIG_ConvertPtr(L,$ argnum,(void **)&tmp,$ 1_descriptor,1);

如果(tmp) { MyFileProxy * proxy =(MyFileProxy)tmp; arg $ argnum = proxy->GetFilePointer(); } }

//告诉SWIG如何在返回FILE*时创建代理 %typemap(out)FILE * { MyFileProxy * pResult = new MyFileProxy($ arg); SWIG_NewPointerObj(L,pResult,$ 1_descriptor,1); }

%include“ MyFileProxy.h

}

```

然而,你将不能直接使用io:File。

2009-11-24 18:10:48
stackoverflow用户104453
stackoverflow用户104453

这是我最终想出的解决方案。

在 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;
    }
}

这个类型映射也接受空值,因为我需要一种将 NULL 传递给 C 函数的方法。

2009-11-26 09:42:52