The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
MODULE = Panda::Date                PACKAGE = Panda::Date
PROTOTYPES: DISABLE


SV*
Date::STORABLE_freeze (bool cloning)
CODE:
    size_t len = date_freeze_len(THIS);
    RETVAL = newSV(len);
    SvPOK_on(RETVAL);
    char* buf = SvPVX(RETVAL);
    date_freeze(THIS, buf);
    SvCUR_set(RETVAL, len);
OUTPUT:
    RETVAL


Date*
STORABLE_attach (const char* CLASS, bool cloning, SV* serialized)
CODE:
    STRLEN len;
    const char* str = SvPV(serialized, len);
    ptime_t epoch; tz* zone;
    date_thaw(&epoch, &zone, str, len);
    RETVAL = new Date(epoch, zone);
OUTPUT:
    RETVAL


MODULE = Panda::Date                PACKAGE = Panda::Date::Rel
PROTOTYPES: DISABLE


const char*
DateRel::STORABLE_freeze (bool cloning)
CODE:
    RETVAL = THIS->toString();
OUTPUT:
    RETVAL


DateRel*
STORABLE_attach (const char* CLASS, bool cloning, SV* serialized)
CODE:
    STRLEN len;
    const char* str = SvPV(serialized, len);
    RETVAL = new DateRel(str, len);
OUTPUT:
    RETVAL


MODULE = Panda::Date                PACKAGE = Panda::Date::Int
PROTOTYPES: DISABLE


SV*
DateInt::STORABLE_freeze (bool cloning)
CODE:
    size_t from_len  = date_freeze_len(THIS->from());
    size_t total_len = from_len + date_freeze_len(THIS->till()) + 1; // +1 for extra \0 between dates
    RETVAL = newSV(total_len); 
    SvPOK_on(RETVAL);
    char* buf = SvPVX(RETVAL);
    date_freeze(THIS->from(), buf);
    date_freeze(THIS->till(), buf + from_len + 1);
    SvCUR_set(RETVAL, total_len);
OUTPUT:
    RETVAL


DateInt*
STORABLE_attach (const char* CLASS, bool cloning, SV* serialized)
CODE:
    STRLEN len;
    const char* str = SvPV(serialized, len);
    const char* strend = str + len;
    ptime_t epoch_from, epoch_till;
    tz *zone_from, *zone_till;
    str = date_thaw(&epoch_from, &zone_from, str, len) + 1;
    if ((str-1) == strend || str == strend) croak("Panda::Date: cannot 'thaw' - corrupted data");
    date_thaw(&epoch_till, &zone_till, str, strend - str);
    RETVAL = new DateInt();
    RETVAL->from()->set(epoch_from, zone_from);
    RETVAL->till()->set(epoch_till, zone_till);
OUTPUT:
    RETVAL