c与lua 相互调用

改了下c代码与lua的联调,利用网上的例子

gcc -g lua.c -llua -lm -o luatest

#include <stdio.h>

#include <string.h>


#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"


typedef int bool;


void main(int argc, char *argv[])
{

//Lua示例代码,使用table
    char *szLua_code ="x = {}\
        x[1],x[2] = string.gsub(c.Str, c.Mode, c.Tag)\
        x.u = string.upper(x[1])";
//Lua的字符串模式
    char *szMode = "(%w+)%s*=%s*(%w+)";
//要处理的字符串
    char *szStr = "key1 = value1 key2 = value2";
//目标字符串模式
    char *szTag = "<%1>%2</%1>";
 
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);

//把一个tabele送给Lua
    lua_newtable(L);    //新建一个table并压入栈顶


//可以改成lua_pushstring(L, value);lua_setfield(L,-2,"key");的形式
    lua_pushstring(L, szMode);// value
    lua_setfield(L, -2, "Mode");
 
     //设置newtable[Mode]=szMode
    //由于上面两次压栈,现在table元素排在栈顶往下数第三的位置
    lua_pushstring(L, "Tag");// key
    lua_pushstring(L, szTag);// value
    lua_settable(L, -3);    //设置newtable[Tag]=szTag
 
    lua_pushstring(L, "Str");// key
    lua_pushstring(L, szStr);// value
    lua_settable(L, -3);    //设置newtable[Str]=szStr
 
    lua_setglobal(L,"c"); //将栈顶元素(newtable)置为Lua中的全局变量c

//执行
    bool err = luaL_loadbuffer(L, szLua_code, strlen(szLua_code),
                "demo") || lua_pcall(L, 0, 0, 0);
    if(err)
    {
//如果错误,显示
        printf("%s",  lua_tostring(L, -1));
char *t = lua_tostring(L,-1);
//弹出栈顶的这个错误信息
        lua_pop(L, 1);
    }
    else
    {
//Lua执行后取得全局变量的值
        lua_getglobal(L, "x");

//这个x应该是个table
        if(lua_istable(L,-1))
        {
//取得x.u,即x["u"]
            lua_pushstring(L,"u");    //key

//由于这次压栈,x处于栈顶第二位置
            lua_gettable(L,-2);

//如同上面
//lua_getfield(L,-1,"u")

//lua_gettable会弹出上面压入的key,然后把对应的value压入
            //取得数据,然后从栈中弹出这个value
            printf("x.u=%s",lua_tostring(L,-1));
char *t = lua_tostring(L,-1);
            lua_pop(L, 1);
            
//取得x[1]和x[2]
            int i;
            for( i=1; i<=2; i++)
            {
//除了key是数字外,与上面的没什么区别
                lua_pushnumber(L,i);
                lua_gettable(L,-2);
                printf("x[%d]=%s",i,lua_tostring(L,-1));
char *t = lua_tostring(L,-1);
                lua_pop(L, 1);
            }
        }
 
//弹出栈顶的x
        lua_pop(L, 1);
    }
    lua_close(L);

}

 

 

 

void lua_newtable (lua_State *L);
    新建一个空的table并压入栈顶。
void lua_settable (lua_State *L, int idx);
    lua_settable以table在栈中的索引作为参数,并将栈顶的key和value出栈,用这两个值修改table。
void lua_gettable (lua_State *L, int idx);
    lua_gettable以table在栈中的索引作为参数,弹出栈顶的元素作为key,返回与key对应的value并压入栈顶。
最后,Lua告别针对table提供了存取函数
void lua_rawgeti (lua_State *L, int idx, int n)
    取得table[n]并放到栈顶,上例中69-70行的lua_pushnumber(L,i);lua_gettable(L,-2);可以用lua_rawgeti(L,-1)代替。
lua_getfield (lua_State *L, int idx, const char *k)
    取得table.k并放到栈顶,上例中57-59行的lua_pushstring(L,"u");lua_gettable(L,-2);可以替换成lua_getfield(L,-1,"u")。
void lua_setfield (lua_State *L, int idx, const char *k)
    把栈顶的数据作为value放入table.k中,上例中的形如lua_pushstring(L, "key");lua_pushstring(L, value);lua_settable(L, -3);可以改成lua_pushstring(L, value);lua_setfield(L,-2,"key");的形式。
void lua_rawseti (lua_State *L, int idx, int n)
    把栈顶的数据作为value放入table[n]中

 

https://blog.csdn.net/yhhwatl/article/details/9303675

这边文章解释的不错,转帖过来

 

openresty的ngx_lua模块就是实现lua和c交互的模块,可以通过ngx_lua了解ngx.var等解析过程

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值