X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/ba4cf5bdfc3e75c0366771a1cdda676e9ccbeeb3..fe885e6eddd5bf1c893d6c6b6767f2cbba54e8a0:/luatz/tzfile.lua?ds=inline diff --git a/luatz/tzfile.lua b/luatz/tzfile.lua index a3fa794..d4285c4 100644 --- a/luatz/tzfile.lua +++ b/luatz/tzfile.lua @@ -1,30 +1,45 @@ local tz_info_mt = require "luatz.tzinfo".tz_info_mt local tt_info_mt = require "luatz.tzinfo".tt_info_mt +local read_int32be, read_int64be -local function read_int32be ( fd ) - local data , err = fd:read ( 4 ) - if data == nil then return nil , err end - local o1 , o2 , o3 , o4 = data:byte ( 1 , 4 ) +if string.unpack then -- Only available in Lua 5.3+ + function read_int32be(fd) + local data, err = fd:read(4) + if data == nil then return nil, err end + return string.unpack(">i4", data) + end - local unsigned = o4 + o3*2^8 + o2*2^16 + o1*2^24 - if unsigned >= 2^31 then - return unsigned - 2^32 - else - return unsigned + function read_int64be(fd) + local data, err = fd:read(8) + if data == nil then return nil, err end + return string.unpack(">i8", data) + end +else + function read_int32be(fd) + local data, err = fd:read(4) + if data == nil then return nil, err end + local o1, o2, o3, o4 = data:byte(1, 4) + + local unsigned = o4 + o3*2^8 + o2*2^16 + o1*2^24 + if unsigned >= 2^31 then + return unsigned - 2^32 + else + return unsigned + end end -end -local function read_int64be ( fd ) - local data , err = fd:read ( 8 ) - if data == nil then return nil , err end - local o1 , o2 , o3 , o4 , o5 , o6 , o7 , o8 = data:byte ( 1 , 8 ) + function read_int64be(fd) + local data, err = fd:read(8) + if data == nil then return nil, err end + local o1, o2, o3, o4, o5, o6, o7, o8 = data:byte(1, 8) - local unsigned = o8 + o7*2^8 + o6*2^16 + o5*2^24 + o4*2^32 + o3*2^40 + o2*2^48 + o1*2^56 - if unsigned >= 2^63 then - return unsigned - 2^64 - else - return unsigned + local unsigned = o8 + o7*2^8 + o6*2^16 + o5*2^24 + o4*2^32 + o3*2^40 + o2*2^48 + o1*2^56 + if unsigned >= 2^63 then + return unsigned - 2^64 + else + return unsigned + end end end