Я работаю над проектом, который берет строку Lua и преобразует ее в строку C - совсем не сложно, конечно.Однако я сталкиваюсь с проблемами при попытке преобразовать двоичное представление функции, т. Е. Полученное в результате вызова string.dump
, в строку C.У меня проблемы с чтением всей строки.
Хотя это не является конечной целью проекта, рассмотрим следующий простой пример, где я распечатываю символы в строке один за другим, используя функцию C, которая называетсяchars
, который я зарегистрировал для использования в Lua:
static void chars(char* cp) {
char* pointer = cp;
while (*pointer) {
printf("%c\n", *pointer);
++pointer;
}
return;
}
static int lua_chars(lua_State* L) {
lua_len(L, 1);
size_t len = static_cast<size_t>(lua_tonumber(L, -1)) + 1;
lua_pop(L, 1);
if (len > 0) {
char* cp = static_cast<char*>(malloc(len));
strcat(cp, lua_tostring(L, 1));
chars(cp);
free(cp);
}
return 0;
}
Вызов chars
из сценария Lua будет выглядеть так:
chars("Hello World!")
и будет выводить символы одинпо одному с каждым после новой строки.
Теперь к фактической проблеме.Рассмотрим пример, в котором я объявляю функцию в Lua, выкидываю ее с string.dump
, а затем передаю эту строку в функцию chars
для индивидуальной печати ее символов:
local function foo()
print("foo")
return
end
local s = assert(string.dump(foo))
chars(s)
Строка s
в целом, без печати с моей функцией chars
, выглядит примерно так:
uaS?
xV(w@=stdin@A@$@&?&?printfoo_ENV
Однако chars
печатает только первые пять байтов:
u
a
S
(Примечаниепредполагается, что перед 'u' должны быть две строки пробела.)
Я почти уверен, что это связано с нулевыми символами в строке, которые, как мне кажется, мешают функционированию lua_tostring
.Я наткнулся на lua_Writer
для чтения фрагментов, но я не знаю, как его использовать / кодировать.Как я могу успешно преобразовать всю строку в стеке Lua в строку C?