Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- -*- coding: raw-text-unix -*- -- For the luaopen_xxx convention, see: PiL 2nd ed, p.244. -- «.demo» (to "demo") ctemplate = [[ // Generated by: (find-angg "LUA/ctemplate.lua") #include <lua.h> #include <lauxlib.h> #include <stdio.h> {extras} static int lua_{name}(lua_State* L) { {body} } LUALIB_API int luaopen_{name}(lua_State *L) { lua_register(L, "{name}", lua_{name}); return 0; } ]] ccompile = function (T) T.extras = T.extras or "" local replacements = {name=T.name, body=T.body, extras=T.extras or ""} T.ccode = ee_template(replacements, ctemplate) T.init = "luaopen_"..T.name T.dir = T.dir or "/tmp/" T.cfname = T.dir..T.name..".c" T.sofname = T.dir..T.name..".so" writefile(T.cfname, T.ccode) T.lua51src = T.lua51src or ee_expand "$LUA51SRC/src" T.compile = "rm -v " .. T.sofname .. "; " .. "gcc -g -Wall -shared -I".. T.lua51src .. " -o " .. T.sofname .. " " .. T.cfname .. "; " .. "ls -lF " .. T.sofname .. " " .. T.cfname T.output = getoutput(T.compile) T.load = function (T) if _G[T.name] then error("_G."..T.name.." exists - cannot reload") end ee_loadlib(T.sofname, T.init) return T end return T end cloadfoo = function () -- hackish: uses a fixed name ("foo") and lots of globals T = ccompile {name="foo", body=cbody, extra=cextra} T:load() print(T.output) return T end --[=[ -- «demo» (to ".demo") -- (find-es "lua5" "ctemplate") * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) ee_dofile "~/LUA/ctemplate.lua" -- (find-angg "LUA/ctemplate.lua") T = ccompile {name="foo", body=[[printf("Hello!\n"); return 0;]]} = T.ccode = T.output = T.init T:load() foo() T = ccompile {name="foo", body=[[printf("Hello 2!\n"); return 0;]]} T:load() --]=]