C言語の設定ファイルとしてLuaを使う
C言語の設定ファイルとして各々様々な方法を使用しているかと思いますが、Luaを使うのはいかがでしょうか。
読み取り関数がそんなに複雑にならないのですっきりとしたプログラムになります。
ひとまずココでは設定ファイルが単純にイコールで結ばれている場合について考えます。
デモ
config.lua
1 2 3 4 5 |
-- コメントはハイフン2つを使います seisu=5 jissu=8.3 mojiretu="hogehoge" -- 文字列はダブルクォテーションで囲みましょう |
lua_read.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <lua.h> #include <lualib.h> #include <lauxlib.h> int seisu; double jissu; char mojiretu[300]; /* ------------------------------------------------------------ */ /* lua変数を取得しスタックに格納する。取得できなければエラーを出力し終了*/ void Get_lua_variable(lua_State *L, const char *variable_name){ lua_pop(L, 1); /* スタックから変数をポップする *\//\*一番上のスタックをPOP */ lua_getglobal(L,variable_name); /* 変数を取得しスタックに格納 */ if(!lua_isstring(L,-1)){ /* "-" でスタックの一番上を示す*/ printf("変数 \"%s\" は正しく取得できませんでした\n",variable_name); exit(1); } } /* ------------------------------------------------------------ */ /* Lua変数をint型で返却する */ int Get_lua_integer(lua_State *L, const char *variable_name){ Get_lua_variable(L,variable_name); /* lua変数をスタックに格納する */ return lua_tointeger(L,-1); /* スタックの一番上の値を取得 */ } /* ------------------------------------------------------------ */ /* Lua変数をdouble型で返却する */ double Get_lua_number(lua_State *L, const char *variable_name){ Get_lua_variable(L,variable_name); return lua_tonumber(L,-1); } /* ------------------------------------------------------------ */ /* Lua変数をchar *型で返却する */ char *Get_lua_string(lua_State *L, const char *variable_name){ Get_lua_variable(L,variable_name); return (char *)lua_tostring(L,-1); } /* ------------------------------------------------------------ */ /* luaファイルから変数を取得し格納する*/ void Set_lua_variable(char *config_file_name){ lua_State* L=luaL_newstate(); /*lua オブジェクトの生成*/ luaL_openlibs(L); /*標準ライブラリの読み込み*/ luaL_dofile(L,config_file_name); /*Luaファイルの評価*/ /* 設定値の取得 */ seisu = Get_lua_integer(L,"seisu"); jissu = Get_lua_number(L,"jissu"); strcpy(mojiretu,Get_lua_string(L,"mojiretu")); lua_close(L); /* Luaオブジェクトを解放 */ } /* ------------------------------------------------------------ */ /* main文 */ int main(void){ Set_lua_variable("config.lua"); printf("sisu : %d\n",seisu); printf("jissu: %lf\n",jissu); printf("mojiretu : %s\n",mojiretu); return 0; } |
コンパイル
1 |
gcc -o lua_read lua_read.c -llua |
ライブラリが見つからないときはapt-get で lua や lua-devel をインストールしてください。
実行結果
1 2 3 4 |
./lua_read sisu : 5 jissu: 8.300000 mojiretu : hogehoge |
説明
インクルード
luaと連携する場合には次のヘッダファイルをインクルードする必要があります。
1 2 3 |
#include <lua.h> #include <lualib.h> #include <lauxlib.h> |
C++の場合には
1 2 3 4 5 |
extern "C"{ #include <lua.h> #include <lualib.h> #include <lauxlib.h> } |
設定の変数
大域変数としています。都合が悪かったら適当に直してください。
関数
人によって書き換えるところはSet_lua_variable内のGet_lua_integer, Get_lua_number, Get_lua_string のダブルクォテーションで囲われた内容です。
そのままコピペで使える部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/* ------------------------------------------------------------ */ /* lua変数を取得しスタックに格納する。取得できなければエラーを出力し終了*/ void Get_lua_variable(lua_State *L, const char *variable_name){ lua_pop(L, 1); /* スタックから変数をポップする *\//\*一番上のスタックをPOP */ lua_getglobal(L,variable_name); /* 変数を取得しスタックに格納 */ if(!lua_isstring(L,-1)){ /* "-" でスタックの一番上を示す*/ printf("変数 \"%s\" は正しく取得できませんでした\n",variable_name); exit(1); } } /* ------------------------------------------------------------ */ /* Lua変数をint型で返却する */ int Get_lua_integer(lua_State *L, const char *variable_name){ Get_lua_variable(L,variable_name); /* lua変数をスタックに格納する */ return lua_tointeger(L,-1); /* スタックの一番上の値を取得 */ } /* ------------------------------------------------------------ */ /* Lua変数をdouble型で返却する */ double Get_lua_number(lua_State *L, const char *variable_name){ Get_lua_variable(L,variable_name); return lua_tonumber(L,-1); } /* ------------------------------------------------------------ */ /* Lua変数をchar *型で返却する */ char *Get_lua_string(lua_State *L, const char *variable_name){ Get_lua_variable(L,variable_name); return (char *)lua_tostring(L,-1); } |
使用する設定ファイルによって書き換える(ハイライト部分)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* ------------------------------------------------------------ */ /* luaファイルから変数を取得し格納する*/ void Set_lua_variable(char *config_file_name){ lua_State* L=luaL_newstate(); /*lua オブジェクトの生成*/ luaL_openlibs(L); /*標準ライブラリの読み込み*/ luaL_dofile(L,config_file_name); /*Luaファイルの評価*/ /* 設定値の取得 */ seisu = Get_lua_integer(L,"seisu"); jissu = Get_lua_number(L,"jissu"); strcpy(mojiretu,Get_lua_string(L,"mojiretu")); lua_close(L); /* Luaオブジェクトを解放 */ } |
ダブルクォテーションで囲われた変数をconfig.luaから取得しています。変数の型によって上記3つのGet_lua_hogehogeを使い分けてください。
その他の詳しい仕様は余力があれば書きます。
参考
コメントを残す