summaryrefslogtreecommitdiff
path: root/src/bin2c.lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin2c.lua')
-rw-r--r--src/bin2c.lua63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/bin2c.lua b/src/bin2c.lua
new file mode 100644
index 0000000..1e3b53f
--- /dev/null
+++ b/src/bin2c.lua
@@ -0,0 +1,63 @@
+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[=[
+
+};
+
+ if (%sluaL_loadbuffer(L,(const char*)B1,sizeof(B1),%q)%s==0) %slua_pcall(L, 0, 0, 0);
+}
+]=])