MODE: INLINE static inline Hash export_transition (const Timezone::Transition& trans, bool is_past) { auto hash = Hash::create(); hash.store("offset", Simple(trans.offset)); hash.store("abbrev", Simple(trans.abbrev)); if (!is_past) { hash.store("start", Simple(trans.start)); hash.store("isdst", Simple(trans.isdst)); hash.store("gmt_offset", Simple(trans.gmt_offset)); hash.store("leap_corr", Simple(trans.leap_corr)); hash.store("leap_delta", Simple(trans.leap_delta)); } return hash; } MODULE = Date PACKAGE = Date::Timezone PROTOTYPES: DISABLE string Timezone::name () : const { RETVAL = THIS->name; } bool Timezone::is_local () : const { RETVAL = THIS->is_local; } Hash Timezone::export () : const { RETVAL = Hash::create(); RETVAL.store("name", Simple(string_view(THIS->name.data(), THIS->name.length()))); RETVAL.store("is_local", Simple(THIS->is_local ? 1 : 0)); auto future = Hash::create(); future.store("hasdst", Simple(THIS->future.hasdst ? 1 : 0)); auto outer = Hash::create(); outer.store("abbrev", Simple(string_view(THIS->future.outer.abbrev, strlen(THIS->future.outer.abbrev)))); outer.store("offset", Simple(THIS->future.outer.offset)); outer.store("gmt_offset", Simple(THIS->future.outer.gmt_offset)); outer.store("isdst", Simple(THIS->future.outer.isdst)); future.store("outer", Ref::create(outer)); if (THIS->future.hasdst) { auto outer_end = Hash::create(); outer_end.store("mon", Simple(THIS->future.outer.end.mon)); outer_end.store("week", Simple(THIS->future.outer.end.yday)); outer_end.store("day", Simple(THIS->future.outer.end.wday)); outer_end.store("hour", Simple(THIS->future.outer.end.hour)); outer_end.store("min", Simple(THIS->future.outer.end.min)); outer_end.store("sec", Simple(THIS->future.outer.end.sec)); outer.store("end", Ref::create(outer_end)); auto inner = Hash::create(); inner.store("abbrev", Simple(string_view(THIS->future.inner.abbrev, strlen(THIS->future.inner.abbrev)))); inner.store("offset", Simple(THIS->future.inner.offset)); inner.store("gmt_offset", Simple(THIS->future.inner.gmt_offset)); inner.store("isdst", Simple(THIS->future.inner.isdst)); auto inner_end = Hash::create(); inner_end.store("mon", Simple(THIS->future.inner.end.mon)); inner_end.store("week", Simple(THIS->future.inner.end.yday)); inner_end.store("day", Simple(THIS->future.inner.end.wday)); inner_end.store("hour", Simple(THIS->future.inner.end.hour)); inner_end.store("min", Simple(THIS->future.inner.end.min)); inner_end.store("sec", Simple(THIS->future.inner.end.sec)); inner.store("end", Ref::create(inner_end)); future.store("inner", Ref::create(inner)); } RETVAL.store("future", Ref::create(future)); auto trans = Array::create(); for (uint32_t i = 0; i < THIS->trans_cnt; ++i) trans.push(Ref::create(export_transition(THIS->trans[i], false))); RETVAL.store("transitions", Ref::create(trans)); RETVAL.store("past", Ref::create(export_transition(THIS->trans[0], true))); }