X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/92345b0a01c6c0142d2e3582275cd582743a729b..f0b23dea771e2d9cb9a672a147c946f1ad539082:/luatz/tzfile.lua?ds=inline diff --git a/luatz/tzfile.lua b/luatz/tzfile.lua index 96686dc..a3fa794 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 ) @@ -93,7 +95,9 @@ local function read_tz ( fd ) local isgmt = assert ( read_flags ( fd , tzh_ttisgmtcnt ) ) - if version == "2" then + local TZ + + if version == "2" or version == "3" then --[[ 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. @@ -155,6 +159,23 @@ 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). ]] + + --[[ + For version-3-format time zone files, the POSIX-TZ-style string may + use two minor extensions to the POSIX TZ format, as described in newtzset (3). + First, the hours part of its transition times may be signed and range from + -167 through 167 instead of the POSIX-required unsigned values + from 0 through 24. Second, DST is in effect all year if it starts + January 1 at 00:00 and ends December 31 at 24:00 plus the difference + between daylight saving and standard time. + ]] + + 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 +183,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 --[[