DateTime-Lite

 view release on metacpan or  search on metacpan

DateTime-Lite.xs  view on Meta::CPAN

    IV extra;

    PREINIT:
        IV y, m;
        IV c;
        IV quarter;
        IV yadj = 0;
        IV dow, doy, doq;
        IV rd_days;

    PPCODE:
        rd_days = d;

        d += MARCH_1;

        if( d <= 0 )
        {
            yadj = -1 * (((-1 * d) / DAYS_PER_400_YEARS) + 1);
            d -= yadj * DAYS_PER_400_YEARS;
        }

DateTime-Lite.xs  view on Meta::CPAN


void
_ymd2rd(self, y, m, d)
    IV y;
    IV m;
    IV d;

    PREINIT:
        IV adj;

    PPCODE:
        if( m <= 2 )
        {
            adj = (14 - m) / 12;
            y -= adj;
            m += 12 * adj;
        }
        else if( m > 14 )
        {
            adj = (m - 3) / 12;
            y += adj;

DateTime-Lite.xs  view on Meta::CPAN

# Time component decomposition
void
_seconds_as_components(self, secs, utc_secs = 0, secs_modifier = 0)
    IV secs;
    IV utc_secs;
    IV secs_modifier;

    PREINIT:
        IV h, m, s;

    PPCODE:
        secs -= secs_modifier;

        h = secs / 3600;
        secs -= h * 3600;

        m = secs / 60;

        s = secs - (m * 60);

        if( utc_secs >= SECONDS_PER_DAY )

DateTime-Lite.xs  view on Meta::CPAN

        mPUSHi(h);
        mPUSHi(m);
        mPUSHi(s);

void
_time_as_seconds(self, h, m, s)
    IV h;
    IV m;
    IV s;

    PPCODE:
        EXTEND(SP, 1);
        mPUSHi(h * 3600 + m * 60 + s);

# Leap year / leap second helpers
void
_is_leap_year(self, y)
    IV y;

    PPCODE:
        EXTEND(SP, 1);
        mPUSHi(_real_is_leap_year(y));

void
_day_length(self, utc_rd)
    IV utc_rd;

    PPCODE:
        IV day_length;
        SET_DAY_LENGTH(utc_rd, day_length);

        EXTEND(SP, 1);
        mPUSHi(day_length);

void
_day_has_leap_second(self, utc_rd)
    IV utc_rd;

    PPCODE:
        IV day_length;
        SET_DAY_LENGTH(utc_rd, day_length);

        EXTEND(SP, 1);
        mPUSHi(day_length > SECONDS_PER_DAY ? 1 : 0);

void
_accumulated_leap_seconds(self, utc_rd)
    IV utc_rd;

    PPCODE:
        IV leap_seconds;
        SET_LEAP_SECONDS(utc_rd, leap_seconds);

        EXTEND(SP, 1);
        mPUSHi(leap_seconds);

#ifdef dtl_isfinite

# Normalisation (TAI / leap-second-aware)
void
_normalize_tai_seconds(self, days, secs)
    SV* days;
    SV* secs;

    PPCODE:
        if( dtl_isfinite(SvNV(days)) && dtl_isfinite(SvNV(secs)) )
        {
            IV d = SvIV(days);
            IV s = SvIV(secs);
            IV adj;

            if( s < 0 )
            {
                adj = (s - (SECONDS_PER_DAY - 1)) / SECONDS_PER_DAY;
            }

DateTime-Lite.xs  view on Meta::CPAN


            sv_setiv(days, (IV) d);
            sv_setiv(secs, (IV) s);
        }

void
_normalize_leap_seconds(self, days, secs)
    SV* days;
    SV* secs;

    PPCODE:
        if( dtl_isfinite(SvNV(days)) && dtl_isfinite(SvNV(secs)) )
        {
            IV d = SvIV(days);
            IV s = SvIV(secs);
            IV day_length;

            while( s < 0 )
            {
                SET_DAY_LENGTH(d - 1, day_length);

DateTime-Lite.xs  view on Meta::CPAN


# Compute utc_rd_days and utc_rd_secs from a Unix epoch integer.
# Returns a 2-element list: (rd_days, rd_secs).
void
_epoch_to_rd(self, epoch)
    IV epoch;

    PREINIT:
        IV d, s;

    PPCODE:
        d = epoch / SECONDS_PER_DAY;
        s = epoch - d * SECONDS_PER_DAY;

        if( s < 0 )
        {
            d--;
            s += SECONDS_PER_DAY;
        }

        d += UNIX_EPOCH_RD_DAYS;

DateTime-Lite.xs  view on Meta::CPAN

        mPUSHi(s);

# In-place nanosecond normalisation.
# Modifies the two SV* scalars passed in (seconds, nanoseconds), carrying over-/underflow
# between them.
void
_normalize_nanoseconds(self, secs, nanosecs)
    SV* secs;
    SV* nanosecs;

    PPCODE:
        {
            IV s  = SvIV(secs);
            IV ns = SvIV(nanosecs);
            IV overflow;

            if( ns < 0 )
            {
                overflow = 1 + (-ns - 1) / MAX_NANOSECONDS;
                ns += overflow * MAX_NANOSECONDS;
                s  -= overflow;



( run in 0.554 second using v1.01-cache-2.11-cpan-71847e10f99 )