kaitai_struct_lua_runtime icon indicating copy to clipboard operation
kaitai_struct_lua_runtime copied to clipboard

string_decode does not work on lua 5.3

Open learn-more opened this issue 4 years ago • 1 comments

LuaError
"./lua_runtime/string_decode.lua:19: attempt to index a nil value (global 'bit32')
stack traceback:
	./lua_runtime/string_decode.lua:19: in upvalue 'utf8_to_32'
	./lua_runtime/string_decode.lua:38: in function 'string_decode.decode'
	./zip.lua:"

bit32 is deprecated in lua 5.3

learn-more avatar Oct 11 '20 11:10 learn-more

Lua 5.3+ uses bitwise operators instead of bit32. Here is an edited version of the string_decode file.

--
-- String decoder functions
--

local stringdecode = {}

-- From http://lua-users.org/wiki/LuaUnicode
local function utf8_to_32(utf8str)
    assert(type(utf8str) == "string")
    local res, seq, val = {}, 0, nil

    for i = 1, #utf8str do
        local c = string.byte(utf8str, i)
        if seq == 0 then
            table.insert(res, val)
            seq = c < 0x80 and 1 or c < 0xE0 and 2 or c < 0xF0 and 3 or
                  c < 0xF8 and 4 or --c < 0xFC and 5 or c < 0xFE and 6 or
                error("Invalid UTF-8 character sequence")
            val = c & (2^(8-seq) - 1)
        else
            val = (val << 6) | (c & 0x3F)
        end

        seq = seq - 1
    end

    table.insert(res, val)

    return res
end

function stringdecode.decode(str, encoding)
    local enc = encoding and encoding:lower() or "ascii"

    if enc == "ascii" then
        return str
    elseif enc == "utf-8" then
        local code_points = utf8_to_32(str)

        return utf8.char(table.unpack(code_points))
    else
        error("Encoding " .. encoding .. " not supported")
    end
end

return stringdecode

MegaPiggy avatar Aug 31 '21 07:08 MegaPiggy