Преобразование фрагмента функции Lua в строку C - PullRequest
0 голосов
/ 02 октября 2018

Я работаю над проектом, который берет строку 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?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Я почти уверен, что это связано с нулевыми символами в строке

Да, именно потому, что строки Lua могут содержать нули.

, чтоЯ думаю, что мешает функционированию lua_tostring.

И это неверно.lua_tostring() работает как задумано.Просто strcat(), который вы используете, копирует данные только до ближайшего нулевого байта.

Если вам нужно скопировать строку, используйте memcpy, передавая ей и указатель на данные строки Lua, иДлина строки Lua (lua_len, lua_rawlen и т. Д.).

Но для печати вам даже не нужно ничего копировать.Передайте переменную len в качестве аргумента chars() и проверьте эту длину вместо ожидания нулевого байта.

0 голосов
/ 02 октября 2018

Проблема не в lua_tostring, а strcat, которая копирует, пока не найдет нулевые символы.Та же проблема с вашей chars функцией.Это должно работать:

memcpy(cp, lua_tostring(L, 1), len);
chars(cp, len);
...
static void chars(char* cp, size_t len) {
    for (size_t i = 0; i < len; ++i, ++cp) {
        putchar(*cp);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...