#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
XS(XS_version_new);
XS(XS_version_stringify);
XS(XS_version_numify);
XS(XS_version_normal);
XS(XS_version_vcmp);
XS(XS_version_boolean);
XS(XS_version_is_alpha);
XS(XS_version_qv);
void
Perl_boot_core_version(pTHX)
{
dVAR;
static const char file[] = __FILE__;
/* Make it findable via fetchmethod */
newXS("version::new", XS_version_new, file);
newXS("version::stringify", XS_version_stringify, file);
newXS("version::numify", XS_version_numify, file);
newXS("version::normal", XS_version_normal, file);
newXS("version::vcmp", XS_version_vcmp, file);
newXS("version::boolean", XS_version_boolean, file);
newXS("version::is_alpha", XS_version_is_alpha, file);
newXS("version::qv", XS_version_qv, file);
}
XS(XS_version_new)
{
dVAR;
dXSARGS;
PERL_UNUSED_ARG(cv);
if (items > 3)
Perl_croak(aTHX_ "Usage: version::new(class, version)");
SP -= items;
{
SV *vs = ST(1);
SV *rv;
const char * const classname =
sv_isobject(ST(0)) /* get the class if called as an object method */
? HvNAME(SvSTASH(SvRV(ST(0))))
: (char *)SvPV_nolen(ST(0));
if ( items == 1 || vs == &PL_sv_undef ) { /* no param or explicit undef */
/* create empty object */
vs = sv_newmortal();
sv_setpvn(vs,"",0);
}
else if ( items == 3 ) {
vs = sv_newmortal();
Perl_sv_setpvf(aTHX_ vs,"v%s",SvPV_nolen_const(ST(2)));
}
rv = new_version(vs);
if ( strcmp(classname,"version") != 0 ) /* inherited new() */
sv_bless(rv, gv_stashpv(classname, GV_ADD));
mPUSHs(rv);
PUTBACK;
return;
}
}
XS(XS_version_stringify)
{
dVAR;
dXSARGS;
PERL_UNUSED_ARG(cv);
if (items < 1)
Perl_croak(aTHX_ "Usage: version::stringify(lobj, ...)");
SP -= items;
{
SV * lobj;
if (sv_derived_from(ST(0), "version")) {
lobj = SvRV(ST(0));
}
else
Perl_croak(aTHX_ "lobj is not of type version");
mPUSHs(vstringify(lobj));
PUTBACK;
return;
}
}
XS(XS_version_numify)
{
dVAR;
dXSARGS;
PERL_UNUSED_ARG(cv);
if (items < 1)
Perl_croak(aTHX_ "Usage: version::numify(lobj, ...)");
SP -= items;
{
SV * lobj;
if (sv_derived_from(ST(0), "version")) {
lobj = SvRV(ST(0));
}
else
Perl_croak(aTHX_ "lobj is not of type version");
mPUSHs(vnumify(lobj));
PUTBACK;
return;
}
}
XS(XS_version_normal)
{
dVAR;
dXSARGS;
PERL_UNUSED_ARG(cv);
if (items < 1)
Perl_croak(aTHX_ "Usage: version::normal(lobj, ...)");
SP -= items;
{
SV * lobj;
if (sv_derived_from(ST(0), "version")) {
lobj = SvRV(ST(0));
}
else
Perl_croak(aTHX_ "lobj is not of type version");
mPUSHs(vnormal(lobj));
PUTBACK;
return;
}
}
XS(XS_version_vcmp)
{
dVAR;
dXSARGS;
PERL_UNUSED_ARG(cv);
if (items != 2)
Perl_croak(aTHX_ "Usage: lobj->vcmp(robj)");
SP -= items;
{
SV * lobj;
if (sv_derived_from(ST(0), "version")) {
lobj = SvRV(ST(0));
}
else
Perl_croak(aTHX_ "lobj is not of type version");
{
SV *rs;
SV *rvs;
SV * robj = ST(1);
if ( ! sv_derived_from(robj, "version") )
{
robj = new_version(robj);
}
rvs = SvRV(robj);
rs = newSViv(vcmp(lobj,rvs));
mPUSHs(rs);
}
PUTBACK;
return;
}
}
XS(XS_version_boolean)
{
dVAR;
dXSARGS;
PERL_UNUSED_ARG(cv);
if (items < 1)
Perl_croak(aTHX_ "Usage: version::boolean(lobj, ...)");
SP -= items;
if (sv_derived_from(ST(0), "version")) {
SV * const lobj = SvRV(ST(0));
SV * const rs = newSViv( vcmp(lobj,new_version(newSVpvs("0"))) );
mPUSHs(rs);
PUTBACK;
return;
}
else
Perl_croak(aTHX_ "lobj is not of type version");
}
XS(XS_version_is_alpha)
{
dVAR;
dXSARGS;
PERL_UNUSED_ARG(cv);
if (items != 1)
Perl_croak(aTHX_ "Usage: version::is_alpha(lobj)");
SP -= items;
if (sv_derived_from(ST(0), "version")) {
SV * const lobj = ST(0);
if ( hv_exists((HV*)SvRV(lobj), "alpha", 5 ) )
XSRETURN_YES;
else
XSRETURN_NO;
PUTBACK;
return;
}
else
Perl_croak(aTHX_ "lobj is not of type version");
}
XS(XS_version_qv)
{
dVAR;
dXSARGS;
PERL_UNUSED_ARG(cv);
if (items != 1)
Perl_croak(aTHX_ "Usage: version::qv(ver)");
SP -= items;
{
SV * ver = ST(0);
SV * const rv = sv_newmortal();
sv_setsv(rv,ver); /* make a duplicate */
upg_version(rv, TRUE);
PUSHs(rv);
PUTBACK;
return;
}
}