Lua与C通信——Lua API(一)
2015-06-15 11:57
465 查看
Lua由C语言实现的嵌入式语言。C Api是一组能使C代码和Lua交互的函数。其中包括读写Lua全局变量、调用Lua函数、执行Lua代码,以及注册C函数以供Lua代码调用。
lua_State *L = luaL_newstate(); /*打开Lua*/
luaL_openlibs(L); /*打开标准库*/
lua_pop(L, 1); /*从栈中弹出错误消息*/
lua压入元素
void lua_pushnil (lua_State *L);
void lua_pushboolean (lua_State *L, int bool);
void lua_pushnumber (lua_State *L, lua_Number n);
void lua_pushinteger (lua_State *L, lua_Integer n); // 整形,存储大型字符串的长度,定义ptrdiff_t
void lua_pushlstring (lua_State *L, const char *s , size_t len);
void lua_pushstring (lua_State *L, const char *s);
检查栈空间
int lua_checkstack(lua_State *L ,int sz);
检查特定类型 (检查值是否能转换为数字,对任意数字,lua_isstring都返回真)
int lua_is* (lua_State *L, int index); //*可以是任意Lua类型。lua_isnumber\lua_isstring\lua_istable
int lua_type (lua_State *L, int index);
int lua_isnil (lua_State *L, int index);
int lua_isboolean (lua_State *L, int index);
int lua_isnumber (lua_State *L, int index);
int lua_isstring (lua_State *L, int index);
int lua_istable (lua_State *L, int index);
int lua_isfunction (lua_State *L, int index);
int lua_iscfunction (lua_State *L, int index);
int lua_isuserdata (lua_State *L, int index);
int lua_islightuserdata (lua_State *L, int index)
lua_type返回堆栈元素的值类型,当使用无效索引时返回LUA_TNONE(如当堆栈为空的时候)。lua_type返回的类型代码为如下在lua.h中定义的常量:LUA_TNIL,LUA_TNUMBER,LUA_TBOOLEAN,LUA_TSTRING,LUA_TTABLE,LUA_TFUNCTION,LUA_USERDATA,LUA_TTHEARD,LUA_TLIGHTUSERDATA。下面的函数可以将这些常量转换为字符串:
const char* lua_typename (lua_State* L, int type);
从栈中获取一个值
lua_to*()
int lua_toboolean(lua_State *L, int index);
lua_Number lua_tonumber(lua_State *L, index);
lua_Integer lua_tointeger(lua_State *L, index);
const char *lua_tolstring (lua_State *L, int index, size_t *len);
size_t lua_objlen (lua_State *L, int index);
其他栈操作
int lua_gettop (lua_State *L);//返回栈中元素个数,也可以说事站定元素的引索
void lua_settop(lua_State *L, int index);//将栈顶设置为一个制定的位置,即修改占中元素的数量。多出来的将被舍弃
void lua_pushvalue(lua_State *L, int index);//将制定的索引上值得副本压入栈。
void lua_remove(lua_State *L , int index);//删除指定索引上的元素,并将该位置之上的所有元素下移以填补空缺。
void lua_insert(lua_State *L, int index);//移动指定位置之上的所有元素以开辟一个槽的空间,然后将栈顶元素移到该位置。
void lua_replace (lua_State *L, int index);//弹出栈顶的值,并将该值设置到制定索引上,但他不会移动任何东西,
#define lua_pop(L, n) lua_settop(L, -(n) - 1); //定义宏从栈弹出n个元素
以下操作不会对栈产生影响:
lua_settop(L, -1); /*将栈顶元素设置为它的当前值*/
lua_insert(L, -1) ; /*将栈顶元素移动到栈顶*/
luaL_loadfile(L, fname); //从文件fname加载程序块
lua_pcall(L,0,0,0);//运行编译好的程序块。第二个参数是传给待调用函数的参数个数,
第三个参数是期望的结果个数,第四个参数是一个错误处理函数的索引。
若发生错误(文件fname中得语法错误),这两个函数都会把错误消息压入栈,并返回一个非零的错误代码。
此时,程序就调用lua_tostring从栈顶获取该消息。
lua_getglobal(L,"var")会执行两步操作:1.将var放入栈中,2.由Lua去寻找变量var的值,并将变量var的值返回栈顶(替换var)。
lua_State *L = luaL_newstate(); /*打开Lua*/
luaL_openlibs(L); /*打开标准库*/
lua_pop(L, 1); /*从栈中弹出错误消息*/
lua压入元素
void lua_pushnil (lua_State *L);
void lua_pushboolean (lua_State *L, int bool);
void lua_pushnumber (lua_State *L, lua_Number n);
void lua_pushinteger (lua_State *L, lua_Integer n); // 整形,存储大型字符串的长度,定义ptrdiff_t
void lua_pushlstring (lua_State *L, const char *s , size_t len);
void lua_pushstring (lua_State *L, const char *s);
检查栈空间
int lua_checkstack(lua_State *L ,int sz);
检查特定类型 (检查值是否能转换为数字,对任意数字,lua_isstring都返回真)
int lua_is* (lua_State *L, int index); //*可以是任意Lua类型。lua_isnumber\lua_isstring\lua_istable
int lua_type (lua_State *L, int index);
int lua_isnil (lua_State *L, int index);
int lua_isboolean (lua_State *L, int index);
int lua_isnumber (lua_State *L, int index);
int lua_isstring (lua_State *L, int index);
int lua_istable (lua_State *L, int index);
int lua_isfunction (lua_State *L, int index);
int lua_iscfunction (lua_State *L, int index);
int lua_isuserdata (lua_State *L, int index);
int lua_islightuserdata (lua_State *L, int index)
lua_type返回堆栈元素的值类型,当使用无效索引时返回LUA_TNONE(如当堆栈为空的时候)。lua_type返回的类型代码为如下在lua.h中定义的常量:LUA_TNIL,LUA_TNUMBER,LUA_TBOOLEAN,LUA_TSTRING,LUA_TTABLE,LUA_TFUNCTION,LUA_USERDATA,LUA_TTHEARD,LUA_TLIGHTUSERDATA。下面的函数可以将这些常量转换为字符串:
const char* lua_typename (lua_State* L, int type);
从栈中获取一个值
lua_to*()
int lua_toboolean(lua_State *L, int index);
lua_Number lua_tonumber(lua_State *L, index);
lua_Integer lua_tointeger(lua_State *L, index);
const char *lua_tolstring (lua_State *L, int index, size_t *len);
size_t lua_objlen (lua_State *L, int index);
其他栈操作
int lua_gettop (lua_State *L);//返回栈中元素个数,也可以说事站定元素的引索
void lua_settop(lua_State *L, int index);//将栈顶设置为一个制定的位置,即修改占中元素的数量。多出来的将被舍弃
void lua_pushvalue(lua_State *L, int index);//将制定的索引上值得副本压入栈。
void lua_remove(lua_State *L , int index);//删除指定索引上的元素,并将该位置之上的所有元素下移以填补空缺。
void lua_insert(lua_State *L, int index);//移动指定位置之上的所有元素以开辟一个槽的空间,然后将栈顶元素移到该位置。
void lua_replace (lua_State *L, int index);//弹出栈顶的值,并将该值设置到制定索引上,但他不会移动任何东西,
#define lua_pop(L, n) lua_settop(L, -(n) - 1); //定义宏从栈弹出n个元素
以下操作不会对栈产生影响:
lua_settop(L, -1); /*将栈顶元素设置为它的当前值*/
lua_insert(L, -1) ; /*将栈顶元素移动到栈顶*/
luaL_loadfile(L, fname); //从文件fname加载程序块
lua_pcall(L,0,0,0);//运行编译好的程序块。第二个参数是传给待调用函数的参数个数,
第三个参数是期望的结果个数,第四个参数是一个错误处理函数的索引。
若发生错误(文件fname中得语法错误),这两个函数都会把错误消息压入栈,并返回一个非零的错误代码。
此时,程序就调用lua_tostring从栈顶获取该消息。
lua_getglobal(L,"var")会执行两步操作:1.将var放入栈中,2.由Lua去寻找变量var的值,并将变量var的值返回栈顶(替换var)。
相关文章推荐
- 【原】lua的table深拷贝
- lua string 库
- Lua 学习笔记三 Mac安装Lua
- Evaluate Reverse Polish Notation
- Lua脚本认知小结
- Incompatibilities with Lua 5.2
- Lua获取系统时间和时间格式化方法
- Lua中的模块与module函数
- lua--函数深入:闭合函数,局部函数,尾调用
- Lua中的字符串操作
- Lua学习 2) —— Android与Lua互调
- lua学习笔记(2)——内核入口
- lua 弱表
- lua学习笔记(1)——编译配置
- [leetcode] Evaluate Reverse Polish Notation
- Lua字符串及字符串匹配
- fflua更新-增加对引用的支持
- tolua reference
- luajit利用ffi结合C语言实现面向对象的封装库
- lua--函数.变长参数 and 具名实参