繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM