Blame typemap

Packit 09c318
# $Header$ 
Packit 09c318
# basic C types
Packit 09c318
int			T_IV
Packit 09c318
unsigned		T_UV
Packit 09c318
unsigned int		T_UV
Packit 09c318
long			T_IV
Packit 09c318
unsigned long		T_UV
Packit 09c318
short			T_IV
Packit 09c318
unsigned short		T_UV
Packit 09c318
char			T_CHAR
Packit 09c318
unsigned char		T_U_CHAR
Packit 09c318
char *			T_PV
Packit 09c318
unsigned char *		T_PV
Packit 09c318
caddr_t			T_PV
Packit 09c318
wchar_t *		T_PV
Packit 09c318
wchar_t			T_IV
Packit 09c318
bool_t			T_IV
Packit 09c318
size_t			T_IV
Packit 09c318
ssize_t			T_IV
Packit 09c318
time_t			T_NV
Packit 09c318
unsigned long *		T_OPAQUEPTR
Packit 09c318
char **			T_PACKED
Packit 09c318
void *			T_PTR
Packit 09c318
Time_t *		T_PV
Packit 09c318
SV *			T_SV
Packit 09c318
SVREF			T_SVREF
Packit 09c318
AV *			T_AVREF
Packit 09c318
HV *			T_HVREF
Packit 09c318
CV *			T_CVREF
Packit 09c318
Packit 09c318
IV			T_IV
Packit 09c318
I32			T_IV
Packit 09c318
I16			T_IV
Packit 09c318
I8			T_IV
Packit 09c318
U32			T_U_LONG
Packit 09c318
U16			T_U_SHORT
Packit 09c318
U8			T_UV
Packit 09c318
Result			T_U_CHAR
Packit 09c318
Boolean			T_IV
Packit 09c318
double			T_DOUBLE
Packit 09c318
SysRet			T_SYSRET
Packit 09c318
SysRetLong		T_SYSRET
Packit 09c318
FILE *			T_IN
Packit 09c318
FileHandle		T_PTROBJ
Packit 09c318
InputStream		T_IN
Packit 09c318
InOutStream		T_INOUT
Packit 09c318
OutputStream		T_OUT
Packit 09c318
bool			T_BOOL
Packit 09c318
Packit 09c318
#############################################################################
Packit 09c318
INPUT
Packit 09c318
T_SV
Packit 09c318
	$var = $arg
