首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

在云计算领域,Swig 和 Lua 都是非常重要的技术。Swig 是一个跨平台的软件工具,用于将 C/C++ 代码转换为其他编程语言,如 Python、Java、Lua 等。Lua 是一种轻量级、高效的脚本语言,广泛应用于游戏开发、Web 开发、嵌入式系统等领域。

将 Lua 文件映射到 FILE* 的方法如下:

  1. 首先,确保已经安装了 Swig 和 Lua 的开发库。
  2. 创建一个 C 语言文件,例如 lua_file.c,并编写以下代码:
代码语言:c
复制

#include<stdio.h>

#include <stdlib.h>

#include<string.h>

#include <lua.h>

#include <lauxlib.h>

#ifdef _WIN32

#include<windows.h>

#else

#include <unistd.h>

#endif

#define BUFFER_SIZE 1024

int lua_file_open(lua_State *L) {

代码语言:txt
复制
const char *filename = luaL_checkstring(L, 1);
代码语言:txt
复制
const char *mode = luaL_checkstring(L, 2);
代码语言:txt
复制
FILE *file = fopen(filename, mode);
代码语言:txt
复制
if (file == NULL) {
代码语言:txt
复制
    lua_pushnil(L);
代码语言:txt
复制
    lua_pushstring(L, "Failed to open file");
代码语言:txt
复制
    return 2;
代码语言:txt
复制
}
代码语言:txt
复制
lua_pushlightuserdata(L, file);
代码语言:txt
复制
return 1;

}

int lua_file_close(lua_State *L) {

代码语言:txt
复制
FILE *file = lua_touserdata(L, 1);
代码语言:txt
复制
if (file != NULL) {
代码语言:txt
复制
    fclose(file);
代码语言:txt
复制
    lua_pushboolean(L, 1);
代码语言:txt
复制
    return 1;
代码语言:txt
复制
}
代码语言:txt
复制
lua_pushboolean(L, 0);
代码语言:txt
复制
return 1;

}

int lua_file_read(lua_State *L) {

代码语言:txt
复制
FILE *file = lua_touserdata(L, 1);
代码语言:txt
复制
size_t size = luaL_checkinteger(L, 2);
代码语言:txt
复制
char buffer[BUFFER_SIZE];
代码语言:txt
复制
size_t bytes_read = fread(buffer, 1, size, file);
代码语言:txt
复制
lua_pushlstring(L, buffer, bytes_read);
代码语言:txt
复制
return 1;

}

int lua_file_write(lua_State *L) {

代码语言:txt
复制
FILE *file = lua_touserdata(L, 1);
代码语言:txt
复制
size_t size;
代码语言:txt
复制
const char *data = luaL_checklstring(L, 2, &size);
代码语言:txt
复制
size_t bytes_written = fwrite(data, 1, size, file);
代码语言:txt
复制
lua_pushinteger(L, bytes_written);
代码语言:txt
复制
return 1;

}

int lua_file_seek(lua_State *L) {

代码语言:txt
复制
FILE *file = lua_touserdata(L, 1);
代码语言:txt
复制
long offset = luaL_checkinteger(L, 2);
代码语言:txt
复制
int origin = luaL_checkinteger(L, 3);
代码语言:txt
复制
fseek(file, offset, origin);
代码语言:txt
复制
lua_pushboolean(L, 1);
代码语言:txt
复制
return 1;

}

int lua_file_tell(lua_State *L) {

代码语言:txt
复制
FILE *file = lua_touserdata(L, 1);
代码语言:txt
复制
long position = ftell(file);
代码语言:txt
复制
lua_pushinteger(L, position);
代码语言:txt
复制
return 1;

}

int lua_file_eof(lua_State *L) {

代码语言:txt
复制
FILE *file = lua_touserdata(L, 1);
代码语言:txt
复制
int eof = feof(file);
代码语言:txt
复制
lua_pushboolean(L, eof);
代码语言:txt
复制
return 1;

}

int lua_file_error(lua_State *L) {

代码语言:txt
复制
FILE *file = lua_touserdata(L, 1);
代码语言:txt
复制
int error = ferror(file);
代码语言:txt
复制
lua_pushboolean(L, error);
代码语言:txt
复制
return 1;

}

