compile/squish.compile.lua

Mon, 27 Jul 2009 03:59:39 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Mon, 27 Jul 2009 03:59:39 +0100
changeset 37
cb8b48b08e1e
parent 26
a22604b2f5f3
child 45
69b3487c71cc
permissions
-rw-r--r--

Only add a module to the list once, no matter how many times it is added in the squishy file


-- Not entirely sure that this is correct
-- (produces files twice the size of luac)
-- but it appears to work...

function compile_string(str, name)
	-- Strips debug info, if you're wondering :)
	local b=string.dump(assert(loadstring(str,name)))
	local x,y=string.find(b,str.."\0")
	if not (x and y) then return b; end -- No debug info sometimes?
	return string.sub(b,1,x-5).."\0\0\0\0"..string.sub(b, y+1, -1)
end

function compile_file(infile_fn, outfile_fn)
	local infile, err = io.open(infile_fn);
	if not infile then
		print_err("Can't open input file for reading: "..tostring(err));
		return;
	end
	
	local outfile, err = io.open(outfile_fn..".compiled", "w+");
	if not outfile then
		print_err("Can't open output file for writing: "..tostring(err));
		return;
	end
	
	local data = infile:read("*a");
	infile:close();
	
	local shebang, newdata = data:match("^(#.-\n)(.+)$");
	local code = newdata or data;
	if shebang then
		outfile:write(shebang)
	end

	outfile:write(compile_string(code, outfile_fn));
	
	os.rename(outfile_fn..".compiled", outfile_fn);
end

if opts.compile then
	print_info("Compiling "..out_fn.."...");
	compile_file(out_fn, out_fn);
	print_info("OK!");
end

mercurial