X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/97f3375906b56c5dfaddfcdb5208002919006ad1..bdbbf89c38126a71b17049469e8f976c571b9392:/luatz/tzfile.lua diff --git a/luatz/tzfile.lua b/luatz/tzfile.lua index d4285c4..e57db6d 100644 --- a/luatz/tzfile.lua +++ b/luatz/tzfile.lua @@ -3,7 +3,9 @@ local tt_info_mt = require "luatz.tzinfo".tt_info_mt local read_int32be, read_int64be -if string.unpack then -- Only available in Lua 5.3+ +-- luacheck: push std max +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 @@ -15,7 +17,7 @@ if string.unpack then -- Only available in Lua 5.3+ if data == nil then return nil, err end return string.unpack(">i8", data) end -else +else -- luacheck: pop function read_int32be(fd) local data, err = fd:read(4) if data == nil then return nil, err end @@ -43,11 +45,11 @@ else end end -local function read_flags ( fd , n ) - local data , err = fd:read ( n ) - if data == nil then return nil , err end +local function read_flags(fd, n) + local data, err = fd:read(n) + if data == nil then return nil, err end - local res = { } + local res = {} for i=1, n do res[i] = data:byte(i,i) ~= 0 end @@ -55,60 +57,60 @@ local function read_flags ( fd , n ) end local fifteen_nulls = ("\0"):rep(15) -local function read_tz ( fd ) - assert ( fd:read(4) == "TZif" , "Invalid TZ file" ) - local version = assert ( fd:read(1) ) - if version == "\0" or version == "2" then +local function read_tz(fd) + assert(fd:read(4) == "TZif", "Invalid TZ file") + local version = assert(fd:read(1)) + if version == "\0" or version == "2" or version == "3" then local MIN_TIME = -2^32+1 - assert ( assert ( fd:read(15) ) == fifteen_nulls , "Expected 15 nulls" ) + assert(assert(fd:read(15)) == fifteen_nulls, "Expected 15 nulls") -- The number of UTC/local indicators stored in the file. - local tzh_ttisgmtcnt = assert ( read_int32be ( fd ) ) + local tzh_ttisgmtcnt = assert(read_int32be(fd)) -- The number of standard/wall indicators stored in the file. - local tzh_ttisstdcnt = assert ( read_int32be ( fd ) ) + local tzh_ttisstdcnt = assert(read_int32be(fd)) -- The number of leap seconds for which data is stored in the file. - local tzh_leapcnt = assert ( read_int32be ( fd ) ) + local tzh_leapcnt = assert(read_int32be(fd)) -- The number of "transition times" for which data is stored in the file. - local tzh_timecnt = assert ( read_int32be ( fd ) ) + local tzh_timecnt = assert(read_int32be(fd)) -- The number of "local time types" for which data is stored in the file (must not be zero). - local tzh_typecnt = assert ( read_int32be ( fd ) ) + local tzh_typecnt = assert(read_int32be(fd)) -- The number of characters of "timezone abbreviation strings" stored in the file. - local tzh_charcnt = assert ( read_int32be ( fd ) ) + local tzh_charcnt = assert(read_int32be(fd)) - local transition_times = { } + local transition_times = {} for i=1, tzh_timecnt do - transition_times [ i ] = assert ( read_int32be ( fd ) ) + transition_times[i] = assert(read_int32be(fd)) end - local transition_time_ind = { assert ( fd:read ( tzh_timecnt ) ):byte ( 1 , -1 ) } + local transition_time_ind = {assert(fd:read(tzh_timecnt)):byte(1, -1)} - local ttinfos = { } + local ttinfos = {} for i=1, tzh_typecnt do - ttinfos [ i ] = { - gmtoff = assert ( read_int32be ( fd ) ) ; - isdst = assert ( fd:read ( 1 ) ) ~= "\0" ; - abbrind = assert ( fd:read ( 1 ) ):byte ( ) ; + ttinfos[i] = { + gmtoff = assert(read_int32be(fd)); + isdst = assert(fd:read(1)) ~= "\0"; + abbrind = assert(fd:read(1)):byte(); } end - local abbreviations = assert ( fd:read ( tzh_charcnt ) ) + local abbreviations = assert(fd:read(tzh_charcnt)) - local leap_seconds = { } + local leap_seconds = {} -- luacheck: ignore 241 for i=1, tzh_leapcnt do - leap_seconds [ i ] = { - offset = assert ( read_int32be ( fd ) ) ; - n = assert ( read_int32be ( fd ) ) ; + leap_seconds[i] = { + offset = assert(read_int32be(fd)); + n = assert(read_int32be(fd)); } end - local isstd = assert ( read_flags ( fd , tzh_ttisstdcnt ) ) + local isstd = assert(read_flags(fd, tzh_ttisstdcnt)) - local isgmt = assert ( read_flags ( fd , tzh_ttisgmtcnt ) ) + local isgmt = assert(read_flags(fd, tzh_ttisgmtcnt)) local TZ @@ -117,57 +119,58 @@ local function read_tz ( fd ) For version-2-format timezone files, the above header and data is followed by a second header and data, identical in format except that eight bytes are used for each transition time or leap-second time. ]] - assert ( fd:read(5) == "TZif2" ) - assert ( assert ( fd:read(15) ) == fifteen_nulls , "Expected 15 nulls" ) + assert(fd:read(4) == "TZif") + assert(fd:read(1) == version) + assert(assert(fd:read(15)) == fifteen_nulls, "Expected 15 nulls") MIN_TIME = -2^64+1 -- The number of UTC/local indicators stored in the file. - tzh_ttisgmtcnt = assert ( read_int32be ( fd ) ) + tzh_ttisgmtcnt = assert(read_int32be(fd)) -- The number of standard/wall indicators stored in the file. - tzh_ttisstdcnt = assert ( read_int32be ( fd ) ) + tzh_ttisstdcnt = assert(read_int32be(fd)) -- The number of leap seconds for which data is stored in the file. - tzh_leapcnt = assert ( read_int32be ( fd ) ) + tzh_leapcnt = assert(read_int32be(fd)) -- The number of "transition times" for which data is stored in the file. - tzh_timecnt = assert ( read_int32be ( fd ) ) + tzh_timecnt = assert(read_int32be(fd)) -- The number of "local time types" for which data is stored in the file (must not be zero). - tzh_typecnt = assert ( read_int32be ( fd ) ) + tzh_typecnt = assert(read_int32be(fd)) -- The number of characters of "timezone abbreviation strings" stored in the file. - tzh_charcnt = assert ( read_int32be ( fd ) ) + tzh_charcnt = assert(read_int32be(fd)) - transition_times = { } + transition_times = {} for i=1, tzh_timecnt do - transition_times [ i ] = assert ( read_int64be ( fd ) ) + transition_times[i] = assert(read_int64be(fd)) end - transition_time_ind = { assert ( fd:read ( tzh_timecnt ) ):byte ( 1 , -1 ) } + transition_time_ind = {assert(fd:read(tzh_timecnt)):byte(1, -1)} - ttinfos = { } + ttinfos = {} for i=1, tzh_typecnt do - ttinfos [ i ] = { - gmtoff = assert ( read_int32be ( fd ) ) ; - isdst = assert ( fd:read ( 1 ) ) ~= "\0" ; - abbrind = assert ( fd:read ( 1 ) ):byte ( ) ; + ttinfos[i] = { + gmtoff = assert(read_int32be(fd)); + isdst = assert(fd:read(1)) ~= "\0"; + abbrind = assert(fd:read(1)):byte(); } end - abbreviations = assert ( fd:read ( tzh_charcnt ) ) + abbreviations = assert(fd:read(tzh_charcnt)) - leap_seconds = { } + leap_seconds = {} for i=1, tzh_leapcnt do - leap_seconds [ i ] = { - offset = assert ( read_int64be ( fd ) ) ; - n = assert ( read_int32be ( fd ) ) ; + leap_seconds[i] = { + offset = assert(read_int64be(fd)); + n = assert(read_int32be(fd)); } end - isstd = assert ( read_flags ( fd , tzh_ttisstdcnt ) ) + isstd = assert(read_flags(fd, tzh_ttisstdcnt)) - isgmt = assert ( read_flags ( fd , tzh_ttisgmtcnt ) ) + isgmt = assert(read_flags(fd, tzh_ttisgmtcnt)) --[[ After the second header and data comes a newline-enclosed, POSIX-TZ-environment-variable-style string @@ -185,20 +188,20 @@ local function read_tz ( fd ) between daylight saving and standard time. ]] - assert ( assert ( fd:read ( 1 ) ) == "\n" , "Expected newline at end of version 2 header" ) + assert(assert(fd:read(1)) == "\n", "Expected newline at end of version 2 header") - TZ = assert ( fd:read ( "*l" ) ) + TZ = assert(fd:read("*l")) if #TZ == 0 then TZ = nil end end for i=1, tzh_typecnt do - local v = ttinfos [ i ] - v.abbr = abbreviations:sub ( v.abbrind+1 , v.abbrind+3 ) - v.isstd = isstd [ i ] or false - v.isgmt = isgmt [ i ] or false - setmetatable ( v , tt_info_mt ) + local v = ttinfos[i] + v.abbr = abbreviations:sub(v.abbrind+1, v.abbrind+3) + v.isstd = isstd[i] or false + v.isgmt = isgmt[i] or false + setmetatable(v, tt_info_mt) end --[[ @@ -217,31 +220,32 @@ local function read_tz ( fd ) end local res = { + future = TZ; [0] = { - transition_time = MIN_TIME ; - info = ttinfos [ first ] ; + transition_time = MIN_TIME; + info = ttinfos[first]; } } for i=1, tzh_timecnt do - res [ i ] = { - transition_time = transition_times [ i ] ; - info = ttinfos [ transition_time_ind [ i ]+1 ] ; + res[i] = { + transition_time = transition_times[i]; + info = ttinfos[transition_time_ind[i]+1]; } end - return setmetatable ( res , tz_info_mt ) + return setmetatable(res, tz_info_mt) else - error ( "Unsupported version" ) + error("Unsupported version") end end -local function read_tzfile ( path ) - local fd = assert ( io.open ( path , "rb" ) ) - local tzinfo = read_tz ( fd ) - fd:close ( ) +local function read_tzfile(path) + local fd = assert(io.open(path, "rb")) + local tzinfo = read_tz(fd) + fd:close() return tzinfo end return { - read_tz = read_tz ; - read_tzfile = read_tzfile ; + read_tz = read_tz; + read_tzfile = read_tzfile; }