Packit 09c318
T_SVREF
Packit 09c318
	if (sv_isa($arg, \"${ntype}\"))
Packit 09c318
	    $var = (SV*)SvRV($arg);
Packit 09c318
	else
Packit 09c318
	    croak(\"$var is not of type ${ntype}\")
Packit 09c318
T_AVREF
Packit 09c318
	if (sv_isa($arg, \"${ntype}\"))
Packit 09c318
	    $var = (AV*)SvRV($arg);
Packit 09c318
	else
Packit 09c318
	    croak(\"$var is not of type ${ntype}\")
Packit 09c318
T_HVREF
Packit 09c318
	if (sv_isa($arg, \"${ntype}\"))
Packit 09c318
	    $var = (HV*)SvRV($arg);
Packit 09c318
	else
Packit 09c318
	    croak(\"$var is not of type ${ntype}\")
Packit 09c318
T_CVREF
Packit 09c318
	if (sv_isa($arg, \"${ntype}\"))
Packit 09c318
	    $var = (CV*)SvRV($arg);
Packit 09c318
	else
Packit 09c318
	    croak(\"$var is not of type ${ntype}\")
Packit 09c318
T_SYSRET
Packit 09c318
	$var NOT IMPLEMENTED
Packit 09c318
T_UV
Packit 09c318
	$var = ($type)SvUV($arg)
Packit 09c318
T_IV
Packit 09c318
	$var = ($type)SvIV($arg)
Packit 09c318
T_INT
Packit 09c318
	$var = (int)SvIV($arg)
Packit 09c318
T_ENUM
Packit 09c318
	$var = ($type)SvIV($arg)
Packit 09c318
T_BOOL
Packit 09c318
	$var = (int)SvIV($arg)
Packit 09c318
T_U_INT
Packit 09c318
	$var = (unsigned int)SvUV($arg)
Packit 09c318
T_SHORT
Packit 09c318
	$var = (short)SvIV($arg)
Packit 09c318
T_U_SHORT
Packit 09c318
	$var = (unsigned short)SvUV($arg)
Packit 09c318
T_LONG
Packit 09c318
	$var = (long)SvIV($arg)
Packit 09c318
T_U_LONG
Packit 09c318
	$var = (unsigned long)SvUV($arg)
Packit 09c318
T_CHAR
Packit 09c318
	$var = (char)*SvPV($arg,PL_na)
Packit 09c318
T_U_CHAR
Packit 09c318
	$var = (unsigned char)SvUV($arg)
Packit 09c318
T_FLOAT
Packit 09c318
	$var = (float)SvNV($arg)
Packit 09c318
T_NV
Packit 09c318
	$var = ($type)SvNV($arg)
Packit 09c318
T_DOUBLE
Packit 09c318
	$var = (double)SvNV($arg)
Packit 09c318
T_PV
Packit 09c318
	$var = ($type)SvPV($arg,PL_na)
Packit 09c318
T_PTR
Packit 09c318
	$var = ($type)SvIV($arg)
Packit 09c318
T_PTRREF
Packit 09c318
	if (SvROK($arg)) {
Packit 09c318
	    IV tmp = SvIV((SV*)SvRV($arg));
Packit 09c318
	    $var = ($type) tmp;
Packit 09c318
	}
Packit 09c318
	else
Packit 09c318
	    croak(\"$var is not a reference\")
Packit 09c318
T_REF_IV_REF
Packit 09c318
	if (sv_isa($arg, \"${type}\")) {
Packit 09c318
	    IV tmp = SvIV((SV*)SvRV($arg));
Packit 09c318
	    $var = *($type *) tmp;
Packit 09c318
	}
Packit 09c318
	else
Packit 09c318
	    croak(\"$var is not of type ${ntype}\")
Packit 09c318
T_REF_IV_PTR
Packit 09c318
	if (sv_isa($arg, \"${type}\")) {
Packit 09c318
	    IV tmp = SvIV((SV*)SvRV($arg));
Packit 09c318
	    $var = ($type) tmp;
Packit 09c318
	}
Packit 09c318
	else
Packit 09c318
	    croak(\"$var is not of type ${ntype}\")
Packit 09c318
T_PTROBJ
Packit 09c318
	if (sv_derived_from($arg, \"${ntype}\")) {
Packit 09c318
	    IV tmp = SvIV((SV*)SvRV($arg));
Packit 09c318
	    $var = ($type) tmp;
Packit 09c318
	}
Packit 09c318
	else
Packit 09c318
	    croak(\"$var is not of type ${ntype}\")
Packit 09c318
T_PTRDESC
Packit 09c318
	if (sv_isa($arg, \"${ntype}\")) {
Packit 09c318
	    IV tmp = SvIV((SV*)SvRV($arg));
Packit 09c318
	    ${type}_desc = (\U${type}_DESC\E*) tmp; 
Packit 09c318
	    $var = ${type}_desc->ptr;
Packit 09c318
	}
Packit 09c318
	else
Packit 09c318
	    croak(\"$var is not of type ${ntype}\")
Packit 09c318
T_REFREF
Packit 09c318
	if (SvROK($arg)) {
Packit 09c318
	    IV tmp = SvIV((SV*)SvRV($arg));
Packit 09c318
	    $var = *($type) tmp;
Packit 09c318
	}
Packit 09c318
	else
Packit 09c318
	    croak(\"$var is not a reference\")
Packit 09c318
T_REFOBJ
Packit 09c318
	if (sv_isa($arg, \"${ntype}\")) {
Packit 09c318
	    IV tmp = SvIV((SV*)SvRV($arg));
Packit 09c318
	    $var = *($type) tmp;
Packit 09c318
	}
Packit 09c318
	else
Packit 09c318
	    croak(\"$var is not of type ${ntype}\")
Packit 09c318
T_OPAQUE
Packit 09c318
	$var NOT IMPLEMENTED
Packit 09c318
T_OPAQUEPTR
Packit 09c318
	$var = ($type)SvPV($arg,PL_na)
Packit 09c318
T_PACKED
Packit 09c318
	$var = XS_unpack_$ntype($arg)
Packit 09c318
T_PACKEDARRAY
Packit 09c318
	$var = XS_unpack_$ntype($arg)
Packit 09c318
T_CALLBACK
Packit 09c318
	$var = make_perl_cb_$type($arg)
Packit 09c318
T_ARRAY
Packit 09c318
	$var = $ntype(items -= $argoff);
Packit 09c318
	U32 ix_$var = $argoff;
Packit 09c318
	while (items--) {
Packit 09c318
	    DO_ARRAY_ELEM;
Packit 09c318
	}
Packit 09c318
T_IN
Packit 09c318
	$var = IoIFP(sv_2io($arg))
Packit 09c318
T_INOUT
Packit 09c318
	$var = IoIFP(sv_2io($arg))
Packit 09c318
T_OUT
Packit 09c318
	$var = IoOFP(sv_2io($arg))
Packit 09c318
#############################################################################
Packit 09c318
OUTPUT
Packit 09c318
T_SV
Packit 09c318
	$arg = $var;
Packit 09c318
T_SVREF
Packit 09c318
	$arg = newRV((SV*)$var);
Packit 09c318
T_AVREF
Packit 09c318
	$arg = newRV((SV*)$var);
Packit 09c318
T_HVREF
Packit 09c318
	$arg = newRV((SV*)$var);
Packit 09c318
T_CVREF
Packit 09c318
	$arg = newRV((SV*)$var);
Packit 09c318
T_IV
Packit 09c318
	sv_setiv($arg, (IV)$var);
Packit 09c318
T_UV
Packit 09c318
	sv_setuv($arg, (UV)$var);
Packit 09c318
T_INT
Packit 09c318
	sv_setiv($arg, (IV)$var);
Packit 09c318
T_SYSRET
Packit 09c318
	if ($var != -1) {
Packit 09c318
	    if ($var == 0)
Packit 09c318
		sv_setpvn($arg, "0 but true", 10);
Packit 09c318
	    else
Packit 09c318
		sv_setiv($arg, (IV)$var);
Packit 09c318
	}
Packit 09c318
T_ENUM
Packit 09c318
	sv_setiv($arg, (IV)$var);
Packit 09c318
T_BOOL
Packit 09c318
	$arg = boolSV($var);
Packit 09c318
T_U_INT
Packit 09c318
	sv_setuv($arg, (UV)$var);
Packit 09c318
T_SHORT
Packit 09c318
	sv_setiv($arg, (IV)$var);
Packit 09c318
T_U_SHORT
Packit 09c318
	sv_setuv($arg, (UV)$var);
Packit 09c318
T_LONG
Packit 09c318
	sv_setiv($arg, (IV)$var);
Packit 09c318
T_U_LONG
Packit 09c318
	sv_setuv($arg, (UV)$var);
Packit 09c318
T_CHAR
Packit 09c318
	sv_setpvn($arg, (char *)&$var, 1);
Packit 09c318
T_U_CHAR
Packit 09c318
	sv_setuv($arg, (UV)$var);
Packit 09c318
T_FLOAT
Packit 09c318
	sv_setnv($arg, (double)$var);
Packit 09c318
T_NV
Packit 09c318
	sv_setnv($arg, (double)$var);
Packit 09c318
T_DOUBLE
Packit 09c318
	sv_setnv($arg, (double)$var);
Packit 09c318
T_PV
Packit 09c318
	sv_setpv((SV*)$arg, $var);
Packit 09c318
T_PTR
Packit 09c318
	sv_setiv($arg, (IV)$var);
Packit 09c318
T_PTRREF
Packit 09c318
	sv_setref_pv($arg, Nullch, (void*)$var);
Packit 09c318
T_REF_IV_REF
Packit 09c318
	sv_setref_pv($arg, \"${ntype}\", (void*)new $ntype($var));
Packit 09c318
T_REF_IV_PTR
Packit 09c318
	sv_setref_pv($arg, \"${ntype}\", (void*)$var);
Packit 09c318
T_PTROBJ
Packit 09c318
	sv_setref_pv($arg, \"${ntype}\", (void*)$var);
Packit 09c318
T_PTRDESC
Packit 09c318
	sv_setref_pv($arg, \"${ntype}\", (void*)new\U${type}_DESC\E($var));
Packit 09c318
T_REFREF
Packit 09c318
	sv_setrefref($arg, \"${ntype}\", XS_service_$ntype,
Packit 09c318
		    ($var ? (void*)new $ntype($var) : 0));
Packit 09c318
T_REFOBJ
Packit 09c318
	NOT IMPLEMENTED
Packit 09c318
T_OPAQUE
Packit 09c318
	sv_setpvn($arg, (char *)&$var, sizeof($var));
Packit 09c318
T_OPAQUEPTR
Packit 09c318
	sv_setpvn($arg, (char *)$var, sizeof(*$var)), XFree((char *)$var);
Packit 09c318
T_PACKED
Packit 09c318
	XS_pack_$ntype($arg, $var);
Packit 09c318
T_PACKEDARRAY
Packit 09c318
	XS_pack_$ntype($arg, $var, count_$ntype);
Packit 09c318
T_DATAUNIT	
Packit 09c318
	sv_setpvn($arg, $var.chp(), $var.size());
Packit 09c318
T_CALLBACK
Packit 09c318
	sv_setpvn($arg, $var.context.value().chp(),
Packit 09c318
		$var.context.value().size());
Packit 09c318
T_ARRAY
Packit 09c318
	ST_EXTEND($var.size);
Packit 09c318
	for (U32 ix_$var = 0; ix_$var < $var.size; ix_$var++) {
Packit 09c318
		ST(ix_$var) = sv_newmortal();
Packit 09c318
	DO_ARRAY_ELEM
Packit 09c318
	}
Packit 09c318
	SP += $var.size - 1;
Packit 09c318
T_IN
Packit 09c318
	{
Packit 09c318
	    GV *gv = newGVgen("$Package");
Packit 09c318
	    if ( do_open(gv, "<&", 2, FALSE, 0, 0, $var) )
Packit 09c318
		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
Packit 09c318
	    else
Packit 09c318
		$arg = &PL_sv_undef;
Packit 09c318
	}
Packit 09c318
T_INOUT
Packit 09c318
	{
Packit 09c318
	    GV *gv = newGVgen("$Package");
Packit 09c318
	    if ( do_open(gv, "+<&", 3, FALSE, 0, 0, $var) )
Packit 09c318
		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
Packit 09c318
	    else
Packit 09c318
		$arg = &PL_sv_undef;
Packit 09c318
	}
Packit 09c318
T_OUT
Packit 09c318
	{
Packit 09c318
	    GV *gv = newGVgen("$Package");
Packit 09c318
	    if ( do_open(gv, "+>&", 3, FALSE, 0, 0, $var) )
Packit 09c318
		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
Packit 09c318
	    else
Packit 09c318
		$arg = &PL_sv_undef;
Packit 09c318
	}
Packit 09c318
Packit 09c318
# SJP
Packit 09c318
Packit 09c318
TYPEMAP
Packit 09c318
pdl*	T_PDL
Packit 09c318
pdl *	T_PDL
Packit 09c318
Logical	T_IV
Packit 09c318
float	T_NV
Packit 09c318
Packit 09c318
INPUT
Packit 09c318
Packit 09c318
T_PDL
Packit 09c318
	$var = PDL->SvPDLV($arg)
Packit 09c318
Packit 09c318
Packit 09c318
OUTPUT
Packit 09c318
Packit 09c318
T_PDL
Packit 09c318
	PDL->SetSV_PDL($arg,$var);