summaryrefslogtreecommitdiff
path: root/ext/typemap
diff options
context:
space:
mode:
Diffstat (limited to 'ext/typemap')
-rw-r--r--ext/typemap155
1 files changed, 106 insertions, 49 deletions
diff --git a/ext/typemap b/ext/typemap
index 1d0c9baef3..98493e7c04 100644
--- a/ext/typemap
+++ b/ext/typemap
@@ -3,24 +3,32 @@
int T_IV
unsigned T_IV
unsigned int T_IV
-long T_NV
-unsigned long T_NV
+long T_IV
+unsigned long T_IV
short T_IV
unsigned short T_IV
char T_CHAR
unsigned char T_U_CHAR
-char * T_STRING
-unsigned char * T_STRING
-caddr_t T_STRING
+char * T_PV
+unsigned char * T_PV
+caddr_t T_PV
+wchar_t * T_PV
+wchar_t T_IV
+bool_t T_IV
+size_t T_IV
+ssize_t T_IV
+time_t T_NV
unsigned long * T_OPAQUEPTR
char ** T_PACKED
void * T_PTR
+Time_t * T_PV
SV * T_SV
-SV * T_SVOBJ
-AV * T_AVOBJ
-HV * T_HVOBJ
-CV * T_CVOBJ
+SVREF T_SVREF
+AV * T_AVREF
+HV * T_HVREF
+CV * T_CVREF
+IV T_IV
I32 T_IV
I16 T_IV
I8 T_IV
@@ -28,30 +36,36 @@ U32 T_U_LONG
U16 T_U_SHORT
U8 T_IV
Result T_U_CHAR
-Boolean T_U_CHAR
+Boolean T_IV
double T_DOUBLE
SysRet T_SYSRET
+SysRetLong T_SYSRET
+FILE * T_IN
+FileHandle T_PTROBJ
+InputStream T_IN
+InOutStream T_INOUT
+OutputStream T_OUT
#############################################################################
INPUT
T_SV
- $var = $arg;
-T_SVOBJ
+ $var = $arg
+T_SVREF
if (sv_isa($arg, \"${ntype}\"))
- $var = (AV*)SvRV($arg);
+ $var = (SV*)SvRV($arg);
else
croak(\"$var is not of type ${ntype}\")
-T_AVOBJ
+T_AVREF
if (sv_isa($arg, \"${ntype}\"))
$var = (AV*)SvRV($arg);
else
croak(\"$var is not of type ${ntype}\")
-T_HVOBJ
+T_HVREF
if (sv_isa($arg, \"${ntype}\"))
$var = (HV*)SvRV($arg);
else
croak(\"$var is not of type ${ntype}\")
-T_CVOBJ
+T_CVREF
if (sv_isa($arg, \"${ntype}\"))
$var = (CV*)SvRV($arg);
else
@@ -84,30 +98,41 @@ T_NV
$var = ($type)SvNV($arg)
T_DOUBLE
$var = (double)SvNV($arg)
-T_STRING
- $var = SvPV($arg,na)
+T_PV
+ $var = ($type)SvPV($arg,na)
T_PTR
- $var = ($type)(unsigned long)SvNV($arg)
+ $var = ($type)SvIV($arg)
T_PTRREF
if (SvROK($arg)) {
- unsigned long tmp;
- tmp = (unsigned long)SvNV((SV*)SvRV($arg));
+ IV tmp = SvIV((SV*)SvRV($arg));
$var = ($type) tmp;
}
else
croak(\"$var is not a reference\")
+T_REF_IV_REF
+ if (sv_isa($arg, \"${type}\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = *($type *) tmp;
+ }
+ else
+ croak(\"$var is not of type ${ntype}\")
+T_REF_IV_PTR
+ if (sv_isa($arg, \"${type}\")) {
+ IV tmp = SvIV((SV*)SvRV($arg));
+ $var = ($type) tmp;
+ }
+ else
+ croak(\"$var is not of type ${ntype}\")
T_PTROBJ
if (sv_isa($arg, \"${ntype}\")) {
- unsigned long tmp;
- tmp = (unsigned long)SvNV((SV*)SvRV($arg));
+ IV tmp = SvIV((SV*)SvRV($arg));
$var = ($type) tmp;
}
else
croak(\"$var is not of type ${ntype}\")
T_PTRDESC
if (sv_isa($arg, \"${ntype}\")) {
- unsigned long tmp;
- tmp = (unsigned long)SvNV((SV*)SvRV($arg));
+ IV tmp = SvIV((SV*)SvRV($arg));
${type}_desc = (\U${type}_DESC\E*) tmp;
$var = ${type}_desc->ptr;
}
@@ -115,16 +140,14 @@ T_PTRDESC
croak(\"$var is not of type ${ntype}\")
T_REFREF
if (SvROK($arg)) {
- unsigned long tmp;
- tmp = (unsigned long)SvNV((SV*)SvRV($arg));
+ IV tmp = SvIV((SV*)SvRV($arg));
$var = *($type) tmp;
}
else
croak(\"$var is not a reference\")
T_REFOBJ
if (sv_isa($arg, \"${ntype}\")) {
- unsigned long tmp;
- tmp = (unsigned long)SvNV((SV*)SvRV($arg));
+ IV tmp = SvIV((SV*)SvRV($arg));
$var = *($type) tmp;
}
else
@@ -145,61 +168,71 @@ T_ARRAY
while (items--) {
DO_ARRAY_ELEM;
}
+T_IN
+ $var = IoIFP(sv_2io($arg))
+T_INOUT
+ $var = IoIFP(sv_2io($arg))
+T_OUT
+ $var = IoOFP(sv_2io($arg))
#############################################################################
OUTPUT
T_SV
$arg = $var;
-T_SVOBJ
+T_SVREF
$arg = newRV((SV*)$var);
-T_AVOBJ
+T_AVREF
$arg = newRV((SV*)$var);
-T_HVOBJ
+T_HVREF
$arg = newRV((SV*)$var);
-T_CVOBJ
+T_CVREF
$arg = newRV((SV*)$var);
T_IV
- sv_setiv($arg, (I32)$var);
+ sv_setiv($arg, (IV)$var);
T_INT
- sv_setiv($arg, (I32)$var);
+ sv_setiv($arg, (IV)$var);
T_SYSRET
if ($var != -1) {
if ($var == 0)
sv_setpvn($arg, "0 but true", 10);
else
- sv_setiv($arg, (I32)$var);
+ sv_setiv($arg, (IV)$var);
}
T_ENUM
- sv_setiv($arg, (I32)$var);
+ sv_setiv($arg, (IV)$var);
T_U_INT
- sv_setiv($arg, (I32)$var);
+ sv_setiv($arg, (IV)$var);
T_SHORT
- sv_setiv($arg, (I32)$var);
+ sv_setiv($arg, (IV)$var);
T_U_SHORT
- sv_setiv($arg, (I32)$var);
+ sv_setiv($arg, (IV)$var);
T_LONG
- sv_setiv($arg, (I32)$var);
+ sv_setiv($arg, (IV)$var);
T_U_LONG
- sv_setiv($arg, (I32)$var);
+ sv_setiv($arg, (IV)$var);
T_CHAR
sv_setpvn($arg, (char *)&$var, 1);
T_U_CHAR
- sv_setiv($arg, (I32)$var);
+ sv_setiv($arg, (IV)$var);
T_FLOAT
sv_setnv($arg, (double)$var);
T_NV
sv_setnv($arg, (double)$var);
T_DOUBLE
sv_setnv($arg, (double)$var);
-T_STRING
- sv_setpv($arg, $var);
+T_PV
+ sv_setpv((SV*)$arg, $var);
T_PTR
- sv_setnv($arg, (double)(unsigned long)$var);
+ sv_setiv($arg, (IV)$var);
T_PTRREF
- sv_setptrref($arg, $var);
+ sv_setref_pv($arg, Nullch, (void*)$var);
+T_REF_IV_REF
+ sv_setref_pv($arg, \"${ntype}\", (void*)new $ntype($var));
+T_REF_IV_PTR
+ sv_setref_pv($arg, \"${ntype}\", (void*)$var);
T_PTROBJ
- sv_setptrobj($arg, $var, \"${ntype}\");
+ sv_setref_pv($arg, \"${ntype}\", (void*)$var);
T_PTRDESC
- sv_setptrobj($arg, (void*)new\U${type}_DESC\E($var), \"${ntype}\");
+ sv_setref_pv($arg, \"${ntype}\", (void*)new\U${type}_DESC\E($var));
T_REFREF
sv_setrefref($arg, \"${ntype}\", XS_service_$ntype,
($var ? (void*)new $ntype($var) : 0));
@@ -225,3 +258,27 @@ T_ARRAY
DO_ARRAY_ELEM
}
sp += $var.size - 1;
+T_IN
+ {
+ GV *gv = newGVgen("$Package");
+ if ( do_open(gv, "<&", 2, $var) )
+ sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+ else
+ $arg = &sv_undef;
+ }
+T_INOUT
+ {
+ GV *gv = newGVgen("$Package");
+ if ( do_open(gv, "+<&", 3, $var) )
+ sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+ else
+ $arg = &sv_undef;
+ }
+T_OUT
+ {
+ GV *gv = newGVgen("$Package");
+ if ( do_open(gv, "+>&", 3, $var) )
+ sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
+ else
+ $arg = &sv_undef;
+ }