mirror of
https://github.com/WerWolv/ImHex-Patterns.git
synced 2026-03-27 23:37:04 -05:00
201 lines
3.9 KiB
Rust
201 lines
3.9 KiB
Rust
#pragma once
|
|
|
|
#include <std/io.pat>
|
|
|
|
/*!
|
|
Library to handle time and date related operations.
|
|
*/
|
|
|
|
namespace std::time {
|
|
|
|
/**
|
|
A structured representation of a time and date.
|
|
*/
|
|
struct Time {
|
|
u8 sec;
|
|
u8 min;
|
|
u8 hour;
|
|
u8 mday;
|
|
u8 mon;
|
|
u16 year;
|
|
u8 wday;
|
|
u16 yday;
|
|
bool isdst;
|
|
} [[sealed]];
|
|
|
|
/**
|
|
A helper type to convert between Time and u128.
|
|
*/
|
|
union TimeConverter {
|
|
Time time;
|
|
u128 value;
|
|
};
|
|
|
|
/**
|
|
A type to represent a time in seconds since the epoch.
|
|
*/
|
|
using EpochTime = u32;
|
|
|
|
/**
|
|
A type to represent a time zone.
|
|
*/
|
|
enum TimeZone : u8 {
|
|
Local,
|
|
UTC
|
|
};
|
|
|
|
/**
|
|
A type to represent a DOS date.
|
|
*/
|
|
bitfield DOSDate {
|
|
day: 5;
|
|
month: 4;
|
|
year: 7;
|
|
} [[sealed]];
|
|
|
|
/**
|
|
A type to represent a DOS time.
|
|
*/
|
|
bitfield DOSTime {
|
|
seconds: 5;
|
|
minutes: 6;
|
|
hours: 5;
|
|
} [[sealed]];
|
|
|
|
namespace impl {
|
|
|
|
union DOSDateConverter {
|
|
DOSDate date;
|
|
u16 value;
|
|
};
|
|
|
|
union DOSTimeConverter {
|
|
DOSTime time;
|
|
u16 value;
|
|
};
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
Returns the current time in seconds since the epoch.
|
|
@return The current time in seconds since the epoch.
|
|
*/
|
|
fn epoch() {
|
|
return builtin::std::time::epoch();
|
|
};
|
|
|
|
/**
|
|
Converts a time in seconds since the epoch to a local time.
|
|
@param epoch_time The time in seconds since the epoch.
|
|
@return The local time.
|
|
*/
|
|
fn to_local(EpochTime epoch_time) {
|
|
le TimeConverter converter;
|
|
|
|
converter.value = builtin::std::time::to_local(epoch_time);
|
|
|
|
return converter.time;
|
|
};
|
|
|
|
/**
|
|
Converts a time in seconds since the epoch to a UTC time.
|
|
@param epoch_time The time in seconds since the epoch.
|
|
@return The UTC time.
|
|
*/
|
|
fn to_utc(EpochTime epoch_time) {
|
|
le TimeConverter converter;
|
|
|
|
converter.value = builtin::std::time::to_utc(epoch_time);
|
|
|
|
return converter.time;
|
|
};
|
|
|
|
/**
|
|
Queries the current time in the specified time zone.
|
|
@param time_zone The time zone to query.
|
|
@return The current time in the specified time zone.
|
|
*/
|
|
fn now(TimeZone time_zone = TimeZone::Local) {
|
|
le TimeConverter converter;
|
|
|
|
if (time_zone == TimeZone::Local)
|
|
converter.value = builtin::std::time::to_local(std::time::epoch());
|
|
else if (time_zone == TimeZone::UTC)
|
|
converter.value = builtin::std::time::to_utc(std::time::epoch());
|
|
else
|
|
converter.value = 0x00;
|
|
|
|
return converter.time;
|
|
};
|
|
|
|
/**
|
|
Converts a value to a DOS date.
|
|
@param value The value to convert.
|
|
@return The DOS date.
|
|
*/
|
|
fn to_dos_date(u16 value) {
|
|
le impl::DOSDateConverter converter;
|
|
|
|
converter.value = value;
|
|
|
|
return converter.date;
|
|
};
|
|
|
|
/**
|
|
Converts a value to a DOS time.
|
|
@param value The value to convert.
|
|
@return The DOS time.
|
|
*/
|
|
fn to_dos_time(u16 value) {
|
|
le impl::DOSTimeConverter converter;
|
|
|
|
converter.value = value;
|
|
|
|
return converter.time;
|
|
};
|
|
|
|
/**
|
|
Converts a FILETIME to unix time.
|
|
@param value The value to convert.
|
|
@return Timestamp formatted as unix time.
|
|
*/
|
|
fn filetime_to_unix(u64 value) {
|
|
return value / 10000000 - 11644473600;
|
|
};
|
|
|
|
/**
|
|
Formats a time according to the specified format string.
|
|
@param time The time to format.
|
|
@param format_string The format string to use.
|
|
@return The formatted time.
|
|
*/
|
|
fn format(Time time, str format_string = "%c") {
|
|
le TimeConverter converter;
|
|
converter.time = time;
|
|
|
|
return builtin::std::time::format(format_string, converter.value);
|
|
};
|
|
|
|
/**
|
|
Formats a DOS date according to the specified format string.
|
|
@param date The DOS date to format.
|
|
@param format_string The format string to use.
|
|
@return The formatted DOS date.
|
|
*/
|
|
fn format_dos_date(DOSDate date, str format_string = "{}/{}/{}") {
|
|
return std::format(format_string, date.day, date.month, date.year + 1980);
|
|
};
|
|
|
|
/**
|
|
Formats a DOS time according to the specified format string.
|
|
@param time The DOS time to format.
|
|
@param format_string The format string to use.
|
|
@return The formatted DOS time.
|
|
*/
|
|
fn format_dos_time(DOSTime time, str format_string = "{:02}:{:02}:{:02}") {
|
|
return std::format(format_string, time.hours, time.minutes, time.seconds * 2);
|
|
};
|
|
|
|
}
|