int lua_file_clearerr(lua_State *L) {

代码语言:txt
复制
FILE *file = lua_touserdata(L, 1);
代码语言:txt
复制
clearerr(file);
代码语言:txt
复制
lua_pushboolean(L, 1);
代码语言:txt
复制
return 1;

}

int lua_file_flush(lua_State *L) {

代码语言:txt
复制
FILE *file = lua_touserdata(L, 1);
代码语言:txt
复制
fflush(file);
代码语言:txt
复制
lua_pushboolean(L, 1);
代码语言:txt
复制
return 1;

}

int lua_file_fileno(lua_State *L) {

代码语言:txt
复制
FILE *file = lua_touserdata(L, 1);
代码语言:txt
复制
int fileno = fileno(file);
代码语言:txt
复制
lua_pushinteger(L, fileno);
代码语言:txt
复制
return 1;

}

int lua_file_isatty(lua_State *L) {

代码语言:txt
复制
FILE *file = lua_touserdata(L, 1);
代码语言:txt
复制
int isatty = isatty(fileno(file));
代码语言:txt
复制
lua_pushboolean(L, isatty);
代码语言:txt
复制
return 1;

}

int lua_file_getline(lua_State *L) {

代码语言:txt
复制
FILE *file = lua_touserdata(L, 1);
代码语言:txt
复制
char *line = NULL;
代码语言:txt
复制
size_t len = 0;
代码语言:txt
复制
ssize_t read;
代码语言:txt
复制
if ((read = getline(&line, &len, file)) != -1) {
代码语言:txt
复制
    lua_pushlstring(L, line, read);
代码语言:txt
复制
    free(line);
代码语言:txt
复制
    return 1;
代码语言:txt
复制
}
代码语言:txt
复制
lua_pushnil(L);
代码语言:txt
复制
return 1;

}

int lua_file_puts(lua_State *L) {

代码语言:txt
复制
FILE *file = lua_touserdata(L, 1);
代码语言:txt
复制
size_t size;
代码语言:txt
复制
const char *data = luaL_checklstring(L, 2, &size);
代码语言:txt
复制
int result = fputs(data, file);
代码语言:txt
复制
lua_pushinteger(L, result);
代码语言:txt
复制
return 1;

}

