1# basic C types
2int			T_IV
3unsigned		T_UV
4unsigned int		T_UV
5long			T_IV
6unsigned long		T_UV
7short			T_IV
8unsigned short		T_UV
9char			T_CHAR
10unsigned char		T_U_CHAR
11char *			T_PV
12unsigned char *		T_PV
13const char *		T_PV
14caddr_t			T_PV
15wchar_t *		T_PV
16wchar_t			T_IV
17# bool_t is defined in <rpc/rpc.h>
18bool_t			T_IV
19size_t			T_UV
20ssize_t			T_IV
21time_t			T_NV
22unsigned long *		T_OPAQUEPTR
23char **			T_PACKEDARRAY
24void *			T_PTR
25Time_t *		T_PV
26SV *			T_SV
27SVREF			T_SVREF
28AV *			T_AVREF
29HV *			T_HVREF
30CV *			T_CVREF
31
32IV			T_IV
33UV			T_UV
34NV                      T_NV
35I32			T_IV
36I16			T_IV
37I8			T_IV
38STRLEN			T_UV
39U32			T_U_LONG
40U16			T_U_SHORT
41U8			T_UV
42Result			T_U_CHAR
43Boolean			T_BOOL
44float                   T_FLOAT
45double			T_DOUBLE
46SysRet			T_SYSRET
47SysRetLong		T_SYSRET
48FILE *			T_STDIO
49PerlIO *		T_INOUT
50FileHandle		T_PTROBJ
51InputStream		T_IN
52InOutStream		T_INOUT
53OutputStream		T_OUT
54bool			T_BOOL
55
56#############################################################################
57INPUT
58T_SV
59	$var = $arg
60T_SVREF
61	if (SvROK($arg))
62	    $var = (SV*)SvRV($arg);
63	else
64	    Perl_croak(aTHX_ \"%s: %s is not a reference\",
65			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
66			\"$var\")
67T_AVREF
68	if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV)
69	    $var = (AV*)SvRV($arg);
70	else
71	    Perl_croak(aTHX_ \"%s: %s is not an array reference\",
72			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
73			\"$var\")
74T_HVREF
75	if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVHV)
76	    $var = (HV*)SvRV($arg);
77	else
78	    Perl_croak(aTHX_ \"%s: %s is not a hash reference\",
79			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
80			\"$var\")
81T_CVREF
82	if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVCV)
83	    $var = (CV*)SvRV($arg);
84	else
85	    Perl_croak(aTHX_ \"%s: %s is not a code reference\",
86			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
87			\"$var\")
88T_SYSRET
89	$var NOT IMPLEMENTED
90T_UV
91	$var = ($type)SvUV($arg)
92T_IV
93	$var = ($type)SvIV($arg)
94T_INT
95	$var = (int)SvIV($arg)
96T_ENUM
97	$var = ($type)SvIV($arg)
98T_BOOL
99	$var = (bool)SvTRUE($arg)
100T_U_INT
101	$var = (unsigned int)SvUV($arg)
102T_SHORT
103	$var = (short)SvIV($arg)
104T_U_SHORT
105	$var = (unsigned short)SvUV($arg)
106T_LONG
107	$var = (long)SvIV($arg)
108T_U_LONG
109	$var = (unsigned long)SvUV($arg)
110T_CHAR
111	$var = (char)*SvPV_nolen($arg)
112T_U_CHAR
113	$var = (unsigned char)SvUV($arg)
114T_FLOAT
115	$var = (float)SvNV($arg)
116T_NV
117	$var = ($type)SvNV($arg)
118T_DOUBLE
119	$var = (double)SvNV($arg)
120T_PV
121	$var = ($type)SvPV_nolen($arg)
122T_PTR
123	$var = INT2PTR($type,SvIV($arg))
124T_PTRREF
125	if (SvROK($arg)) {
126	    IV tmp = SvIV((SV*)SvRV($arg));
127	    $var = INT2PTR($type,tmp);
128	}
129	else
130	    Perl_croak(aTHX_ \"%s: %s is not a reference\",
131			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
132			\"$var\")
133T_REF_IV_REF
134	if (sv_isa($arg, \"${ntype}\")) {
135	    IV tmp = SvIV((SV*)SvRV($arg));
136	    $var = *INT2PTR($type *, tmp);
137	}
138	else
139	    Perl_croak(aTHX_ \"%s: %s is not of type %s\",
140			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
141			\"$var\", \"$ntype\")
142T_REF_IV_PTR
143	if (sv_isa($arg, \"${ntype}\")) {
144	    IV tmp = SvIV((SV*)SvRV($arg));
145	    $var = INT2PTR($type, tmp);
146	}
147	else
148	    Perl_croak(aTHX_ \"%s: %s is not of type %s\",
149			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
150			\"$var\", \"$ntype\")
151T_PTROBJ
152	if (sv_derived_from($arg, \"${ntype}\")) {
153	    IV tmp = SvIV((SV*)SvRV($arg));
154	    $var = INT2PTR($type,tmp);
155	}
156	else
157	    Perl_croak(aTHX_ \"%s: %s is not of type %s\",
158			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
159			\"$var\", \"$ntype\")
160T_PTRDESC
161	if (sv_isa($arg, \"${ntype}\")) {
162	    IV tmp = SvIV((SV*)SvRV($arg));
163	    ${type}_desc = (\U${type}_DESC\E*) tmp;
164	    $var = ${type}_desc->ptr;
165	}
166	else
167	    Perl_croak(aTHX_ \"%s: %s is not of type %s\",
168			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
169			\"$var\", \"$ntype\")
170T_REFREF
171	if (SvROK($arg)) {
172	    IV tmp = SvIV((SV*)SvRV($arg));
173	    $var = *INT2PTR($type,tmp);
174	}
175	else
176	    Perl_croak(aTHX_ \"%s: %s is not a reference\",
177			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
178			\"$var\")
179T_REFOBJ
180	if (sv_isa($arg, \"${ntype}\")) {
181	    IV tmp = SvIV((SV*)SvRV($arg));
182	    $var = *INT2PTR($type,tmp);
183	}
184	else
185	    Perl_croak(aTHX_ \"%s: %s is not of type %s\",
186			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
187			\"$var\", \"$ntype\")
188T_OPAQUE
189	$var = *($type *)SvPV_nolen($arg)
190T_OPAQUEPTR
191	$var = ($type)SvPV_nolen($arg)
192T_PACKED
193	$var = XS_unpack_$ntype($arg)
194T_PACKEDARRAY
195	$var = XS_unpack_$ntype($arg)
196T_CALLBACK
197	$var = make_perl_cb_$type($arg)
198T_ARRAY
199	U32 ix_$var = $argoff;
200	$var = $ntype(items -= $argoff);
201	while (items--) {
202	    DO_ARRAY_ELEM;
203	    ix_$var++;
204	}
205        /* this is the number of elements in the array */
206        ix_$var -= $argoff
207T_STDIO
208	$var = PerlIO_findFILE(IoIFP(sv_2io($arg)))
209T_IN
210	$var = IoIFP(sv_2io($arg))
211T_INOUT
212	$var = IoIFP(sv_2io($arg))
213T_OUT
214	$var = IoOFP(sv_2io($arg))
215#############################################################################
216OUTPUT
217T_SV
218	$arg = $var;
219T_SVREF
220	$arg = newRV((SV*)$var);
221T_AVREF
222	$arg = newRV((SV*)$var);
223T_HVREF
224	$arg = newRV((SV*)$var);
225T_CVREF
226	$arg = newRV((SV*)$var);
227T_IV
228	sv_setiv($arg, (IV)$var);
229T_UV
230	sv_setuv($arg, (UV)$var);
231T_INT
232	sv_setiv($arg, (IV)$var);
233T_SYSRET
234	if ($var != -1) {
235	    if ($var == 0)
236		sv_setpvn($arg, "0 but true", 10);
237	    else
238		sv_setiv($arg, (IV)$var);
239	}
240T_ENUM
241	sv_setiv($arg, (IV)$var);
242T_BOOL
243	${"$var" eq "RETVAL" ? \"$arg = boolSV($var);" : \"sv_setsv($arg, boolSV($var));"}
244T_U_INT
245	sv_setuv($arg, (UV)$var);
246T_SHORT
247	sv_setiv($arg, (IV)$var);
248T_U_SHORT
249	sv_setuv($arg, (UV)$var);
250T_LONG
251	sv_setiv($arg, (IV)$var);
252T_U_LONG
253	sv_setuv($arg, (UV)$var);
254T_CHAR
255	sv_setpvn($arg, (char *)&$var, 1);
256T_U_CHAR
257	sv_setuv($arg, (UV)$var);
258T_FLOAT
259	sv_setnv($arg, (double)$var);
260T_NV
261	sv_setnv($arg, (NV)$var);
262T_DOUBLE
263	sv_setnv($arg, (double)$var);
264T_PV
265	sv_setpv((SV*)$arg, $var);
266T_PTR
267	sv_setiv($arg, PTR2IV($var));
268T_PTRREF
269	sv_setref_pv($arg, Nullch, (void*)$var);
270T_REF_IV_REF
271	sv_setref_pv($arg, \"${ntype}\", (void*)new $ntype($var));
272T_REF_IV_PTR
273	sv_setref_pv($arg, \"${ntype}\", (void*)$var);
274T_PTROBJ
275	sv_setref_pv($arg, \"${ntype}\", (void*)$var);
276T_PTRDESC
277	sv_setref_pv($arg, \"${ntype}\", (void*)new\U${type}_DESC\E($var));
278T_REFREF
279	NOT_IMPLEMENTED
280T_REFOBJ
281	NOT IMPLEMENTED
282T_OPAQUE
283	sv_setpvn($arg, (char *)&$var, sizeof($var));
284T_OPAQUEPTR
285	sv_setpvn($arg, (char *)$var, sizeof(*$var));
286T_PACKED
287	XS_pack_$ntype($arg, $var);
288T_PACKEDARRAY
289	XS_pack_$ntype($arg, $var, count_$ntype);
290T_DATAUNIT	
291	sv_setpvn($arg, $var.chp(), $var.size());
292T_CALLBACK
293	sv_setpvn($arg, $var.context.value().chp(),
294		$var.context.value().size());
295T_ARRAY
296        {
297	    U32 ix_$var;
298	    EXTEND(SP,size_$var);
299	    for (ix_$var = 0; ix_$var < size_$var; ix_$var++) {
300		ST(ix_$var) = sv_newmortal();
301	DO_ARRAY_ELEM
302	    }
303        }
304T_STDIO
305	{
306	    GV *gv = newGVgen("$Package");
307	    PerlIO *fp = PerlIO_importFILE($var,0);
308	    if ( fp && do_open(gv, "+<&", 3, FALSE, 0, 0, fp) )
309		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
310	    else
311		$arg = &PL_sv_undef;
312	}
313T_IN
314	{
315	    GV *gv = newGVgen("$Package");
316	    if ( do_open(gv, "<&", 2, FALSE, 0, 0, $var) )
317		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
318	    else
319		$arg = &PL_sv_undef;
320	}
321T_INOUT
322	{
323	    GV *gv = newGVgen("$Package");
324	    if ( do_open(gv, "+<&", 3, FALSE, 0, 0, $var) )
325		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
326	    else
327		$arg = &PL_sv_undef;
328	}
329T_OUT
330	{
331	    GV *gv = newGVgen("$Package");
332	    if ( do_open(gv, "+>&", 3, FALSE, 0, 0, $var) )
333		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
334	    else
335		$arg = &PL_sv_undef;
336	}
337