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