summaryrefslogtreecommitdiff
path: root/AK
diff options
context:
space:
mode:
authorOllrogge <nils-ollrogge@outlook.de>2023-02-06 20:15:30 +0100
committerAndrew Kaster <andrewdkaster@gmail.com>2023-02-12 13:13:15 -0700
commit361df6eff8a650bcfbaf14bfe21ee5305c20e32c (patch)
tree3d338a1a592b3d9aaa0b4c4f65626f110fb96cc9 /AK
parent7e915b145b5eb29520be27b84229aa4998274dc3 (diff)
downloadserenity-361df6eff8a650bcfbaf14bfe21ee5305c20e32c.zip
AK: Add conversion functions for packed DOS time format
This also adjusts the FATFS code to use the new functions and removes the now redundant old conversion functions.
Diffstat (limited to 'AK')
-rw-r--r--AK/CMakeLists.txt1
-rw-r--r--AK/DOSPackedTime.cpp39
-rw-r--r--AK/DOSPackedTime.h48
3 files changed, 88 insertions, 0 deletions
diff --git a/AK/CMakeLists.txt b/AK/CMakeLists.txt
index 8ce72a78c9..1188c0f916 100644
--- a/AK/CMakeLists.txt
+++ b/AK/CMakeLists.txt
@@ -4,6 +4,7 @@ set(AK_SOURCES
CircularBuffer.cpp
DeprecatedFlyString.cpp
DeprecatedString.cpp
+ DOSPackedTime.cpp
Error.cpp
FloatingPointStringConversions.cpp
FlyString.cpp
diff --git a/AK/DOSPackedTime.cpp b/AK/DOSPackedTime.cpp
new file mode 100644
index 0000000000..28d869f444
--- /dev/null
+++ b/AK/DOSPackedTime.cpp
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2022, Undefine <undefine@undefine.pl>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <AK/DOSPackedTime.h>
+
+namespace AK {
+
+Time time_from_packed_dos(DOSPackedDate date, DOSPackedTime time)
+{
+ if (date.value == 0)
+ return Time();
+
+ return Time::from_timestamp(first_dos_year + date.year, date.month, date.day, time.hour, time.minute, time.second * 2, 0);
+}
+
+DOSPackedDate to_packed_dos_date(unsigned year, unsigned month, unsigned day)
+{
+ DOSPackedDate date;
+ date.year = year - first_dos_year;
+ date.month = month;
+ date.day = day;
+
+ return date;
+}
+
+DOSPackedTime to_packed_dos_time(unsigned hour, unsigned minute, unsigned second)
+{
+ DOSPackedTime time;
+ time.hour = hour;
+ time.minute = minute;
+ time.second = second / 2;
+
+ return time;
+}
+
+}
diff --git a/AK/DOSPackedTime.h b/AK/DOSPackedTime.h
new file mode 100644
index 0000000000..3dd46aa10e
--- /dev/null
+++ b/AK/DOSPackedTime.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2022, Undefine <undefine@undefine.pl>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/Time.h>
+#include <AK/Types.h>
+
+namespace AK {
+
+union DOSPackedTime {
+ u16 value;
+ struct {
+ u16 second : 5;
+ u16 minute : 6;
+ u16 hour : 5;
+ };
+};
+static_assert(sizeof(DOSPackedTime) == 2);
+
+union DOSPackedDate {
+ u16 value;
+ struct {
+ u16 day : 5;
+ u16 month : 4;
+ u16 year : 7;
+ };
+};
+static_assert(sizeof(DOSPackedDate) == 2);
+
+inline constexpr u16 first_dos_year = 1980;
+
+Time time_from_packed_dos(DOSPackedDate, DOSPackedTime);
+DOSPackedDate to_packed_dos_date(unsigned year, unsigned month, unsigned day);
+DOSPackedTime to_packed_dos_time(unsigned hour, unsigned minute, unsigned second);
+
+}
+
+#if USING_AK_GLOBALLY
+using AK::DOSPackedDate;
+using AK::DOSPackedTime;
+using AK::time_from_packed_dos;
+using AK::to_packed_dos_date;
+using AK::to_packed_dos_time;
+#endif