summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/util/timeconv.cpp
diff options
context:
space:
mode:
author npwoods <npwoods@alumni.carnegiemellon.edu>2017-04-05 21:39:00 -0400
committer Vas Crabb <cuavas@users.noreply.github.com>2017-04-06 11:39:00 +1000
commitf809f0e08d451c7fa05116c9c7b147f499ea82d7 (patch)
tree8a97a329d1be1014fb51bd36b400c4dee4d2153f /src/lib/util/timeconv.cpp
parentee19701c2cd582c17c8a3b855386cd1b79856560 (diff)
Introduced an 'util::arbitrary_clock' template class, to represent a clock that "knows" when the epoch starts (#2010)
* Introduced an 'util::arbitrary_clock' template class, to represent a clock that "knows" when the epoch starts Also: - Converted the NTFS filetime code to use util::arbitrary_clock - Converted the Mac datetime code to use util::atribrary_clock This is in preparation for a bigger change to Imgtool where I eliminate usage of time_t
Diffstat (limited to 'src/lib/util/timeconv.cpp')
-rw-r--r--src/lib/util/timeconv.cpp31
1 files changed, 16 insertions, 15 deletions
diff --git a/src/lib/util/timeconv.cpp b/src/lib/util/timeconv.cpp
index e0d41fbde75..20f4e29a03e 100644
--- a/src/lib/util/timeconv.cpp
+++ b/src/lib/util/timeconv.cpp
@@ -14,47 +14,48 @@
namespace util {
-namespace {
/***************************************************************************
PROTOTYPES
***************************************************************************/
-util::ntfs_duration calculate_ntfs_offset();
+static std::chrono::system_clock::duration calculate_system_clock_adjustment();
/***************************************************************************
GLOBAL VARIABLES
***************************************************************************/
-util::ntfs_duration f_ntfs_offset(calculate_ntfs_offset());
+std::chrono::system_clock::duration system_clock_adjustment(calculate_system_clock_adjustment());
/***************************************************************************
IMPLEMENTATION
***************************************************************************/
-util::ntfs_duration calculate_ntfs_offset()
+static std::chrono::system_clock::duration calculate_system_clock_adjustment()
{
constexpr auto days_in_year(365);
constexpr auto days_in_four_years((days_in_year * 4) + 1);
constexpr auto days_in_century((days_in_four_years * 25) - 1);
constexpr auto days_in_four_centuries((days_in_century * 4) + 1);
- constexpr ntfs_duration day(std::chrono::hours(24));
- constexpr ntfs_duration year(day * days_in_year);
- constexpr ntfs_duration four_years(day * days_in_four_years);
- constexpr ntfs_duration century(day * days_in_century);
- constexpr ntfs_duration four_centuries(day * days_in_four_centuries);
+ // can't use std::chrono::system_clock::duration here, out of fear of integer overflow
+ typedef std::chrono::duration<std::int64_t, std::ratio<1, 1> > int64_second_duration;
+ constexpr int64_second_duration day(std::chrono::hours(24));
+ constexpr int64_second_duration year(day * days_in_year);
+ constexpr int64_second_duration four_years(day * days_in_four_years);
+ constexpr int64_second_duration century(day * days_in_century);
+ constexpr int64_second_duration four_centuries(day * days_in_four_centuries);
std::time_t const zero(0);
std::tm const epoch(*std::gmtime(&zero));
- ntfs_duration result(day * epoch.tm_yday);
+ std::chrono::system_clock::duration result(day * epoch.tm_yday);
result += std::chrono::hours(epoch.tm_hour);
result += std::chrono::minutes(epoch.tm_min);
result += std::chrono::seconds(epoch.tm_sec);
- int years(1900 - 1601 + epoch.tm_year);
+ int years(1900 - 1970 + epoch.tm_year);
result += four_centuries * (years / 400);
years %= 400;
result += century * (years / 100);
@@ -63,11 +64,9 @@ util::ntfs_duration calculate_ntfs_offset()
years %= 4;
result += year * years;
- return result;
+ return result - std::chrono::system_clock::from_time_t(0).time_since_epoch();
}
-} // anonymous namespace
-
// -------------------------------------------------
@@ -76,7 +75,9 @@ util::ntfs_duration calculate_ntfs_offset()
std::chrono::system_clock::time_point system_clock_time_point_from_ntfs_duration(ntfs_duration d)
{
- return std::chrono::system_clock::from_time_t(0) + std::chrono::duration_cast<std::chrono::system_clock::duration>(d - f_ntfs_offset);
+ typedef arbitrary_clock<std::uint64_t, 1601, 1, 1, 0, 0, 0, std::ratio<1, 10000000 > > ntfs_clock;
+ const std::chrono::time_point<ntfs_clock> tp(d);
+ return ntfs_clock::to_system_clock(tp);
}
} // namespace util