lua_loadx
lua チャンクをロードする
[-0, +1, -]
c
int lua_loadx(lua_State *L, lua_Reader reader, void *data, const char *chunkname, const char *mode);
説明
lua_loadx は Lua チャンクをロードし、コンパイル済みチャンクを Lua 関数としてスタックにプッシュします。エラーが発生した場合には、エラーメッセージをプッシュします。この関数の追加機能として、mode 引数を使用して、ロード対象がテキストチャンクかバイナリチャンクかを明示的に制御できるようになっています。
引数
L
Lua ステートへのポインタ。すべての Lua API に共通する、現在の Lua ステートを指す引数。reader
ユーザーが提供するリーダー関数。この関数は、必要に応じてチャンクを読み込みます。lua_Reader
型の関数で、以下のプロトタイプを持ちます:cconst char *reader(lua_State *L, void *data, size_t *size);
data
はリーダー関数に渡される不透明な値。size
は読み取られるチャンクのサイズを受け取ります。- 読み取るデータが終了した場合には、
NULL
を返します。
data
リーダー関数に渡される不透明なユーザーデータ。chunkname
チャンクの名前を指定します。この名前は、エラーメッセージやデバッグ情報で使用されます。mode
チャンクの種類を指定します。この引数はオプションであり、NULL
を渡すことでデフォルト動作(lua_load
と同じ挙動)になります。"b"
: バイナリチャンクのみを許可します。"t"
: テキストチャンクのみを許可します。"bt"
またはNULL
: テキストチャンクとバイナリチャンクの両方を許可します。
戻り値
lua_loadx
は、チャンクのロード結果を示す以下のステータスコードを返します:
0
: 成功。チャンクが正常にロードされ、Lua 関数としてスタックにプッシュされました。LUA_ERRSYNTAX
: 構文エラー。チャンクの解析中にエラーが発生しました。LUA_ERRMEM
: メモリ割り当てエラー。
動作
lua_loadx
は以下の手順で動作します:
reader
関数を使用してチャンクのデータを読み取ります。- 読み取ったデータを解析し、
mode
に従ってチャンクの種類(テキストまたはバイナリ)を検証します。 - データが正しい形式であれば、Lua 関数としてコンパイルし、スタックにプッシュします。
- チャンクが無効である場合やエラーが発生した場合、適切なエラーメッセージをスタックにプッシュします。
サンプルコード
以下のコードは、lua_loadx
を使用してテキストチャンクをロードする例です。
c
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
const char *reader(lua_State *L, void *data, size_t *size) {
static const char *script = "print('Hello from lua_loadx!')";
if (*size == 0) {
*size = strlen(script);
return script;
}
return NULL;
}
int main() {
lua_State *L = luaL_newstate();
luaL_openlibs(L);
if (lua_loadx(L, reader, NULL, "example_chunk", "t") == 0) {
lua_pcall(L, 0, LUA_MULTRET, 0);
} else {
fprintf(stderr, "Error loading chunk: %s\n", lua_tostring(L, -1));
lua_pop(L, 1);
}
lua_close(L);
return 0;
}
reader
関数は固定の Lua スクリプト文字列を返します。lua_loadx
を使用して、テキストモードでチャンクをロードします。- チャンクが正常にロードされると、
lua_pcall
で実行されます。 - エラーが発生した場合には、エラーメッセージが標準エラー出力に表示されます。
互換性
- LuaJIT
関連項目
- lua_load
- lua_Reader
- lua_pcall
- lua_newstate