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 )