Я модифицировал интерпретатор Lua в C ++ для работы с другими библиотеками.
Проблема заключается в том, что он работает как терминал, но вы не можете использовать функцию, так же как и клавиши со стрелками для поиска предыдущих команд и т. Д.
Код похож на: http://www.wesnoth.org/devdocs/lua_8cpp_source.html с проблемой в функциях pushline (строка 259) и loadline (строка 280) Я думаю. АВТОРСКИЕ ПРАВА УВАЖАЮЩИХ ЛЮДЕЙ.
static int pushline (lua_State *L, int firstline) {
char buffer[LUA_MAXINPUT]; /* and using char affects the result as arrow UP keys is shown as ^[[A */
char *b = buffer;
size_t l;
const char *prmt = get_prompt(L, firstline);
int readstatus = lua_readline(L, b, prmt); /*readline does not accept arrow key but its characters */
lua_pop(L, 1);
if (readstatus == 0)
return 0;
l = strlen(b);
if (l > 0 && b[l-1] == '\n')
b[l-1] = '\0';
if (firstline && b[0] == '=')
lua_pushfstring(L, "return %s", b+1);
else
lua_pushstring(L, b);
lua_freeline(L, b);
return 1;
}
static int loadline (lua_State *L) {
int status;
lua_settop(L, 0);
if (!pushline(L, 1))
return -1;
for (;;) {
size_t l;
const char *line = lua_tolstring(L, 1, &l);
status = luaL_loadbuffer(L, line, l, "=stdin"); /* I think the error is using stdin */
if (!incomplete(L, status)) break;
if (!pushline(L, 0))
return -1;
lua_pushliteral(L, "\n");
lua_insert(L, -2);
lua_concat(L, 3);
}
lua_saveline(L, 1);
lua_remove(L, 1);
return status;
}
Ожидаемый результат:
>> foo = 3 /*press enter after typing */
>> /* pressing arrow keys should show 'foo = 3' or pressing down key should show the current typed words */
Реальная продукция:
>> foo = 3 /*press enter after typing */
>> /* pressing arrow keys should shows '^[[A' or pressing down key shows '^[[D' */
Понятия не имею, как это сделать. Я думал об использовании getch или getchar, но это не работает. ncurses хорошая идея? Кодовый ответ с объяснением очень помог бы мне! Кроме того, ссылки на документы для любой соответствующей документации по используемой функции.