1. 程式人生 > >LUA解析配置檔案-C語言呼叫

LUA解析配置檔案-C語言呼叫

前幾天也轉載過LUA的一片文章,但自己驗證時發現上面寫的例子缺少一些東西直接跑不通,不過我已經修正。

話不多說,看程式碼吧:

--parser.lua
local file=io.open("./test.conf", "r");

modulename="NOT Found";
port=-1;

function get_modulename(line)
    if (string.find(line, "lib.*.so$")) then
	modulename = string.sub(line, string.find(line, "lib.*.so$"));
    end
end

function get_port(line)
    if (string.find(line, "^port=%d+$")) then
        sport = string.sub(line, string.find(line, "%d+$"));
        port = tonumber(sport);
    end
end

for line in file:lines() do
    get_modulename(line);
    get_port(line);
end

file:close();

接著是配置檔案

//test.conf

name:libaccess_udp_plugin.so
port=2000

C語言主調程式

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

#define err_exit(num,fmt,args...)  \
    do{printf("[%s:%d]"fmt"\n",__FILE__,__LINE__,##args);exit(num);} while(0)

#define err_return(num,fmt,args...)  \
    do{printf("[%s:%d]"fmt"\n",__FILE__,__LINE__,##args);return(num);} while(0)

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

    L = luaL_newstate() ;         /* Create Lua state variable */
    if ( L == NULL ) err_return(-1,"luaL_newstat() failed");
    luaL_openlibs(L);             /* Load Lua libraries */

    int ret = 0 ;
    ret = luaL_loadfile(L, "./parser.lua") ;      /* Load but don't run the Lua script */
    if ( ret != 0 ) err_return(-1,"luaL_loadfile failed") ;
    ret = lua_pcall(L, 0, 0, 0) ;                 /* Run the loaded Lua script */
    if ( ret != 0 ) err_return(-1,"lua_pcall failed:%s",lua_tostring(L,-1)) ;


    lua_getglobal(L,"modulename");              //獲取lua中定義的變數
    lua_getglobal(L,"port");

    printf("modulename:%s port=%d\n", lua_tostring(L,-2), lua_tointeger(L,-1)) ;
    lua_pop(L,1) ;

    printf("C Language main\n");
    return 0;
}

Makefile
CC=gcc  
CFLAGS  = $(shell pkg-config --cflags lua5.1)  
LDFLAGS = $(shell pkg-config --libs lua5.1)
  
all:luaconf 
  
luaconf:luaconf.o  
	$(CC) $< $(LDFLAGS) -o [email protected]  
  
%.o: %.c  
	$(CC) $< $(CFLAGS) -c -o [email protected]  
          
clean:
	rm -rf *.o  $(EXAMPLES)  


流媒體

相關推薦

LUA解析配置檔案-C語言呼叫

前幾天也轉載過LUA的一片文章,但自己驗證時發現上面寫的例子缺少一些東西直接跑不通,不過我已經修正。 話不多說,看程式碼吧: --parser.lua local file=io.open("./test.conf", "r"); modulename="NOT F

Ubuntu 使用 C語言呼叫 Shell 檔案 ,sudo 免密碼輸入,為 shell 檔案加殼繞過chmod 4755 許可權問題

需求: 當我們需要指令碼檔案輸入 su 或 sudo 的時候 ,會出現密碼輸入問題 ,如何實現自動輸入密碼? ps : 需求用在 二進位制檔案 呼叫 Shell 檔案的,為shell 檔案加殼繞過chmod 4755 許可權問題 建立 C檔案 #include

python flask 解析配置檔案與寫日誌

test.conf   [kafka]kafka_sys_topic = test-sys-infokafka_sys_group = test-consumer-groupzookeeper_server = 192.168.1.1:2181,192.168.1.2:2181,192.168.1

增加程式碼的通用性-解析配置檔案

時間:2018年11月02日 比方說有這樣一堆資料: arr: [{ id: '1', type: 'a', arr: [1, 2, 3, 4] }, { id: '2', type: 'b', arr: [1, 2, 3, 4, 5] }] 複製程式碼 集合裡面每個元素都有兩個屬性

解析配置檔案自動裝配 DataSource + AbstractRoutingDataSource + AOP 實現動態資料來源 上:原理解析解析資料來源

spring boot 自動裝配會通過 spring.datasource.*為我們自動裝配資料來源,所以想要動態的切換資料來源,第一件事是配置資料來源,其次是怎麼切換?最後何時切換? 原理解析(使用 AbstractRoutingDataSource 實現) spring-jd

解析配置檔案自動裝配 DataSource + AbstractRoutingDataSource + AOP 實現動態資料來源 下:配置動態資料來源,AOP 進行使用

上篇文章中已經藉助 DynamicDataSourceBuilder 類從配置檔案中解析得到了預設資料來源和動態資料來源,接下來需要配置動態資料來源的“本體”,並藉助 AOP 動態的切換資料來源。 配置動態資料來源 AbstractRoutingDataSource 實現了 In

.NET Core實戰專案之CMS 第三章 入門篇-原始碼解析配置檔案及依賴注入

作者:依樂祝 原文連結:https://www.cnblogs.com/yilezhu/p/9998021.html 寫在前面 上篇文章我給大家講解了ASP.NET Core的概念及為什麼使用它,接著帶著你一步一步的配置了.NET Core的開發環境並建立了一個ASP.NET Core的mvc專

C語言呼叫GO語言生成的C靜態庫

一開始看別人的例子,自己弄總是不成功,後來也是去GO語言社群看多幾個例子,找找規律,才把幾個自己沒注意到的細(keng)節填起來了。 GO語言寫一個函式 cktest.go package main import ( "C" "fmt" ) //exp

Redis學習四:解析配置檔案 redis.conf

一、它在哪 地址: 思考:為什麼要將它拷貝出來單獨執行? 二、Units單位 1 配置大小單位,開頭定義了一些基本的度量單位,只支援bytes,不支援bit 2 對大小寫不敏感 三、INCLUDES包含 和我們的Struts2配置檔案類似,可以通過includes包含

mybatis原始碼-解析配置檔案(三)之配置檔案Configuration解析(超詳細, 值得收藏)

1. 簡介 1.1 系列內容 本系列文章講解的是mybatis解析配置檔案內部的邏輯, 即 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); SqlSessionFact

mybatis 解析配置檔案(一)之XML的DOM解析方式

簡介 在之前的文章《mybatis 初步使用(IDEA的Maven專案, 超詳細)》中, 講解了mybatis的初步使用, 並總結了以下mybatis的執行流程: 通過 Resources 工具類讀取 mybatis-config.xml, 存入 Reader; SqlSessionFactoryBuil

C語言呼叫MySQL介面

說明:在做一個專案的過程中,用到了這部分知識,個人覺得網上關於這部分的介紹真的比較模糊,就自己總結一下專案中用到的這些介面的使用方法。 準備工作 這個專案是在Linux下開發,如果需要使

mybatis原始碼-解析配置檔案(二)之解析的流程

1. 簡介 在之前的文章《mybatis 初步使用(IDEA的Maven專案, 超詳細)》中, 講解了mybatis的初步使用, 並總結了以下mybatis的執行流程: 通過 Resources 工具類讀取 mybatis-config.xml,

linux下利用CC++ 語言呼叫需要root許可權

一、簡介        linux對檔案的許可權控制比較嚴格,這樣避免了有特殊意圖的程式獲取root許可權,但在c++程式中希望獲取root的執行許可權去操作一些只有root可讀寫的檔案。 二、詳解 1、setuid法 (1)登入root使用者,將程式設定成ro

mybatis原始碼-解析配置檔案(四)之配置檔案Mapper解析

其中, mappers作為configuration節點的一部分配置, 在本文章中, 我們講解解析mappers節點, 即 xxxMapper.xml 檔案的解析。 1 解析入口 在解析 mybatis-config.xml 時, 會進行解析 xxxMapper.xml 的檔案。 在圖示流程的 XMLCo

mybatis原始碼-解析配置檔案(四-1)之配置檔案Mapper解析(cache)

1. 簡介 本文章主要講解的是, xxxMapper.xml 檔案中, cache 節點的原始碼。 2. 解析 XMLMapperBuilder.cacheElement() 方法主要負責解析 <cache> private void cacheElement(XNode context)

C語言呼叫C++中的函式,extern "C"的含義

C++編譯器在將cpp檔案編譯成庫時,匯出的函式名會改變,成員函式會通過加一些元素變成全域性函式,如果這時候我們需要用C語言呼叫C++的函式, 就有了一個問題,那就是不知道C++庫中匯出的函式名,這是由編譯器決定的,這個時候就需要用到extern關鍵字。例子: test.c

原生mybatis解析配置檔案的原理

最近閒來無事研究mybaits的執行流程和原始碼,這裡來記錄下一點點心得... 原生mybaits(沒有和任何框架整合的)的全域性配置檔案解析的流程如下: 首先容器啟動後mybatis底層建立sqlsessionfactorybuilder物件,該物件呼叫builder方

libcurl C語言呼叫

1、編寫程式碼 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <curl/curl.h> #define POSTURL "6

關於c語言呼叫main函式自身,一點

2018年11月02日 20:27:55 Drmon. 閱讀數:6 標籤: c語言 呼叫自身