TYPEMAP
context_p T_CONTEXT
CV * T_CODEREF
char * T_CHARSTAR
int T_INT
INPUT
T_CONTEXT
if (sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG))
{
MAGIC *mg = mg_find(SvRV($arg), '~');
if (mg == NULL)
{
warn(\"${Package}::$func_name() -- $var not magical\");
XSRETURN_UNDEF;
}
$var = ($type)SvIV(mg->mg_obj);
CLASS = HvNAME(SvSTASH(SvRV( $arg )));
}
else
{
warn(\"${Package}::$func_name() -- $var is not blessed\");
XSRETURN_UNDEF;
}
T_CODEREF
if ($arg == &PL_sv_undef)
{
ST(0) = sv_2mortal(newSViv(0));
XSRETURN(1);
}
if (SvTYPE(SvRV($arg)) == SVt_PVCV)
$var = (CV*)SvRV($arg);
else
croak(\"$var is not a code reference\")
T_CHARSTAR
if ($arg == &PL_sv_undef)
{
ST(0) = sv_2mortal(newSViv(0));
XSRETURN(1);
}
$var = (char *)SvPV($arg, PL_na);
T_INT
if ($arg == &PL_sv_undef)
{
ST(0) = sv_2mortal(newSViv(0));
XSRETURN(1);
}
$var = (int)SvIV($arg);
OUTPUT
T_CONTEXT
if ($var == NULL)
{
XSRETURN_UNDEF;
}
else
{
SV *tc = sv_newmortal();
sv_magic(tc, sv_2mortal(newSViv((IV)$var)), '~', NULL, 0);
$arg = sv_bless(sv_2mortal(newRV(tc)), gv_stashpv((CLASS == NULL)
? TEMPLATE_PACKAGE
: CLASS, 0));
}
T_CODEREF
$arg = newRV((SV*)$var);
T_CHARSTAR
sv_setpv((SV *)$arg, $var);
T_INT
sv_setiv($arg, (IV)$var);