CからLua: Luaのスクリプトファイルを実行

CのプログラムからLuaスクリプトファイルを実行してみます。
luaL_loadfile()を使ってLuaスクリプトファイルを読み込み、lua_pcallで実行します。

// lua_load_script.c
// Luaのスクリプトファイルを読み込み、実行する
#include <stdio.h>

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

int main(int argc, char *argv[])
{
	lua_State *L;
	
	// 開始処理
	L = lua_open();
	luaL_openlibs(L);
	// 実行するLuaスクリプトをロード
	if (luaL_loadfile(L, argv[1])) {
		fprintf(stderr, "luaL_loadfile()でエラー.\n");
		return -1;
	}
	// ロードされている関数を実行
	if (lua_pcall(L, 0, LUA_MULTRET, 0)) {
		fprintf(stderr, "lua_pcall()でエラー.\n");
		return -1;
	}
	// 終了処理
	lua_close(L);

	return 0;
}

で、これをコンパイル&実行。実行時に指定したスクリプトを実行します。
(環境はmsysで、Luaのヘッダファイルへのインクルードパスが通っていること、liblua.aへのライブラリパスが通っていることを前提としてます)

~:$ gcc lua_load_script.c -llua
~:$ ./a.exe src/lua-5.1.3/test/hello.lua
Hello world, from Lua 5.1!

できたできた。
ちなみに、luaL_loadfile()にはLuaバイトコードのファイルを渡してもちゃんとロードしてくれます。実際、下記のようにして、コンパイル後のバイトコードを渡しても同じ結果が得られることが確認できます。

~:$ luac src/lua-5.1.3/test/hello.lua
~:$ ./a.exe luac.out
Hello world, from Lua 5.1!

つまり、luaL_loadfile()では、コンパイル前のスクリプトファイルなのか、コンパイル後のバイトコードなのかを自動で判別してロードしてるってことですね。素晴らしい。