портируем все внешние зависимости в свои локальные ( аллокатор памяти, файловый io и gettime и прочая мура перехватывается и реализуется ручками, newlib идет в жеппу. )
нахрен под корень выпиливается все что связано с уобищем под названием "printf/sprinf/fprintf/..... " Родя похоже решил в коде все варианты IO говна вставить- b POSIX API и не POSIX, гдето даже Масдайную чудесатость встретил, тогда как можно было бы обойтись по одной функцией на базовый тип и сделать тонкий иниерфейс... поздно. макароны так хорошо перепутались что распутывать себе дороже.
однако ж собралось и с такой то матерью заработало.
экспериет выглядел так.
в main() создаем Lua стейт , пихаем в него строку в которой реализуется фцнкция решения квадратного уравнения, и вызов этой функции с праметрами.
после отработки строки , сворачиваем Lua стейт взад.
на всех стадиях смотрим сотояние кучи которая прикручена к Lua и сотояние основного стека.
void *port_luaL_alloc (void *ud, void *ptr, size_t osize, size_t nsize)
{
(void)(ud); (void)(osize);
if (nsize == 0) {
o1heap_mmgr::o1heap1.dealloc(ptr);
return NULL;
}
else
return o1heap_mmgr::o1heap1.realloc(ptr, nsize);
}
// KGP: move to external user-appliction level
int main (int argc, char **argv)
{
#if 0
int status, result;
lua_State *L = luaL_newstate(port_luaL_alloc); /* create state */
if (L == NULL) {
l_message(argv[0], "cannot create state: not enough memory");
return EXIT_FAILURE;
}
lua_gc(L, LUA_GCSTOP); /* stop GC while building state */
lua_pushcfunction(L, &pmain2); /* to call 'pmain' in protected mode */
lua_pushinteger(L, argc); /* 1st argument */
lua_pushlightuserdata(L, argv); /* 2nd argument */
status = lua_pcall(L, 2, 1, 0); /* do the call */
result = lua_toboolean(L, -1); /* get result */
report(L, status);
lua_close(L);
return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
#endif
int status, result;
lua_State *L ;
if ( !(L = luaL_newstate(f)) )
{
l_message(argv[0], "cannot create state: not enough memory");
return EXIT_FAILURE;
}
lua_gc(L, LUA_GCSTOP); /* stop GC while building state */
//
// lua_pushcfunction(L, &pmain); /* to call 'pmain' in protected mode */
// lua_pushinteger(L, argc); /* 1st argument */
// lua_pushlightuserdata(L, argv); /* 2nd argument */
//
//
// status = lua_pcall(L, 2, 1, 0); /* do the call */
luai_openlibs(L); /* open standard libraries */
lua_gc(L, LUA_GCRESTART); /* start GC... */
lua_gc(L, LUA_GCGEN); /* ...in generational mode */
char func[] = "local function solveQuadratic(a, b, c) \
local delta = (b^2) - (4 * a * c) \
print(delta) \
\
if delta < 0 then \
return \"No real roots\" \
elseif delta == 0 then \
local root = -b / (2 * a) \
return root \
else \
local sqrt_delta = math.sqrt(delta) \
local root1 = (-b + sqrt_delta) / (2 * a) \
local root2 = (-b - sqrt_delta) / (2 * a) \
return root1, root2 \
end \
end \
print(solveQuadratic(1, -5, 5)) ";
if (luaL_dostring(L, func ) != LUA_OK) {
const char *err = lua_tostring(L, -1);
fputs(err,0);
}
char task[] = "v=1051.36 print(v/10000)" ;
if (luaL_dostring(L, task ) != LUA_OK) {
const char *err = lua_tostring(L, -1);
fputs(err,0);
}
result = lua_toboolean(L, -1); /* get result */
report(L, status);
lua_close(L);
return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
}

получили - после разворачивания L - 2к озу из кучи, на момент работы с строкой 18к после окончания Lua честно все вернуло до байта взад в кучу.
общее использования основного стека как видно из скриншота - около 3кБ

как видно Lua при обработке строки решая урвнение 288 раза тыкалась в кучу, максимальный запрос блока был до 1Кб.
как то так...
зачем это нужно - Lua позволяет запустить машину и программировать ее поведение закидывая ее строками.
фактически - пихать в нее программку на lua-коде и динамически программировать. слово такое похабное есть - скриптование.
скорость наверно не будеть фантастичесской ибо это ж интерпретаор строки... но в больших машинах где нужно таоке и очень быстрое - отказываются от питона и преходят на Lua. очень широко используется в компьтерных играх.