まずはC言語側からLuaで書かれたコードを読み込んでみましょう.
次のようなLuaソースコードを作成したとします.
このコードのファイル名はsample.luaです.
--sample.lua
--グローバル変数
NAME = "HELLOWORLD"
SIZE = 640
このLuaファイルを読み込むためのC言語コードは以下のようになります.
#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
int main (void)
{
//Luaを開く
lua_State* L = luaL_newstate();
//Luaの標準関数を使用できる状態にする
luaL_openlibs(L);
//Luaファイルsample.luaを読み込む
if( luaL_loadfile(L, "sample.lua") || lua_pcall(L, 0, 0, 0) ) {
printf("sample.luaを開けませんでした\n");
printf("error : %s\n", lua_tostring(L, -1) );
return 1;
}
//ここに何か処理を書く
lua_close(L);
return 0;
}
このプログラムはsample.luaを読み込むだけで何も処理は行いません.
ここで新たに3つの新しい関数が登場しました.
まず,luaL_openlibs関数ですが,この関数は
Lua内で標準関数が利用できるようにするものです.
この関数を呼び出さないとLua内でprint関数などが使用できません.
luaL_loadfile関数ですが,次のような定義となっています.
int luaL_loadfile (lua_State *L, const char *filename);
filenameには開きたいLuaファイルを指定します.
この関数はファイルが読み込めなかった場合
(ファイルが存在しない,文法が間違っていた等),
LUA_ERRFILEを返します.
lua_pcall関数ですが,この関数は本来Luaの関数を呼ぶためのものです.
ここでは使い方を詳しく説明しませんが,
loadfileを行った後ファイルを実行する役目を果たしています.
luaL_openlibs関数及びlua_pcall関数は成功すると0を返します.
この戻り値を使ってファイルが正しく読み込めたかどうかを判定できます.
また,エラーが発生した場合,エラーの詳細をスタックに積んでくれます.
よってスタックトップの値を参照すればエラーの原因を特定できます.
では,試しにluaL_loadfile関数の引数にsample.luaではなく
存在しないファイルtest.luaを
指定してみましょう.
結果は以下のようになります.
実行結果
sample.luaを開けませんでした
error : cannot open test.lua: No such file or directory
またLuaファイルの2行目に適当な文法の文字列を挿入してみます.
挿入した文字列は if a-b=c then end です.
実行結果
sample.luaを開けませんでした
error : sample.lua:2: 'then' expected near '='