c与lua交互 二

(一) lua 代码
    --Lua的字符串模式  
    szMode = "(%w+)%s*=%s*(%w+)";   
   --要处理的字符串   
   szStr = "key1 = value1 key2 = value2";   
    --目标字符串模式  
    szTag = "<%1>%2</%1>"; 
    x = {}
    r = string.gsub(szStr ,szMode , szTag );
    u = string.upper(r);

    for i, va in pairs(x) do

    print(i, va)

    end

运行结果:

1  <key1>value1<key1> <key2>value2<key2>

2  2

u  <EKY1>VALUE1<KEY1> <KEY2>VALUE2<KEY2>

(二)C 与 lua 交互
#include "lua.h" 
#include "lualib.h"
#include "lauxlib.h" 
#include "stdio.h"

 int main() {  
    int ret ;  
    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, "Mode");// key

    lua_pushstring(L, szMode);// value

    //设置newtable[Mode]=szMode

    //由于上面两次压栈,现在table元素排在栈顶往下数第三的位置

    lua_settable(L, -3);

    //lua_settable会自己弹出上面压入的key和value


    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(ret)  {    
         //如果错误,显示  
         printf("%s\n", 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_gettable会弹出上面压入的key,然后把对应的value压入            
               //取得数据,然后从栈中弹出这个value             
               printf( "x.u = %s\n" , lua_tostring(L,-1) );            

               lua_pop(L, 1);       

               //取得x[1]和x[2]             
                for(int i=1; i<=2; i++)            
                {    
           
                    //除了key是数字外,与上面的没什么区别                
                     lua_pushnumber(L,i);                
                     lua_gettable(L,-2);                 
                      printf("x[%d]=%s\n",   lua_tostring(L,-1)  );              
                      lua_pop(L, 1);      
   
                 }      

           }

           //弹出栈顶的x

           lua_pop(L, 1);

    

      lua_close(L);  
      return 0; 
}

运行结果:

x.u = <EKY1>VALUE1<KEY1> <KEY2>VALUE2<KEY2>

x[1] =  <key1>value1<key1> <key2>value2<key2>

x[2] =  2


本例中用到的新Lua C API是:

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]并放到栈顶,上例中lua_pushnumber(L,i);lua_gettable(L,-2);可以用lua_rawgeti(L,-1)代替。
lua_getfield (lua_State *L, int idx, const char *k)
    取得table.k并放到栈顶,上例中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]中


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值