X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/e5c87b4489b0881b7b9903733478f0d11ac96ab7..ec368da1e0abf4367784d6a44e280fdc482c571f:/luatz/tzfile.lua?ds=sidebyside diff --git a/luatz/tzfile.lua b/luatz/tzfile.lua index eed426e..36fd8a7 100644 --- a/luatz/tzfile.lua +++ b/luatz/tzfile.lua @@ -1,4 +1,6 @@ local tz_info_mt = require "luatz.tzinfo".tz_info_mt +local tt_info_mt = require "luatz.tzinfo".tt_info_mt + local function read_int32be ( fd ) local data , err = fd:read ( 4 ) @@ -39,7 +41,7 @@ end local fifteen_nulls = ("\0"):rep(15) local function read_tz ( fd ) - assert ( fd:read(4) == "TZif" ) + assert ( fd:read(4) == "TZif" , "Invalid TZ file" ) local version = assert ( fd:read(1) ) if version == "\0" or version == "2" then local MIN_TIME = -2^32+1 @@ -93,6 +95,8 @@ local function read_tz ( fd ) local isgmt = assert ( read_flags ( fd , tzh_ttisgmtcnt ) ) + local TZ + if version == "2" then --[[ For version-2-format timezone files, the above header and data is followed by a second header and data, @@ -155,6 +159,12 @@ local function read_tz ( fd ) for use in handling instants after the last transition time stored in the file (with nothing between the newlines if there is no POSIX representation for such instants). ]] + assert ( assert ( fd:read ( 1 ) ) == "\n" , "Expected newline at end of version 2 header" ) + + TZ = assert ( fd:read ( "*l" ) ) + if #TZ == 0 then + TZ = nil + end end for i=1, tzh_typecnt do @@ -162,6 +172,7 @@ local function read_tz ( fd ) 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 --[[ @@ -198,7 +209,7 @@ local function read_tz ( fd ) end local function read_tzfile ( path ) - local fd = assert ( io.open ( path ) ) + local fd = assert ( io.open ( path , "rb" ) ) local tzinfo = read_tz ( fd ) fd:close ( ) return tzinfo