Mon, 27 Jul 2009 03:28:05 +0100
Warn when output file not writeable
9
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 | -- Not entirely sure that this is correct |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 | -- (produces files twice the size of luac) |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 | -- but it appears to work... |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 | function compile_string(str, name) |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 | -- Strips debug info, if you're wondering :) |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 | local b=string.dump(assert(loadstring(str,name))) |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 | local x,y=string.find(b,str.."\0") |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 | if not (x and y) then return b; end -- No debug info sometimes? |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 | return string.sub(b,1,x-5).."\0\0\0\0"..string.sub(b, y+1, -1) |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 | end |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 | function compile_file(infile_fn, outfile_fn) |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 | local infile, err = io.open(infile_fn); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 | if not infile then |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 | print_err("Can't open input file for reading: "..tostring(err)); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 | return; |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 | end |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 | local outfile, err = io.open(outfile_fn..".compiled", "w+"); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 | if not outfile then |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 | print_err("Can't open output file for writing: "..tostring(err)); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 | return; |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 | end |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 | local data = infile:read("*a"); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 | infile:close(); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 | local shebang, newdata = data:match("^(#.-\n)(.+)$"); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 | local code = newdata or data; |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 | if shebang then |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 | outfile:write(shebang) |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 | end |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 | |
26
a22604b2f5f3
compile: Compile the correct data (fixes a traceback if there is a shebang in the input)
Matthew Wild <mwild1@gmail.com>
parents:
9
diff
changeset
|
36 | outfile:write(compile_string(code, outfile_fn)); |
9
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 | os.rename(outfile_fn..".compiled", outfile_fn); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 | end |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 | if opts.compile then |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 | print_info("Compiling "..out_fn.."..."); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 | compile_file(out_fn, out_fn); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 | print_info("OK!"); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 | end |