]>
Commit | Line | Data |
---|---|---|
6742c089 | 1 | bin = require('bin') |
2 | ||
3 | ||
4 | ------------------------------- | |
5 | -- Some utilities | |
6 | ------------------------------- | |
7 | ||
8 | --- | |
9 | -- A debug printout-function | |
10 | local function dbg(args) | |
fdefed66 MHS |
11 | |
12 | if type(args) == "table" then | |
13 | local i = 1 | |
14 | while args[i] do | |
15 | print("###", args[i]) | |
16 | i = i+1 | |
17 | end | |
18 | else | |
6742c089 | 19 | print("###", args) |
fdefed66 MHS |
20 | end |
21 | end | |
6742c089 | 22 | --- |
23 | -- This is only meant to be used when errors occur | |
24 | local function oops(err) | |
25 | print("ERROR: ",err) | |
c44241fd | 26 | return nil, err |
6742c089 | 27 | end |
28 | ||
29 | local function save_HTML(javascript, filename) | |
30 | ||
31 | -- Read the HTML-skel file | |
32 | local skel = require("htmlskel") | |
33 | html = skel.getHTML(javascript); | |
34 | ||
35 | -- Open the output file | |
36 | ||
37 | local outfile = io.open(filename, "w") | |
38 | if outfile == nil then | |
c44241fd | 39 | return oops(string.format("Could not write to file %s",tostring(filename))) |
6742c089 | 40 | end |
41 | -- Write the data into it | |
42 | outfile:write(html) | |
43 | io.close(outfile) | |
44 | ||
45 | -- Done | |
46 | return filename | |
47 | ||
48 | end | |
49 | ||
f595de25 | 50 | local function save_TEXT(data,filename) |
51 | -- Open the output file | |
31d1caa5 | 52 | local outfile = io.open(filename, "w") |
f595de25 | 53 | if outfile == nil then |
54 | return oops(string.format("Could not write to file %s",tostring(filename))) | |
55 | end | |
56 | ||
57 | outfile:write(data) | |
58 | io.close(outfile) | |
59 | return filename | |
60 | end | |
61 | ||
fdefed66 MHS |
62 | local function save_BIN(data, filename) |
63 | -- Open the output file | |
64 | ||
65 | local outfile = io.open(filename, "wb") | |
66 | if outfile == nil then | |
67 | return oops(string.format("Could not write to file %s",tostring(filename))) | |
68 | end | |
69 | ||
70 | -- Write the data into it | |
71 | local i = 1 | |
72 | while data[i] do | |
73 | outfile:write(data[i]) | |
74 | i = i+1 | |
75 | end | |
76 | ||
77 | io.close(outfile) | |
78 | return filename | |
79 | end | |
6742c089 | 80 | |
81 | local function convert_ascii_dump_to_JS(infile) | |
82 | local t = infile:read("*all") | |
4697964f | 83 | local cleaned |
6742c089 | 84 | local output = "["; |
85 | for line in string.gmatch(t, "[^\n]+") do | |
fdefed66 | 86 | if string.byte(line,1) ~= string.byte("+",1) then |
4697964f | 87 | cleaned = (line or ''):gsub('%s+','') |
88 | output = output .. "'"..cleaned.."',\n" | |
fdefed66 | 89 | end |
6742c089 | 90 | end |
91 | output = output .. "]" | |
92 | return output | |
93 | end | |
94 | ||
6742c089 | 95 | local function convert_binary_dump_to_JS(infile, blockLen) |
96 | local bindata = infile:read("*all") | |
97 | len = string.len(bindata) | |
98 | ||
99 | if len % blockLen ~= 0 then | |
100 | return oops(("Bad data, length (%d) should be a multiple of blocklen (%d)"):format(len, blockLen)) | |
101 | end | |
102 | ||
103 | local _,hex = bin.unpack(("H%d"):format(len),bindata) | |
104 | ||
105 | -- Now that we've converted binary data into hex, we doubled the size. | |
106 | -- One byte, like 0xDE is now | |
107 | -- the characters 'D' and 'E' : one byte each. | |
108 | -- Thus: | |
109 | blockLen = blockLen * 2 | |
110 | ||
111 | local js,i = "["; | |
112 | for i = 1, string.len(hex),blockLen do | |
113 | js = js .."'" ..string.sub(hex,i,i+blockLen -1).."',\n" | |
114 | end | |
115 | js = js .. "]" | |
116 | return js | |
117 | end | |
118 | ||
fdefed66 MHS |
119 | local function convert_ascii_dump_to_BIN(infile) |
120 | local t = infile:read("*all") | |
4697964f | 121 | local cleaned |
fdefed66 MHS |
122 | local output = {}; |
123 | for line in string.gmatch(t, "[^\n]+") do | |
124 | if string.byte(line) ~= string.byte("+") then | |
4697964f | 125 | cleaned = (line or ''):gsub('%s+','') |
126 | for c in cleaned:gmatch('..') do | |
fdefed66 MHS |
127 | output[#output+1] = string.char( tonumber(c,16) ) |
128 | end | |
129 | end | |
130 | end | |
131 | return output | |
132 | end | |
133 | ||
134 | ||
6742c089 | 135 | --- |
136 | -- Converts a .eml-file into a HTML/Javascript file. | |
137 | -- @param input the file to convert | |
138 | -- @param output the file to write to | |
139 | -- @return the name of the new file. | |
140 | local function convert_eml_to_html(input, output) | |
141 | input = input or 'dumpdata.eml' | |
142 | output = output or input .. 'html' | |
143 | ||
144 | local infile = io.open(input, "r") | |
145 | if infile == nil then | |
c44241fd | 146 | return oops(string.format("Could not read file %s",tostring(input))) |
6742c089 | 147 | end |
148 | ||
149 | -- Read file, get JS | |
150 | local javascript = convert_ascii_dump_to_JS(infile) | |
151 | io.close(infile) | |
152 | return save_HTML(javascript, output ) | |
153 | end | |
154 | ||
155 | --- Converts a binary dump into HTML/Javascript file | |
156 | -- @param input the file containing the dump (defaults to dumpdata.bin) | |
157 | -- @param output the file to write to | |
158 | -- @param blockLen, the length of each block. Defaults to 16 bytes | |
159 | local function convert_bin_to_html(input, output, blockLen) | |
160 | input = input or 'dumpdata.bin' | |
161 | blockLen = blockLen or 16 | |
162 | output = output or input .. 'html' | |
163 | ||
4c367827 | 164 | local infile = io.open(input, "rb") |
6742c089 | 165 | if infile == nil then |
c44241fd | 166 | return oops(string.format("Could not read file %s",tostring(input))) |
6742c089 | 167 | end |
168 | -- Read file, get JS | |
169 | local javascript = convert_binary_dump_to_JS(infile, blockLen) | |
170 | io.close(infile) | |
171 | ||
172 | return save_HTML(javascript, output ) | |
173 | end | |
174 | ||
fdefed66 MHS |
175 | --- Converts a eml dump into a binary file |
176 | -- @param input the file containing the eml-dump (defaults to dumpdata.eml) | |
177 | -- @param output the file to write to ( defaults to dumpdata.bin) | |
178 | local function convert_eml_to_bin(input, output) | |
179 | input = input or 'dumpdata.eml' | |
180 | output = output or 'dumpdata.bin' | |
181 | ||
182 | local infile = io.open(input, "rb") | |
183 | if infile == nil then | |
184 | return oops(string.format("Could not read file %s",tostring(input))) | |
185 | end | |
186 | -- Read file, get BIN | |
187 | local data = convert_ascii_dump_to_BIN(infile) | |
188 | io.close(infile) | |
189 | ||
190 | return save_BIN(data, output ) | |
191 | end | |
192 | ||
193 | ||
6742c089 | 194 | return { |
195 | convert_bin_to_html = convert_bin_to_html, | |
fdefed66 | 196 | convert_eml_to_html = convert_eml_to_html, |
9ccfb3a8 | 197 | convert_eml_to_bin = convert_eml_to_bin, |
f595de25 | 198 | SaveAsBinary = save_BIN, |
199 | SaveAsText = save_TEXT, | |
3af373f3 | 200 | SaveAsBinary = save_BIN, |
201 | SaveAsText = save_TEXT, | |
6742c089 | 202 | } |