#include #ifdef __HAIKU__ #include #include #include #include #include extern "C" { size_t iana_time_zone_haiku_get_tz(char *buf, size_t buf_size) { try { static_assert(sizeof(char) == sizeof(uint8_t), "Illegal char size"); if (buf_size == 0) { return 0; } // `BLocaleRoster::Default()` returns a reference to a statically allocated object. // https://github.com/haiku/haiku/blob/8f16317/src/kits/locale/LocaleRoster.cpp#L143-L147 BLocaleRoster *locale_roster(BLocaleRoster::Default()); if (!locale_roster) { return 0; } BTimeZone tz(NULL, NULL); if (locale_roster->GetDefaultTimeZone(&tz) != B_OK) { return 0; } BString bname(tz.ID()); int32_t ilength(bname.Length()); if (ilength <= 0) { return 0; } size_t length(ilength); if (length > buf_size) { return 0; } // BString::String() returns a borrowed string. // https://www.haiku-os.org/docs/api/classBString.html#ae4fe78b06c8e3310093b80305e14ba87 const char *sname(bname.String()); if (!sname) { return 0; } std::memcpy(buf, sname, length); return length; } catch (...) { return 0; } } } // extern "C" #else extern "C" { size_t iana_time_zone_haiku_get_tz(char *buf, size_t buf_size) { return 0; } } // extern "C" #endif