gnucash master: Multiple changes pushed

Mike Alexander mta at code.gnucash.org
Thu May 7 03:17:59 EDT 2015


Updated	 via  https://github.com/Gnucash/gnucash/commit/0017aa6e (commit)
	 via  https://github.com/Gnucash/gnucash/commit/541c779a (commit)
	from  https://github.com/Gnucash/gnucash/commit/d4c537a9 (commit)



commit 0017aa6edc97d530fa6c769f6bdd94c5154a9cc2
Author: Mike Alexander <mta at umich.edu>
Date:   Thu May 7 02:02:33 2015 -0400

    Support version 3 tzfile format which is almost the same as version 2.
    See ftp://ftp.iana.org/tz/code/tzfile.5.txt.

diff --git a/src/libqof/qof/gnc-timezone.cpp b/src/libqof/qof/gnc-timezone.cpp
index f3154c6..b747120 100644
--- a/src/libqof/qof/gnc-timezone.cpp
+++ b/src/libqof/qof/gnc-timezone.cpp
@@ -366,7 +366,7 @@ namespace IANAParser
 	auto isgmt_count = *(endian_swap(reinterpret_cast<uint32_t*>(tzh.ttisgmtcnt)));
 	auto isstd_count = *(endian_swap(reinterpret_cast<uint32_t*>(tzh.ttisstdcnt)));
 	auto leap_count = *(endian_swap(reinterpret_cast<uint32_t*>(tzh.leapcnt)));
-	if (tzh.version == '2' && sizeof(time_t) == sizeof(int64_t))
+	if ((tzh.version == '2' || tzh.version == '3') && sizeof(time_t) == sizeof(int64_t))
 	{
 	    fb_index = (sizeof(tzh) +
 			(sizeof(uint32_t) + sizeof(uint8_t)) * time_count +

commit 541c779a131119aef955e21d44be1e8376aa6c8f
Author: Mike Alexander <mta at umich.edu>
Date:   Thu May 7 01:59:33 2015 -0400

    Use the correct size for time offsets when parsing a tzfile.
    A version 1 tzfile alwasy has 4 byte offsets and a version 2 has
    8 byte offsets in the second half of the file.

diff --git a/src/libqof/qof/gnc-timezone.cpp b/src/libqof/qof/gnc-timezone.cpp
index b244b91..f3154c6 100644
--- a/src/libqof/qof/gnc-timezone.cpp
+++ b/src/libqof/qof/gnc-timezone.cpp
@@ -358,6 +358,7 @@ namespace IANAParser
 	TZHead tzh = *reinterpret_cast<TZHead*>(&fileblock[fb_index]);
 	static constexpr int ttinfo_size = 6; //struct TTInfo gets padded
 	last_year = 2037; //Constrained by 32-bit time_t.
+	int transition_size = 4; // length of a transition time in the file
 
 	auto time_count = *(endian_swap(reinterpret_cast<uint32_t*>(tzh.timecnt)));
 	auto type_count = *(endian_swap(reinterpret_cast<uint32_t*>(tzh.typecnt)));
@@ -385,17 +386,27 @@ namespace IANAParser
 	    isgmt_count = *(endian_swap(reinterpret_cast<uint32_t*>(tzh.ttisgmtcnt)));
 	    isstd_count = *(endian_swap(reinterpret_cast<uint32_t*>(tzh.ttisstdcnt)));
 	    leap_count = *(endian_swap(reinterpret_cast<uint32_t*>(tzh.leapcnt)));
+	    transition_size = 8;
 	}
 	fb_index += sizeof(tzh);
 	auto start_index = fb_index;
-	auto info_index_zero = start_index + time_count * sizeof(time_t);
+	auto info_index_zero = start_index + time_count * transition_size;
 	for(uint32_t index = 0; index < time_count; ++index)
 	{
-	    fb_index = start_index + index * sizeof(time_t);
+	    fb_index = start_index + index * transition_size;
 	    auto info_index = info_index_zero + index;
-	    transitions.push_back(
-		{*(endian_swap(reinterpret_cast<time_t*>(&fileblock[fb_index]))),
-			static_cast<uint8_t>(fileblock[info_index])});
+	    if (transition_size  == 4)
+	    {
+		transitions.push_back(
+		    {*(endian_swap(reinterpret_cast<int32_t*>(&fileblock[fb_index]))),
+			    static_cast<uint8_t>(fileblock[info_index])});
+	    }
+	    else
+	    {
+		transitions.push_back(
+		    {*(endian_swap(reinterpret_cast<int64_t*>(&fileblock[fb_index]))),
+			    static_cast<uint8_t>(fileblock[info_index])});
+	    }
 	}
 
 	//Add in the tzinfo indexes consumed in the previous loop



Summary of changes:
 src/libqof/qof/gnc-timezone.cpp | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)



More information about the gnucash-changes mailing list