您的当前位置:首页正文

Lua C接口API 2

来源:华拓网

前面学习了如何使用LuaApi操作虚拟栈的栈顶操作,但是仍旧不清楚如何操作栈中的数据,如何获取数据,如何操作数据等等。本文将介绍如何向栈中压入数据。

前言

Lua栈中压入数据,首先得知道Lua中有哪一些数据类型,每种数据类型提供了哪些方式入栈。
Lua提供了以下几种常用数据类型:

  • nil:Nil是nil类型,用来表示一个有意义的值不存在时的状态
  • boolean:false与true两个值得类型
  • number:代表整数与浮点数
  • string:表示一个不可变的字节序列,可以包含('\0')
    Lua中还有一些其它数据类型比如functionuserdatathreadtable,不在本文介绍,有机会将在后续介绍。

函数方法

下面针对上面提到的几种数据结构介绍相应的入栈的API

nil 入栈

void lua_pushnil (lua_State *L);

作用:顾名思义,将空值入栈

boolean 入栈

void lua_pushboolean (lua_State *L, int b);

作用:将b作为一个布尔量入栈

number 入栈

void lua_pushnumber (lua_State *L, lua_Number n);

作用:将一个值为n的浮点数入栈

string 入栈

const char *lua_pushlstring (lua_State *L, const char *s, size_t len);

作用:把指针s指向长度为len的字符串压栈。Lua会对这个字符串做一个副本,因此s可以在函数返回后释放或作其他用,函数返回字符串的副本

const char *lua_pushstring (lua_State *L, const char *s);

作用:将指针s指向的零结尾的字符串压栈。 因此s处的内存在函数返回后,可以释放掉或是立刻重用于其它用途。返回字符串的副本。

其他入栈方式

void lua_pushvalue (lua_State *L, int index);

作用:把栈上给定索引处的元素作一个副本压栈,等于拷贝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);

作用:从栈顶弹出元素值并将其设置到指定索引位置,没有任何移动操作。

示例

C 使用 Lua API

/*
 * gcc test.c -llua -lm -ldl
 */


#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdio.h>


/*
 * 从栈底到栈顶依次遍历整个堆栈
 */
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");

}

int main(int argc, char *argv[])
{
    lua_State *L = lua_open();
    luaL_openlibs(L);

    lua_pushboolean(L, 1);
    lua_pushnumber(L, 10);
    lua_pushnil(L);
    lua_pushstring(L, "Hello");
    lua_pushlstring(L, "World!!!", 6);

    stackDump(L);

    lua_pushvalue(L, -4);
    stackDump(L);

    lua_remove(L, 3);
    stackDump(L);

    lua_insert(L, -2);
    stackDump(L);

    lua_replace(L, 1);
    stackDump(L);


    lua_close(L);

    return 0;
}

编译执行输出为:

true '10' 'nil' 'Hello' 'World!'
true '10' 'nil' 'Hello' 'World!' '10'
true '10' 'Hello' 'World!' '10'
true '10' 'Hello' '10' 'World!'
'World!' '10' 'Hello' '10'

总结

Lua栈操看起来并不复杂,用好就见仁见智了,下一篇文章将介绍,获取栈中数据的API。