int lua_file_getc(lua_State *L) {

代码语言:txt
复制
FILE *file = lua_touserdata
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

1.3-Air302(NB-IOT)-新建lua文件lua文件的变量,函数调用

说明 这节说明一下新建自己的文件,然后如何调用自己文件里面的函数或者变量 方式1 1.在user文件夹右键选择新建文件 ?...2.建一个名字为 load_file.lua   (XXXX.lua)XXXX随意 ? 3.写上以下内容 这是lua的语法,其实加载文件有好几种形式,这只是其中一种 ?...4.定义一个变量一个函数 注:lua的table是万能的,啥都能存! 其它文件获取的是 load_file 这个table,所以把变量函数都存储到数组里面 ? 5.其它文件调用 ?...6.下载到开发板 注:如果已经刷过底层,可以只输入下载文件指令 python air302.py lfs dlfs ? ? 方式2 ? 测试 ? ?...结语 用户使用其中一种就可以 至于第二种其实是lua的语法就支持这样!

68452

Lua数据文件序列化

JSON基于JavaScript,类似于一种精简过的Lua语言数据文件。一方面,JSON的一大优势在于它是国际标准,包括Lua语言在内的多种语言都具有操作JSON文件的标准库。...另一方面,Lua语言数据文件的读取更加容易灵活。 使用一门全功能的编程语言来描述数据确实非常灵活,但也会带来两个问题。问题之一在于安全性,这是因为“数据”文件能够肆意地在我们的程序中运行。...Lua语言不仅运行得快,编译也很快。例如,在笔者的新机器上,Lua5.3可以在4秒以内,占用240MB内存,完成1000万条赋值语句的读取、编译运行。...数据文件 对于文件格式来说,表构造器提供了一种有趣的替代方法。只需在写入数据时做一点额外的工作,就能使得读数据变得容易。这种技巧就是将数据文件写成Lua代码,当这些代码运行时,程序也就把数据重建了。...不过,如果处理的是处于自身需求而创建的数据文件,那么就可以将Lua语言的构造器用于格式定义。此时,我们把每条数据记录表示为一个Lua构造器。这样,原来类似 Donald E.

80830

LUA开发方式下,如何实现http下载LUA文件就可以实现升级Air202ESP8266的LUA程序

前言 咱们用LUA开发 Air202或者ESP8266的时候是不是都希望可以直接升级lua文件 就是说直接把编写好的lua文件放到云端,然后芯片下载lua文件以后执行 其实这个功能还是我大前年的时候花时间研究出来的.../yangfengwu/p/9315841.html STM32嵌入LUA开发(控制小灯闪耀) 2.咱使用的lua开发都有对文件操作的函数 2.1 Air202把lua程序写入文件和加载文件 ?...2.2 ESP8266 把lua程序写入文件和加载文件 ?  ...2.3 写个超级简洁的 file.open("test.lua", "w+") --创建test.lua file.write("print(\"1234\")")--存入lua执行程序    print...("1234") file.close() --关闭文件 dofile("test.lua") --加载文件 执行以后就会打印 1234 结语 不知道大家看没看明白,没有看明白的话自己去试一试哈!

98810

Node.js编写组件的几种方式

(2)swig为第三方支持,一个强大的组件开发工具,支持为python、lua、js等多种常见脚本语言生成C++组件包装代码,swig使用者只需要编写C++代码swig配置文件即可开发各种脚本语言的C...实现Node.js组件 利用swig框架编写Node.js组件 (1)编写好组件的实现:.h.cpp ** eg: namespace a { class A{ public: int add(int...a, int y); }; int add(int x, int y); } (2)编写.i,用于生成swig的包装cpp文件* eg: /* File : IExport.i */ %module...C++导出函数返回值一般定义为void,函数参数中的指针参数,如果是返回值的(通过*.i文件中的OUTPUT指定),swig都会把他们处理为JS函数的返回值,如果有多个指针,则JS函数的返回值是list...swig - javascript对std::vector、std::string、的封装使用参见:我的练习,主要关注.i文件的实现*。

1.3K41

xmake v2.5.8 发布,新增 PascalSwig 程序 Lua53 运行时支持

这个版本,我们主要增加了对 Pascal 语言项目 Swig 模块的构建支持,而对于上个版本新增的 Vala 语言支持,我们也做了进一步改进,增加了对动态库和静态库的构建支持。...模块支持 我们提供了 swig.c swig.cpp 规则,可以对指定的脚本语言,调用 swig 程序生成 c/c++ 模块接口代码,然后配合 xmake 的包管理系统实现完全自动化的模块依赖包整合...唯一的区别就是,带有 Lua5.3 的 xmake 支持更多的平台架构。...set_sourcedir() 来设置 foo 包的代码目录位置,然后通过 import 导入 package.tools.cmake 辅助模块来调用 cmake 构建代码,xmake 会自动获取生成的 libfoo.a 对应的头文件...#1638: 改进合并静态库 改进 on_load/after_load 去支持动态的添加 target deps #1675: 针对 mingw 平台,重命名动态库导入库文件名后缀 #1694:

72030

swig简介_swiping是什么意思

swig简介 swig是个帮助将c、c++编写的程序与其他高级语言嵌入联接的开发工具。例如PHP、python、lua、c#、java等。 swig常将c、c++其他语言进行API的相互转换。...实例见我的小demo,git-swig-demo 1、创建一个export.i文件,置于资源文件内。...2、在export.i内添加如下,module内pair为导出API的模块名,include的是原始的模块头文件。...执行export,命令如下: swig -c++ -lua LuaAMDllExport.i swig为设置环境变量后的宏,第一个参数为原始语言,第二个参数为转换后的语言。...第三个为swig所需的export文件名,执行成功后会生成同名的_wrap.cxx文件。 5、将LuaAMDllExport_wrap.cxx加入工程源文件内,编译工程,生成的dll即可使用。

65810

C#脚本实践(三): 集成到游戏

编译 冒似不编译没有.lib可以用 从官方上下载稳定版本的代码, 不要去GitHub直接拉 默认的工程有几个路径宏之类的不对, 小改一下就可以 如果缺文件, 可以到GitHub的历史版本里去找 编译好了就一个...优点是有自动生成的方案, 最常见的是SWIG....用SWIG的话只需要定义一个文件指明需要把哪些头文件导出给C#用, 然后粘合层的cppC#的包装代码都可以自动生成, 再集成到VC的build event中, 编译好工程直接就生成好C#这边引用的DLL...SWIG生成的包装类名方法名都没变化, 用起来很爽. VS/MD会自动解析引用的DLL, 写代码时的因为有强大的IDE, 智能提示, 语法纠错, 编译检查都是非常好用的....C#有强大的IDE支持 lua的话有个lua2il的东西 Java的话Mono里有个IKVM估计就是支持它的 至此, C#做为脚本已经完全可行了: 可嵌入, 跨平台, 高效率, 热更新, 几乎可以忽略的编译时间

1.3K20

C#脚本实践(三): 集成到游戏

编译 冒似不编译没有.lib可以用 从官方上下载稳定版本的代码, 不要去GitHub直接拉 默认的工程有几个路径宏之类的不对, 小改一下就可以 如果缺文件, 可以到GitHub的历史版本里去找...优点是有自动生成的方案, 最常见的是SWIG....用SWIG的话只需要定义一个文件指明需要把哪些头文件导出给C#用, 然后粘合层的cppC#的包装代码都可以自动生成, 再集成到VC的build event中, 编译好工程直接就生成好C#这边引用的DLL...SWIG生成的包装类名方法名都没变化, 用起来很爽. VS/MD会自动解析引用的DLL, 写代码时的因为有强大的IDE, 智能提示, 语法纠错, 编译检查都是非常好用的....C#有强大的IDE支持 lua的话有个lua2il的东西 Java的话Mono里有个IKVM估计就是支持它的 至此, C#做为脚本已经完全可行了: 可嵌入, 跨平台, 高效率, 热更新, 几乎可以忽略的编译时间

1.5K30

《安富莱嵌入式周报》第294期:将CC++代码转换为各种高级语言,超炫渲染着色器,VS2022新闻插件,基于以太网的开源步进电机控制器,Arduino PLC

, Octave, R等语言的开源软件工具SWIG https://www.swig.org/ https://github.com/swig/swig 这个有点强,所以放在开头就给大家推荐下,很多时候我们的代码都是....zip (78.32MB) 更新记录:  (2)新作的视频文件制作小软件,支持AVIEMF两种格式 MakeMovie_V630_Install.exe (4.99MB) (3)VNC软件效果,增加...(2)之前分享了H7-TOOL的LUA小程序实现JSCope HSS模式操作首版 下次发布2.20固件,将增加专门的LUA函数 pg_auto_report(period, addr1, type1,...直接读取各个IC厂家提供的CMSIS SVD文件生成LUA程序,像MDK,IAR在线调试那样实时检测外设状态,等RTOS Trace功能完全体整理完毕后,着手实现下这个功能。...通过LUA小程序,我们可以离线,WiFi,以太网USB四种玩法,且支持内网外网远程。 SVD文件格式:

1.1K30

进阶Openresty高级功能之常用指令

access_by_lua_xxxaccess_by_lua支持将要执行的lua代码封装到文件或代码块中,分别对应着access_by_lua_fileaccess_by_lua_block。...{ -- Lua code here }}content_by_lua_xxxcontent_by_lua支持将要执行的lua代码封装到文件或代码块中,分别对应着content_by_lua_file...content_by_lua_block { -- Lua code here }}log_by_lua_xxxlog_by_lua支持将要执行的lua代码封装到文件或代码块中,分别对应着log_by_lua_file...当使用 init_worker_by_lua_file 指令时,你可以指定一个Lua脚本文件的路径,Nginx会在每个worker进程启动时加载并执行该Lua脚本。...通过使用 init_worker_by_lua_file,可以在Nginx启动时执行自定义的Lua代码,以满足特定的需求。这样可以在Nginx运行期间进行一些额外的初始化操作,提高灵活性扩展性。

