“Let’s go”
头文件
lua.h:定义了Lua提供的基础函数,都有一个lua_前缀
lauxlib.h:定义了辅助库(auxlib)提供的函数。都有一个luaL_打头。辅助库利用lua.h中提供的基础函数提供了更高层次上
的抽象;所有Lua标准库都使用了auxlib
lualib.h:为了保持Lua的苗条,所有的标准库以单独的包提供,所以如果你不需要就不会强求你使用它们。该头文件定义了打
开这些库的函数。
C接口
常用接口
lua_State* lua_open();
luaopen_base(lua_State*); //deprecate
luaopen_table(lua_State*); //deprecate
luaopen_io(lua_State*); //deprecate
luaopen_string(lua_State*); //deprecate
luaopen_math(lua_State*); //deprecate
luaL_openlibs(lua_State*)
luaL_loadbuffer()
lua_close(lua_State*)
压入元素
void lua_pushnil(lua_State*);
void lua_pushboolean(lua_State*, int bool);
void lua_pushnumber(lua_State*, double n);
void lua_pushlstring(lua_State*, const char *s, size_t length);
void lua_pushstring(lua_State*, const char *s);
int lua_checkstack(lua_State*, int sz)
查询元素
int lua_is(lua_State, int index):*可以是任何Lua类型。因此number, string, table等。该函数不检查这个值
是否是指定的类型,而是看它是否能被转换成指定的那种类型。例如,任何数字
类型都满足lua_isstring
lua_type():返回栈中元素的类型,在lua.h头文件中,每种类型都被定义为一个常量:LUA_TNIL,LUA_TBOOLEAN,LUA_TNUMBER
,LUA_STRING,LUA_TTABLE,LUA_TFUNCTION,LUA_TUSERDATA,LUA_TTHREAD
lua_typename(L, t):转换一个类型码到类型名
int lua_toboolean(lua_State*, int index);
double lua_tonumber(lua_State*, int index);
const char * lua_tostring(lua_State*, int index);
size_t lua_strlen(lua_State*, int index);
即使给定的元素类型不正确,调用上面这些函数也没有什么问题,在这种情况下,lua_toboolean,lua_tonumber和lua_strlen
返回0,其他函数返回NULL。由于ANSI C没有提供有效的可以用来判断村无发生数字值,所以返回的0是没有什么用处的。
lua_string返回的字符串结尾总会有一个字符结束标志0,但是字符串中间也能包含0,lua_strlen返回字符串的实际长度。
特殊情况下,假定栈顶的值是一个字符串,下面的断言总是有效的
const char *s = lua_tostring(L, -1);
size_t l = lua_strlen(L, -1);
assert(s[l] == '\0');
assert(strlen(s) <= 1)
其他堆栈操作
int lua_gettop(lua_State*);
返回堆栈中的元素个数,它也是栈顶元素的索引。注意一个负数索引-x对应于正数索引gettop - x + 1
void lua_settop(lua_State*, index);
设置栈顶为一个指定的值。如果开始的栈顶高于新的栈顶,顶部的值被丢弃。否则,为了得到指定的大小这个函数压入相应
个数的控制(nil)到栈上。lua_settop(L, 0)清空堆栈。
#define lua_pop(L, n) lua_settop(L, -(n) - 1)
void lua_pushvalue(lua_State*, index);
压入堆栈上指定索引的一个拷贝到栈顶
void lua_remove(lua_State*, index);
移除指定索引位置的元素,并将其上面所有的元素下移来填补这个位置的空白
void lua_insert(lua_State*, index);
移动栈顶元素到指定索引的位置,并将这个索引位置上面的元素全部上移至栈顶被移动留下的空隔
void lua_replace(lua_State*, index);
从栈顶弹出元素值并将其设置到指定索引位置,没有任何移动操作
帮助函数,dump整个堆栈内容:
static void stackDump(lua_State *L)
{
int i;
int top = lua_gettop(L);
for(i = 1; i <= top; i++)
{
int t = lua_type(L, i);
switch(t)
{
case LUA_TSTRING:
printf("`%s'", lua_tostring(L, i));
break;
case LUA_TBOOLEAN:
printf(lua_toboolean(L, i) ? "true" : "false");
break;
case LUA_TNUMBER:
printf("%g", lua_tonumber(L, i));
break;
default:
printf("%s", lua_typename(L, t));
break;
}
printf(" ");
}
printf("\n");
}
规则
当C函数接受一个来自lua的字符串作为参数时,两个规则必须遵守:当字符串正在被访问的时候不要将其出栈;永远不要修改字符串
参考
c语言setjmp
c语言longjmp