67 lines
1.9 KiB
Lua
Executable File
67 lines
1.9 KiB
Lua
Executable File
local description = [=[
|
|
Usage: lua bin2c.lua [+]filename [status]
|
|
|
|
Write a C source file to standard output. When this C source file is
|
|
included in another C source file, it has the effect of loading and
|
|
running the specified file at that point in the program.
|
|
|
|
The file named by 'filename' contains either Lua byte code or Lua source.
|
|
Its contents are used to generate the C output. If + is used, then the
|
|
contents of 'filename' are first compiled before being used to generate
|
|
the C output. If given, 'status' names a C variable used to store the
|
|
return value of either luaL_loadbuffer() or lua_pcall(). Otherwise,
|
|
the return values of these functions will be unavailable.
|
|
|
|
This program is (overly) careful to generate output identical to the
|
|
output generated by bin2c5.1 from LuaBinaries.
|
|
|
|
http://lua-users.org/wiki/BinTwoCee
|
|
]=]
|
|
|
|
if not arg or not arg[1] then
|
|
io.stderr:write(description)
|
|
return
|
|
end
|
|
|
|
local compile, filename = arg[1]:match"^(+?)(.*)"
|
|
local status = arg[2]
|
|
|
|
local content = compile=="+"
|
|
and string.dump(assert(loadfile(filename)))
|
|
or assert(io.open(filename,"rb")):read"*a"
|
|
|
|
local function boilerplate(fmt)
|
|
return string.format(fmt,
|
|
status and "("..status.."=" or "",
|
|
filename,
|
|
status and ")" or "",
|
|
status and status.."=" or "",
|
|
filename)
|
|
end
|
|
|
|
local dump do
|
|
local numtab={}; for i=0,255 do numtab[string.char(i)]=("%3d,"):format(i) end
|
|
function dump(str)
|
|
return (str:gsub(".", numtab):gsub(("."):rep(80), "%0\n"))
|
|
end
|
|
end
|
|
|
|
io.write(boilerplate[=[
|
|
/* code automatically generated by bin2c -- DO NOT EDIT */
|
|
{
|
|
/* #include'ing this file in a C program is equivalent to calling
|
|
if (%sluaL_loadfile(L,%q)%s==0) %slua_pcall(L, 0, 0, 0);
|
|
*/
|
|
/* %s */
|
|
static const unsigned char B1[]={
|
|
]=], dump(content), boilerplate[=[
|
|
|
|
};
|
|
|
|
%siuplua_dobuffer(L,(const char*)B1,sizeof(B1),"="%q)%s;
|
|
}
|
|
]=])
|
|
|
|
-- replaced by iuplua_dobuffer
|
|
-- if (%sluaL_loadbuffer(L,(const char*)B1,sizeof(B1),"="%q)%s==0) %slua_pcall(L, 0, 0, 0);
|