14321

Rust FFI 编程 - FFI 概述

困难体现在: 如果 host 语言(调用主动方)带 GC(垃圾收集器),而 guest 语言(调用被动方)不带,那么可能会在资源管理(创建,释放)上面造成一些问题,需要特别细致地处理; 复杂对象或类型,在映射到两边的时候...,例如Lua, Perl, PHP, Python, R, Ruby, Tcl, 其它语言,例如C#, Java, JavaScript, Go, D, OCaml, Octave, Scilab以及...也就是说,使用了 SWIG 这套工具规范,就可以直接在上层语言(动态语言居多)中调用 C/C++ 库了,省却大量烦恼。但在实际使用中,还会有一些细节问题,往往需要人工调整。所以也不是那么完美。...SWIG 官网:http://swig.org/ 。...目前几乎所有主流语言都已实现将 WASM 作为编译目标,并且有相当一部分语言能够加载 WASM 库文件,调用其中的函数。不同的语言编译出的 WASM 效能体积大小也是不同的。

99220

缓冲区列表简介

vim在读取文件时会通过内存映射的方式,将磁盘中的内容映射到一块内存的缓冲中。vim可以打开多个文件,每个文件独立的占有一个缓冲区。...假设现在在某个目录中有多个文件,我们使用vim同时打开,例如使用vim init.lua test.py。...后面介绍我自己的配置时会介绍如何将其映射到快捷键上 如果要删除某个缓冲区可以使用:bdelete {bufname}。...再通过:ls 命令查看一下当前缓冲区列表,发现之前打开的仍然存在,只是我们将test.py init.lua 这两个文件形成一组作为缓冲区的参数列表。...后面也可以跟上文件名、shell命令通配符,设置对应的缓冲区列表参数 next: 切换到缓冲区列表参数中的下一个缓冲区 prev: 切换到缓冲区列表参数中的上一个缓冲区 last: 切换到缓冲区列表参数中的最后一个缓冲区

