c9e2f780 |
1 | -- The getopt-functionality is loaded from pm3/getopt.lua |
2 | -- Have a look there for further details |
3 | getopt = require('getopt') |
4 | bin = require('bin') |
5 | |
2fca3ad9 |
6 | example = "script run dumptoemul -i dumpdata-foobar.bin" |
c9e2f780 |
7 | author = "Martin Holst Swende" |
2fca3ad9 |
8 | usage = "script run dumptoemul [-i <file>] [-o <file>]" |
c9e2f780 |
9 | desc =[[ |
10 | This script takes a dumpfile from 'hf mf dump' and converts it to a format that can be used |
11 | by the emulator |
12 | |
13 | Arguments: |
14 | -h This help |
15 | -i <file> Specifies the dump-file (input). If omitted, 'dumpdata.bin' is used |
fdefed66 |
16 | -o <filename> Specifies the output file. If omitted, <uid>.eml is used. |
c9e2f780 |
17 | |
18 | ]] |
19 | |
20 | ------------------------------- |
21 | -- Some utilities |
22 | ------------------------------- |
23 | |
24 | --- |
25 | -- A debug printout-function |
26 | function dbg(args) |
27 | if DEBUG then |
28 | print("###", args) |
29 | end |
30 | end |
31 | --- |
32 | -- This is only meant to be used when errors occur |
33 | function oops(err) |
34 | print("ERROR: ",err) |
35 | end |
36 | |
37 | |
38 | --- |
39 | -- Usage help |
40 | function help() |
41 | print(desc) |
42 | print("Example usage") |
43 | print(example) |
44 | end |
45 | |
46 | local function convert_to_ascii(hexdata) |
47 | if string.len(hexdata) % 32 ~= 0 then |
48 | return oops(("Bad data, length should be a multiple of 32 (was %d)"):format(string.len(hexdata))) |
49 | end |
50 | |
51 | local js,i = "["; |
52 | for i = 1, string.len(hexdata),32 do |
53 | js = js .."'" ..string.sub(hexdata,i,i+31).."',\n" |
54 | end |
55 | js = js .. "]" |
56 | return js |
57 | end |
58 | |
59 | local function readdump(infile) |
60 | t = infile:read("*all") |
61 | --print(string.len(t)) |
62 | len = string.len(t) |
63 | local len,hex = bin.unpack(("H%d"):format(len),t) |
64 | --print(len,hex) |
65 | return hex |
66 | end |
67 | |
68 | local function convert_to_emulform(hexdata) |
69 | if string.len(hexdata) % 32 ~= 0 then |
70 | return oops(("Bad data, length should be a multiple of 32 (was %d)"):format(string.len(hexdata))) |
71 | end |
72 | local ascii,i = ""; |
73 | for i = 1, string.len(hexdata),32 do |
74 | ascii = ascii ..string.sub(hexdata,i,i+31).."\n" |
75 | end |
dcbaa2b5 |
76 | |
77 | return string.sub(ascii,1,-1) |
c9e2f780 |
78 | end |
79 | |
80 | local function main(args) |
81 | |
82 | local input = "dumpdata.bin" |
83 | local output |
84 | |
85 | for o, a in getopt.getopt(args, 'i:o:h') do |
86 | if o == "h" then return help() end |
87 | if o == "i" then input = a end |
88 | if o == "o" then output = a end |
89 | end |
90 | -- Validate the parameters |
91 | |
6cacefa4 |
92 | local infile = io.open(input, "rb") |
c9e2f780 |
93 | if infile == nil then |
94 | return oops("Could not read file ", input) |
95 | end |
96 | local dumpdata = readdump(infile) |
97 | -- The hex-data is now in ascii-format, |
98 | |
99 | -- But first, check the uid |
100 | local uid = string.sub(dumpdata,1,8) |
101 | output = output or (uid .. ".eml") |
102 | |
103 | -- Format some linebreaks |
104 | dumpdata = convert_to_emulform(dumpdata) |
105 | |
106 | local outfile = io.open(output, "w") |
107 | if outfile == nil then |
108 | return oops("Could not write to file ", output) |
109 | end |
110 | |
111 | outfile:write(dumpdata:lower()) |
112 | io.close(outfile) |
113 | print(("Wrote an emulator-dump to the file %s"):format(output)) |
114 | end |
115 | |
116 | |
117 | --[[ |
118 | In the future, we may implement so that scripts are invoked directly |
119 | into a 'main' function, instead of being executed blindly. For future |
120 | compatibility, I have done so, but I invoke my main from here. |
121 | --]] |
6cacefa4 |
122 | main(args) |