C functions
c函数必须按一定的签名来写,如下:
1 | typedef int (*lua_CFunction) (lua_State *L); |
例如从lua中调用c写的sin函数,如下:
1 | static int l_sin (lua_State *L) { |
至于如何将函数注册入lua,下个章节介绍
接着是一个遍历目录的例子,如下:
1 |
|
注意lua中的错误处理,如果lua_newtable,lua_pushstring和lua_settable可能会内存不足导致报错然后直接interrupt该函数的执行,此时不会执行到closedir造成内存泄漏,后续章节会介绍一个更好的方法
C libraries
注册上边的l_dir函数进入lua.
动态加载,如下:
1 | //定义一个luaL_reg类型的数组,数组第一个元素为在lua中的名称,第二个元素为函数指针 |
静态加载,首先定义如下头文件mylib.h,如下:
1 | int luaopen_mylib (lua_State *L); |
重新编译lua,加载入该头文件mylib.h
技巧
table manipulation
1 | void lua_rawgeti (lua_State *L, int index, int key); |
index是table的位置,key是key的位置,lua_rawgeti相当于:
1 | lua_pushnumber(L, key); |
lua_rawseti相当于:
1 | lua_pushnumber(L, key); |
1 | int l_map (lua_State *L) { |
l_map函数,最后的lua_rawseti函数原理为将1处(table)key为i的值设置为top处的value
string manipulation
1 | lua_pushlstring(L, s+i, j-i+1); |
1 | lua_concat(L, n) |
将stack顶部的n个string concat,然后放到top位置
1 | const char *lua_pushfstring (lua_State *L, |
类似sprintf,会将格式化的string放到top位置
buffer操作:
1 | //buffer初始化 |
示例:
1 | static int str_upper (lua_State *L) { |