108 lines
2.6 KiB
Lua
108 lines
2.6 KiB
Lua
-- module table
|
|
local tools = {}
|
|
|
|
-- load required stuff
|
|
local require = require
|
|
|
|
local string = require("string")
|
|
local str_format = string.format
|
|
local str_byte = string.byte
|
|
|
|
local table = require("table")
|
|
local tbl_concat = table.concat
|
|
local tbl_sort = table.sort
|
|
|
|
local type = type
|
|
local error = error
|
|
local pairs = pairs
|
|
|
|
local math = require("math")
|
|
local math_floor = math.floor
|
|
|
|
|
|
-- Returns string encoded as HEX
|
|
function tools.hex(str)
|
|
local res = {}
|
|
for i = 1, #str do
|
|
res[i] = str_format("%02X", str_byte(str, i))
|
|
end
|
|
return tbl_concat(res)
|
|
end
|
|
|
|
-- Integer division function
|
|
function tools.div(x, y)
|
|
return math_floor(x / y)
|
|
end
|
|
|
|
-- table.sort callback for tools.sortedpairs()
|
|
local function sortedpairs_compare(a, b)
|
|
local a_type = type(a)
|
|
local b_type = type(b)
|
|
if (a_type == "string" and b_type == "string") or (a_type == "number" and b_type == "number") then
|
|
return a < b
|
|
elseif a_type == "number" then
|
|
return true
|
|
elseif b_type == "number" then
|
|
return false
|
|
else
|
|
error("sortedpairs failed to make a stable keys comparison of types "..a_type.." and "..b_type)
|
|
end
|
|
end
|
|
|
|
-- Iterate through table keys and values in stable (sorted) order
|
|
function tools.sortedpairs(tbl)
|
|
local keys = {}
|
|
for k in pairs(tbl) do
|
|
local k_type = type(k)
|
|
if k_type ~= "string" and k_type ~= "number" then
|
|
error("sortedpairs failed to make a stable iteration order for key of type "..type(k))
|
|
end
|
|
keys[#keys + 1] = k
|
|
end
|
|
tbl_sort(keys, sortedpairs_compare)
|
|
local i = 0
|
|
return function()
|
|
i = i + 1
|
|
local key = keys[i]
|
|
if key then
|
|
return key, tbl[key]
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Converts multi-line string to a HEX string, removing all whitespace and line-comments started with "--"
|
|
function tools.extract_hex(str)
|
|
local res = {}
|
|
-- iterate through lines
|
|
local n = 0
|
|
for line in str:gmatch("[^\n]+") do
|
|
n = n + 1
|
|
-- find a comment start
|
|
local comment_begin = line:find("--", 1, true)
|
|
if comment_begin then
|
|
-- remove comment from the line
|
|
line = line:sub(1, comment_begin - 1)
|
|
end
|
|
-- remove all whitespace from the line
|
|
line = line:gsub("%s", "")
|
|
-- check for the non-hex chars
|
|
local non_hex = line:find("[^0-9A-Fa-f]+")
|
|
if non_hex then
|
|
error(string.format("non-hex char '%s' at %s:%s", line:sub(non_hex, non_hex), n, non_hex))
|
|
end
|
|
-- append line to concat list
|
|
res[#res + 1] = line
|
|
end
|
|
-- finally concat all lines onto one HEX-string
|
|
local hexstr = tbl_concat(res)
|
|
if (#hexstr % 2) ~= 0 then
|
|
error("odd number of chars in the resulting HEX string")
|
|
end
|
|
return hexstr
|
|
end
|
|
|
|
-- export module table
|
|
return tools
|
|
|
|
-- vim: ts=4 sts=4 sw=4 noet ft=lua
|