Lua C接口API 3

Lua C 接口 API 接口比较多,主要都是围绕交互栈的操作,前面学习了如何简单操作交互栈,且相应的API比较多,看起来比较麻烦,也没撒实际用处,所以决定换一种方式来学习,决定通过解决实际的问题来了解这些API。


前言

经常写代码的人应该会遇到要使用配置文件的问题,目前比较流行的配置文件方式有inixmljsonyaml之类的,每一种配置文件的方式都有一种特有的数据结构和解析方式,然而呢,lua其实也可以用来做配置文件,且解析也相应比较简单。

API

下面介绍读取lua配置文件相关的API

载入配置文件

int luaL_loadfile (lua_State *L, const char *filename);

作用:把一个文件加载为 Lua 代码块,代码块的名字被命名为 filename。如果 filename 为NULL,它从标准输入加载。如果文件第一行以#开头,则忽略这一行。

返回值:

  • LUA_OK: 没有错误。
  • LUA_ERRSYNTAX: 在预编译时碰到语法错误。
  • LUA_ERRMEM: 内存分配错误。
  • LUA_ERRGCMM: 在运行 __gc 元方法时出错了。 (这个错误和代码块加载过程无关,它是由垃圾收集器引发的。)

执行lua代码块

int lua_pcall (lua_State *L, int nargs, int nresults, int msgh);

作用: nargs 为压入栈的参数个数, 函数被调用完后所有参数都会出栈。而函数返回值此时入栈,返回值个数调整为nresults。如果 msgh 是 0,返回在栈顶的错误消息就和原始错误消息完全一致。 否则,msgh 就被当成是错误处理函数在栈上的索引位置。

返回值:

  • LUA_OK (0): 成功。
  • LUA_ERRRUN: 运行时错误。
  • LUA_ERRMEM: 内存分配错误。对于这种错,Lua 不会调用错误处理函数。
  • LUA_ERRERR: 在运行错误处理函数时发生的错误。
  • LUA_ERRGCMM: 在运行 __gc 元方法时发生的错误。 (这个错误和被调用的函数无关。)

获取变量

int lua_getglobal (lua_State *L, const char *name);

作用:把全局变量 name 里的值压栈,返回该值的类型。

判断数据类型

int lua_isnumber (lua_State *L, int index);

作用:当给定索引的值是一个数字,或是一个可转换为数字的字符串时,返回 1 ,否则返回 0 。

获取数据

lua_Integer lua_tointeger (lua_State *L, int index);

作用: * 将给定索引处的 Lua 值转换为带符号的整数类型 lua_Integer。 这个 Lua 值必须是一个整数,或是一个可以被转换为整数的数字或字符串; 否则,lua_tointeger返回 0 。

类似函数

  • lua_stringtonumber
  • lua_toboolean
  • lua_tolstring
  • lua_tonumber
  • lua_tostring

以上这些函数,比较容易理解,本文不做介绍,如有需要,可以自行查阅相关手册。

示例

C 控制 lua,以 lua 文件为配置文件示例


/*
 * 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");
}

void PrintfLuaType(lua_State* L, int type)
{
    printf("'%s'", lua_typename(L, type));
}

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

    //加载配置文件
    int iRet = luaL_loadfile(L, "config.lua");
    if(iRet)
    {
        printf("laodfile config.lua fail!!\n");
        lua_close(L);
        return 0;
    }

    iRet = lua_pcall(L, 0, 0, 0);
    if(iRet)
    {
        printf("lua_pcall fail!!\n");
        lua_close(L);
        return 0;
    }

    lua_getglobal(L, "width");
    lua_getglobal(L, "height");
    stackDump(L);

    //width
    if(!lua_isnumber(L, -2))
    {
        printf("width is not number\n");
        lua_close(L);
        return 0;
    }

    //height
    if(!lua_isnumber(L, -1))
    {
        printf("height is not number\n");
        lua_close(L);
        return 0;
    }
    int iHeight = lua_tointeger(L, -2);
    int iWidth = lua_tointeger(L, -1);

    printf("Width[%d] Height[%d]\n", iWidth, iHeight);

    lua_close(L);

    return 0;
}

lua文件如下

width=55
height=50

编译执行结果为:

'55'   '50'
Width[50] Height[55]

总结

C控制lua,将lua当做配置文件,本文只是比较简单的使用示例,比较复杂的配置文件可以使用数据结构table类型的,后续将介绍。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • Nginx API for Lua Introduction ngx.arg ngx.var.VARIABLE C...
    吃瓜的东阅读 5,773评论 0 5
  • 第一篇 语言 第0章 序言 Lua仅让你用少量的代码解决关键问题。 Lua所提供的机制是C不擅长的:高级语言,动态...
    testfor阅读 2,666评论 1 7
  • 当在Lua和C之间交换数据时主要的问题是自动回收与手动回收内存管理的不一致。因此,Lua 用一个抽象的栈在Lua与...
    luffier阅读 2,652评论 0 3
  • 1. 写在前面 很多时候我们都需要借助一些脚本语言来为我们实现一些动态的配置,那么就会涉及到如何让脚本语言跟原生语...
    杰嗒嗒的阿杰阅读 3,431评论 9 31
  • 现在的生活状态,充满了埋怨,低落,消极,自残的行为,暴躁易怒; 我想改变,我想忍耐,所以我沉浸在自己的工作状态里,...
    Emma的心里空间阅读 391评论 0 0