/* * This file was generated automatically by ExtUtils::ParseXS version 2.18 from the * contents of DateTime.xs. Do not edit this file, edit DateTime.xs instead. * * ANY CHANGES MADE HERE WILL BE LOST! * */ #line 1 "DateTime.xs" /* Copyright (c) 2003-2005 Dave Rolsky All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See the LICENSE file that comes with this distribution for more details. */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #include /* This file is generated by tools/leap_seconds_header.pl */ #include "leap_seconds.h" /* This is a temporary hack until a better solution can be found to get the finite() function on Win32 */ #ifndef WIN32 #include #ifndef isfinite #ifdef finite #define finite isfinite #endif /* ifdef finite */ #endif /* ifndef isfinite */ #endif /* ifndef WIN32 */ /* 2 ** 28 - 307 */ #define RANGE_CUTOFF (268435456 - 307) #define DAYS_PER_400_YEARS 146097 #define DAYS_PER_4_YEARS 1461 #define MARCH_1 306 #define SECONDS_PER_DAY 86400 const int PREVIOUS_MONTH_DOY[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; const int PREVIOUS_MONTH_DOLY[12] = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; const IV neg_dow[] = { 1, 7, 6, 5, 4, 3, 2 }; IV _real_is_leap_year(IV y) { /* See http://www.perlmonks.org/?node_id=274247 for where this silliness comes from */ return (y % 4) ? 0 : (y % 100) ? 1 : (y % 400) ? 0 : 1; } #ifndef PERL_UNUSED_VAR # define PERL_UNUSED_VAR(var) if (0) var = var #endif #line 87 "DateTime.c" XS(XS_DateTime__rd2ymd); /* prototype to pass -Wmissing-prototypes */ XS(XS_DateTime__rd2ymd) { #ifdef dVAR dVAR; dXSARGS; #else dXSARGS; #endif if (items < 2 || items > 3) Perl_croak(aTHX_ "Usage: %s(%s)", "DateTime::_rd2ymd", "self, d, extra = 0"); PERL_UNUSED_VAR(cv); /* -W */ PERL_UNUSED_VAR(ax); /* -Wall */ SP -= items; { SV* self = ST(0); IV d = (IV)SvIV(ST(1)); IV extra; #line 84 "DateTime.xs" IV y, m; IV c; IV quarter; IV yadj = 0; IV dow, doy, doq; IV rd_days; #line 114 "DateTime.c" if (items < 3) extra = 0; else { extra = (IV)SvIV(ST(2)); } #line 92 "DateTime.xs" rd_days = d; if (d > RANGE_CUTOFF) { yadj = (d - DAYS_PER_400_YEARS + MARCH_1 ) / DAYS_PER_400_YEARS + 1; d -= (yadj * DAYS_PER_400_YEARS) - MARCH_1; } else { d += MARCH_1; if (d <= 0) { yadj = -1 * (((-1 * d) / DAYS_PER_400_YEARS) + 1); d -= yadj * DAYS_PER_400_YEARS; } } /* c is century */ c = ((d * 4) - 1) / DAYS_PER_400_YEARS; d -= c * DAYS_PER_400_YEARS / 4; y = ((d * 4) - 1) / DAYS_PER_4_YEARS; d -= y * DAYS_PER_4_YEARS / 4; m = ((d * 12) + 1093) / 367; d -= ((m * 367) - 1094) / 12; y += (c * 100) + (yadj * 400); if (m > 12) { ++y; m -= 12; } EXTEND(SP, extra ? 7 : 3); PUSHs(sv_2mortal(newSViv(y))); PUSHs(sv_2mortal(newSViv(m))); PUSHs(sv_2mortal(newSViv(d))); if (extra) { quarter = ( ( 1.0 / 3.1 ) * m ) + 1; dow = ((rd_days + 6) % 7); if (rd_days < -6) { /* if the left side of the modulus was negative we now have a bogus answer. This fixes it, though it ccould probably be done more elegantly if I wasn't such a math gimp. */ dow = neg_dow[ abs(dow) ]; } else { dow++; } PUSHs(sv_2mortal(newSViv(dow))); if (_real_is_leap_year(y)) { doy = PREVIOUS_MONTH_DOLY[m - 1] + d; doq = doy - PREVIOUS_MONTH_DOLY[ (3 * quarter) - 3 ]; } else { doy = PREVIOUS_MONTH_DOY[m - 1] + d; doq = doy - PREVIOUS_MONTH_DOY[ (3 * quarter ) - 3 ]; } PUSHs(sv_2mortal(newSViv(doy))); PUSHs(sv_2mortal(newSViv(quarter))); PUSHs(sv_2mortal(newSViv(doq))); } #line 183 "DateTime.c" PUTBACK; return; } } XS(XS_DateTime__ymd2rd); /* prototype to pass -Wmissing-prototypes */ XS(XS_DateTime__ymd2rd) { #ifdef dVAR dVAR; dXSARGS; #else dXSARGS; #endif if (items != 4) Perl_croak(aTHX_ "Usage: %s(%s)", "DateTime::_ymd2rd", "self, y, m, d"); PERL_UNUSED_VAR(cv); /* -W */ PERL_UNUSED_VAR(ax); /* -Wall */ SP -= items; { SV* self = ST(0); IV y = (IV)SvIV(ST(1)); IV m = (IV)SvIV(ST(2)); IV d = (IV)SvIV(ST(3)); #line 162 "DateTime.xs" IV adj; #line 211 "DateTime.c" #line 165 "DateTime.xs" if (m <= 2) { adj = (14 - m) / 12; y -= adj; m += 12 * adj; } else if (m > 14) { adj = (m - 3) / 12; y += adj; m -= 12 * adj; } if (y < 0) { adj = (399 - y) / 400; d -= DAYS_PER_400_YEARS * adj; y += 400 * adj; } d += (m * 367 - 1094) / 12 + y % 100 * DAYS_PER_4_YEARS / 4 + (y / 100 * 36524 + y / 400) - MARCH_1; EXTEND(SP, 1); PUSHs(sv_2mortal(newSViv(d))); #line 235 "DateTime.c" PUTBACK; return; } } XS(XS_DateTime__seconds_as_components); /* prototype to pass -Wmissing-prototypes */ XS(XS_DateTime__seconds_as_components) { #ifdef dVAR dVAR; dXSARGS; #else dXSARGS; #endif if (items < 2 || items > 4) Perl_croak(aTHX_ "Usage: %s(%s)", "DateTime::_seconds_as_components", "self, secs, utc_secs = 0, secs_modifier = 0"); PERL_UNUSED_VAR(cv); /* -W */ PERL_UNUSED_VAR(ax); /* -Wall */ SP -= items; { SV* self = ST(0); IV secs = (IV)SvIV(ST(1)); IV utc_secs; IV secs_modifier; #line 196 "DateTime.xs" IV h, m, s; #line 263 "DateTime.c" if (items < 3) utc_secs = 0; else { utc_secs = (IV)SvIV(ST(2)); } if (items < 4) secs_modifier = 0; else { secs_modifier = (IV)SvIV(ST(3)); } #line 199 "DateTime.xs" secs -= secs_modifier; h = secs / 3600; secs -= h * 3600; m = secs / 60; s = secs - (m * 60); if (utc_secs >= SECONDS_PER_DAY) { if (utc_secs >= SECONDS_PER_DAY + 1) croak("Invalid UTC RD seconds value: %d", utc_secs); s += (utc_secs - SECONDS_PER_DAY) + 60; m = 59; h--; if (h < 0) h = 23; } EXTEND(SP, 3); PUSHs(sv_2mortal(newSViv(h))); PUSHs(sv_2mortal(newSViv(m))); PUSHs(sv_2mortal(newSViv(s))); #line 303 "DateTime.c" PUTBACK; return; } } #ifdef isfinite #define XSubPPtmpAAAA 1 XS(XS_DateTime__normalize_tai_seconds); /* prototype to pass -Wmissing-prototypes */ XS(XS_DateTime__normalize_tai_seconds) { #ifdef dVAR dVAR; dXSARGS; #else dXSARGS; #endif if (items != 3) Perl_croak(aTHX_ "Usage: %s(%s)", "DateTime::_normalize_tai_seconds", "self, days, secs"); PERL_UNUSED_VAR(cv); /* -W */ PERL_UNUSED_VAR(ax); /* -Wall */ SP -= items; { SV* self = ST(0); SV* days = ST(1); SV* secs = ST(2); #line 234 "DateTime.xs" if (isfinite(SvNV(days)) && 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; } else { adj = s / SECONDS_PER_DAY; } d += adj; s -= adj * SECONDS_PER_DAY; sv_setiv(days, (IV) d); sv_setiv(secs, (IV) s); } #line 348 "DateTime.c" PUTBACK; return; } } XS(XS_DateTime__normalize_leap_seconds); /* prototype to pass -Wmissing-prototypes */ XS(XS_DateTime__normalize_leap_seconds) { #ifdef dVAR dVAR; dXSARGS; #else dXSARGS; #endif if (items != 3) Perl_croak(aTHX_ "Usage: %s(%s)", "DateTime::_normalize_leap_seconds", "self, days, secs"); PERL_UNUSED_VAR(cv); /* -W */ PERL_UNUSED_VAR(ax); /* -Wall */ SP -= items; { SV* self = ST(0); SV* days = ST(1); SV* secs = ST(2); #line 259 "DateTime.xs" if (isfinite(SvNV(days)) && isfinite(SvNV(secs))) { IV d = SvIV(days); IV s = SvIV(secs); IV day_length; while (s < 0) { SET_DAY_LENGTH(d - 1, day_length); s += day_length; d--; } SET_DAY_LENGTH(d, day_length); while (s > day_length - 1) { s -= day_length; d++; SET_DAY_LENGTH(d, day_length); } sv_setiv(days, (IV) d); sv_setiv(secs, (IV) s); } #line 396 "DateTime.c" PUTBACK; return; } } #endif /* finite */ XS(XS_DateTime__time_as_seconds); /* prototype to pass -Wmissing-prototypes */ XS(XS_DateTime__time_as_seconds) { #ifdef dVAR dVAR; dXSARGS; #else dXSARGS; #endif if (items != 4) Perl_croak(aTHX_ "Usage: %s(%s)", "DateTime::_time_as_seconds", "self, h, m, s"); PERL_UNUSED_VAR(cv); /* -W */ PERL_UNUSED_VAR(ax); /* -Wall */ SP -= items; { SV* self = ST(0); IV h = (IV)SvIV(ST(1)); IV m = (IV)SvIV(ST(2)); IV s = (IV)SvIV(ST(3)); #line 293 "DateTime.xs" EXTEND(SP, 1); PUSHs(sv_2mortal(newSViv(h * 3600 + m * 60 + s))); #line 425 "DateTime.c" PUTBACK; return; } } XS(XS_DateTime__is_leap_year); /* prototype to pass -Wmissing-prototypes */ XS(XS_DateTime__is_leap_year) { #ifdef dVAR dVAR; dXSARGS; #else dXSARGS; #endif if (items != 2) Perl_croak(aTHX_ "Usage: %s(%s)", "DateTime::_is_leap_year", "self, y"); PERL_UNUSED_VAR(cv); /* -W */ PERL_UNUSED_VAR(ax); /* -Wall */ SP -= items; { SV* self = ST(0); IV y = (IV)SvIV(ST(1)); #line 302 "DateTime.xs" EXTEND(SP, 1); PUSHs(sv_2mortal(newSViv(_real_is_leap_year(y)))); #line 451 "DateTime.c" PUTBACK; return; } } XS(XS_DateTime__day_length); /* prototype to pass -Wmissing-prototypes */ XS(XS_DateTime__day_length) { #ifdef dVAR dVAR; dXSARGS; #else dXSARGS; #endif if (items != 2) Perl_croak(aTHX_ "Usage: %s(%s)", "DateTime::_day_length", "self, utc_rd"); PERL_UNUSED_VAR(cv); /* -W */ PERL_UNUSED_VAR(ax); /* -Wall */ SP -= items; { SV* self = ST(0); IV utc_rd = (IV)SvIV(ST(1)); #line 311 "DateTime.xs" IV day_length; SET_DAY_LENGTH(utc_rd, day_length); EXTEND(SP, 1); PUSHs(sv_2mortal(newSViv(day_length))); #line 480 "DateTime.c" PUTBACK; return; } } XS(XS_DateTime__day_has_leap_second); /* prototype to pass -Wmissing-prototypes */ XS(XS_DateTime__day_has_leap_second) { #ifdef dVAR dVAR; dXSARGS; #else dXSARGS; #endif if (items != 2) Perl_croak(aTHX_ "Usage: %s(%s)", "DateTime::_day_has_leap_second", "self, utc_rd"); PERL_UNUSED_VAR(cv); /* -W */ PERL_UNUSED_VAR(ax); /* -Wall */ SP -= items; { SV* self = ST(0); IV utc_rd = (IV)SvIV(ST(1)); #line 323 "DateTime.xs" IV day_length; SET_DAY_LENGTH(utc_rd, day_length); EXTEND(SP, 1); PUSHs(sv_2mortal(newSViv(day_length > 86400 ? 1 : 0))); #line 509 "DateTime.c" PUTBACK; return; } } XS(XS_DateTime__accumulated_leap_seconds); /* prototype to pass -Wmissing-prototypes */ XS(XS_DateTime__accumulated_leap_seconds) { #ifdef dVAR dVAR; dXSARGS; #else dXSARGS; #endif if (items != 2) Perl_croak(aTHX_ "Usage: %s(%s)", "DateTime::_accumulated_leap_seconds", "self, utc_rd"); PERL_UNUSED_VAR(cv); /* -W */ PERL_UNUSED_VAR(ax); /* -Wall */ SP -= items; { SV* self = ST(0); IV utc_rd = (IV)SvIV(ST(1)); #line 335 "DateTime.xs" IV leap_seconds; SET_LEAP_SECONDS(utc_rd, leap_seconds); EXTEND(SP, 1); PUSHs(sv_2mortal(newSViv(leap_seconds))); #line 538 "DateTime.c" PUTBACK; return; } } #ifdef __cplusplus extern "C" #endif XS(boot_DateTime); /* prototype to pass -Wmissing-prototypes */ XS(boot_DateTime) { #ifdef dVAR dVAR; dXSARGS; #else dXSARGS; #endif char* file = __FILE__; PERL_UNUSED_VAR(cv); /* -W */ PERL_UNUSED_VAR(items); /* -W */ XS_VERSION_BOOTCHECK ; newXSproto("DateTime::_rd2ymd", XS_DateTime__rd2ymd, file, "$$;$"); newXSproto("DateTime::_ymd2rd", XS_DateTime__ymd2rd, file, "$$$$"); newXSproto("DateTime::_seconds_as_components", XS_DateTime__seconds_as_components, file, "$$;$$"); #if XSubPPtmpAAAA newXSproto("DateTime::_normalize_tai_seconds", XS_DateTime__normalize_tai_seconds, file, "$$$"); newXSproto("DateTime::_normalize_leap_seconds", XS_DateTime__normalize_leap_seconds, file, "$$$"); #endif newXSproto("DateTime::_time_as_seconds", XS_DateTime__time_as_seconds, file, "$$$$"); newXSproto("DateTime::_is_leap_year", XS_DateTime__is_leap_year, file, "$$"); newXSproto("DateTime::_day_length", XS_DateTime__day_length, file, "$$"); newXSproto("DateTime::_day_has_leap_second", XS_DateTime__day_has_leap_second, file, "$$"); newXSproto("DateTime::_accumulated_leap_seconds", XS_DateTime__accumulated_leap_seconds, file, "$$"); /* Initialisation Section */ #if XSubPPtmpAAAA #endif #line 578 "DateTime.c" /* End of Initialisation Section */ XSRETURN_YES; }