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

Posted

技术标签:

【中文标题】Swig 和 Lua:如何将 Lua 文件映射到 FILE*【英文标题】:Swig and Lua: how to map Lua file to FILE* 【发布时间】:2009-11-21 00:52:51 【问题描述】:

我有一个 C 函数,它以 FILE* 作为参数,我想在 Lua 中使用这个函数,传递 Lua 文件。我想我需要一个%typemap。怎么写? (我刚开始学习 Lua)。

【问题讨论】:

【参考方案1】:

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

在 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 函数的方法。

【讨论】:

这是一个不错的发现。感谢分享!【参考方案2】:

您正在使用 SWIG 为您的 C 代码生成 Lua 绑定?为什么不直接使用 Lua C API,或者如果你可以使用 C++,Luabind?我认为其中任何一个都比尝试使其与 SWIG 一起工作更好,除非你已经对 SWIG 有很强的依恋。

【讨论】:

我正在使用 SWIG 生成 Python 绑定,所以我认为最简单的方法是为 Lua 绑定重用相同的 .i 文件。它工作正常,除了问题中描述的例外。感谢您指出其他选项。【参考方案3】:

没有简单的方法可以满足您的要求。

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。

【讨论】:

以上是关于Swig 和 Lua:如何将 Lua 文件映射到 FILE*的主要内容,如果未能解决你的问题,请参考以下文章

Swig + Lua:调用 m(int argv, char **argc)

SWIG / Lua:确定成员字段数据类型

使用 SWIG 包装 c++ 类以在 Lua 中使用它 - 需要简单的示例

如何使用 SWIG 从 lua 中的 C++ 类继承

SWIG Lua 和传递数组

xmake v2.5.8 发布,新增 Pascal/Swig 程序和 Lua53 运行时支持