52130

openresty源码剖析——lua代码的加载

大家知道lua_code_cache 开关用于控制是否缓存*_by_lua_file对应的文件里的lua代码 lua_code_cache off的情况下,跟请求有关的阶段,在每次有请求来的时候,都会重新加载最新的...lua文件,这样我们修改完代码之后就不用通过reload来更新代码了 而*_by_lua_block、*_by_luainit_by_lua_file里的代码(init_by_lua阶段具体请求无关... .lua 处理 ##请求的处理 content_by_lua_file对应的请求来临时,执行流程为 ngx_http_lua_content_handler -> ngx_http_lua_content_handler_file...lua脚本,而不需要reload nginx,但因为每个请求都需要分配新的lua_state,读取文件加载代码,所以性能较差 2、当lua_code_cache on的情况下,openresty打开lua...全局table缓存中找到了,不需要再读取文件加载代码,因此修改完代码之后,需要reload nginx之后才可以生效 3、通过 content_by_lua_file 中使用 Nginx 变量时,可以在实现在

2.8K70

【游戏开发】Excel表格批量转换成lua的转表工具

一、简介   在上篇博客《【游戏开发】Excel表格批量转换成CSV的小工具》 中,我们介绍了如何将策划提供的Excel表格转换为轻便的CSV文件供开发人员使用。...在本篇博客中,马三将会大家一起,用C#语言实现一个Excel表格转lua的转表工具——Xls2Lua,并搭配一个通用的ConfigMgr来读取lua配置文件。...Excel目录存放我们需要进行转换的Excel表格文件。LuaData目录存放转出来的Lua配置文件。Xls2Lua目录也就是我们的转表工具的目录了,它包含源代码可直接运行的转表工具。   ...图2:转表工具设计结构   FileExporter类专门用来读取Excel文件导出lua配置文件;GlobalDef类中定义了一些通用的数据结构枚举等信息;XlsTransfer类即为我们的转表工具核心类...四、读取Lua配置文件   经过上面的一系列操作,我们得到了转换后的Lua配置文件,它长成下面这个样子: 1 --[[Notice:This lua config file is auto generate

4.9K40
领券