#pragma once #include #include #include #include namespace Tzif { typedef struct { char magic[4]; u_int8_t version; u_int8_t reserved[15]; u_int32_t isutcnt; u_int32_t isstdcnt; u_int32_t leapcnt; u_int32_t timecnt; u_int32_t typecnt; u_int32_t charcnt; } Header; static_assert(sizeof(Header) == 0x2c); class Footer { public: explicit Footer() = default; ~Footer() = default; const char nl_a{'\n'}; std::unique_ptr tz_string; const char nl_b{'\n'}; std::size_t footer_string_length; }; #pragma pack(push, 1) typedef struct { u_int32_t utoff; u_int8_t dst; u_int8_t idx; } TimeTypeRecord; #pragma pack(pop) static_assert(sizeof(TimeTypeRecord) == 0x6); class Data { public: explicit Data() = default; virtual ~Data() = default; virtual void ReformatNintendo(std::vector &buffer) const = 0; }; class DataImpl : public Data { public: explicit DataImpl() = default; ~DataImpl() override = default; void ReformatNintendo(std::vector &buffer) const override; Header header; Footer footer; std::unique_ptr transition_times; std::unique_ptr transition_types; std::unique_ptr local_time_type_records; std::unique_ptr time_zone_designations; std::unique_ptr standard_indicators; std::unique_ptr ut_indicators; }; std::unique_ptr ReadData(const u_int8_t *data, std::size_t size); } // namespace Tzif