summaryrefslogtreecommitdiff
path: root/ext/typemap
blob: 24895dc890762dc1a50c7e9b2a3e2911369e80a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
# $Header$ 
# basic C types
int			T_INT
unsigned		T_U_INT
unsigned int		T_U_INT
long			T_LONG
unsigned long		T_U_LONG
short			T_SHORT
unsigned short		T_U_SHORT
char			T_CHAR
char *			T_STRING
unsigned char *		T_STRING
caddr_t			T_STRING
unsigned long *		T_OPAQUEPTR
char **			T_PACKED
void *			T_PTR
SV *			T_SV
SV *			T_SVOBJ
AV *			T_AVOBJ
HV *			T_HVOBJ
CV *			T_CVOBJ

I32			T_LONG
I16			T_SHORT
U32			T_U_LONG
U16			T_U_SHORT
Result			T_U_CHAR
Boolean			T_U_CHAR
double			T_DOUBLE
SysRet			T_SYSRET

#############################################################################
INPUT
T_SV
	$var = $arg;
T_SVOBJ
	if (sv_isa($arg, \"${ntype}\"))
	    $var = (AV*)SvRV($arg);
	else
	    croak(\"$var is not of type ${ntype}\")
T_AVOBJ
	if (sv_isa($arg, \"${ntype}\"))
	    $var = (AV*)SvRV($arg);
	else
	    croak(\"$var is not of type ${ntype}\")
T_HVOBJ
	if (sv_isa($arg, \"${ntype}\"))
	    $var = (HV*)SvRV($arg);
	else
	    croak(\"$var is not of type ${ntype}\")
T_CVOBJ
	if (sv_isa($arg, \"${ntype}\"))
	    $var = (CV*)SvRV($arg);
	else
	    croak(\"$var is not of type ${ntype}\")
T_SYSRET
	$var NOT IMPLEMENTED
T_INT
	$var = (int)SvIV($arg)
T_ENUM
	$var = ($type)SvIV($arg)
T_U_INT
	$var = (unsigned int)SvIV($arg)
T_SHORT
	$var = (short)SvIV($arg)
T_U_SHORT
	$var = (unsigned short)SvIV($arg)
T_LONG
	$var = (long)SvIV($arg)
T_U_LONG
	$var = (unsigned long)SvIV($arg)
T_CHAR
	$var = (char)*SvPV($arg,na)
T_U_CHAR
	$var = (unsigned char)SvIV($arg)
T_FLOAT
	$var = (float)SvNV($arg)
T_DOUBLE
	$var = SvNV($arg)
T_STRING
	$var = SvPV($arg,na)
T_PTR
	$var = ($type)(unsigned long)SvNV($arg)
T_PTRREF
	if (SvROK($arg))
	    $var = ($type)(unsigned long)SvNV((SV*)SvRV($arg));
	else
	    croak(\"$var is not a reference\")
T_PTROBJ
	if (sv_isa($arg, \"${ntype}\"))
	    $var = ($type)(unsigned long)SvNV((SV*)SvRV($arg));
	else
	    croak(\"$var is not of type ${ntype}\")
T_PTRDESC
	if (sv_isa($arg, \"${ntype}\")) {
	    ${type}_desc = (\U${type}_DESC\E*)(unsigned long)SvNV((SV*)SvRV($arg));
	    $var = ${type}_desc->ptr;
	}
	else
	    croak(\"$var is not of type ${ntype}\")
T_REFREF
	if (SvROK($arg))
	    $var = *($type)(unsigned long)SvNV((SV*)SvRV($arg));
	else
	    croak(\"$var is not a reference\")
T_REFOBJ
	if (sv_isa($arg, \"${ntype}\"))
	    $var = *($type)(unsigned long)SvNV((SV*)SvRV($arg));
	else
	    croak(\"$var is not of type ${ntype}\")
T_OPAQUE
	$var NOT IMPLEMENTED
T_OPAQUEPTR
	$var = ($type)SvPV($arg,na)
T_PACKED
	$var = XS_unpack_$ntype($arg)
T_PACKEDARRAY
	$var = XS_unpack_$ntype($arg)
T_CALLBACK
	$var = make_perl_cb_$type($arg)
T_ARRAY
	$var = $ntype(items -= $argoff);
	U32 ix_$var = $argoff;
	while (items--) {
	    DO_ARRAY_ELEM;
	}
#############################################################################
OUTPUT
T_SV
	$arg = $var;
T_SVOBJ
	$arg = newRV((SV*)$var);
T_AVOBJ
	$arg = newRV((SV*)$var);
T_HVOBJ
	$arg = newRV((SV*)$var);
T_CVOBJ
	$arg = newRV((SV*)$var);
T_INT
	sv_setiv($arg, (I32)$var);
T_SYSRET
	if ($var != -1) {
	    if ($var == 0)
		sv_setpvn($arg, "0 but true", 10);
	    else
		sv_setiv($arg, (I32)$var);
	}
T_ENUM
	sv_setiv($arg, (I32)$var);
T_U_INT
	sv_setiv($arg, (I32)$var);
T_SHORT
	sv_setiv($arg, (I32)$var);
T_U_SHORT
	sv_setiv($arg, (I32)$var);
T_LONG
	sv_setiv($arg, (I32)$var);
T_U_LONG
	sv_setiv($arg, (I32)$var);
T_CHAR
	sv_setpvn($arg, (char *)&$var, 1);
T_U_CHAR
	sv_setiv($arg, (I32)$var);
T_FLOAT
	sv_setnv($arg, (double)$var);
T_DOUBLE
	sv_setnv($arg, $var);
T_STRING
	sv_setpv($arg, $var);
T_PTR
	sv_setnv($arg, (double)(unsigned long)$var);
T_PTRREF
	sv_setptrref($arg, $var);
T_PTROBJ
	sv_setptrobj($arg, $var, \"${ntype}\");
T_PTRDESC
	sv_setptrobj($arg, (void*)new\U${type}_DESC\E($var), \"${ntype}\");
T_REFREF
	sv_setrefref($arg, \"${ntype}\", XS_service_$ntype,
		    ($var ? (void*)new $ntype($var) : 0));
T_REFOBJ
	NOT IMPLEMENTED
T_OPAQUE
	sv_setpvn($arg, (char *)&$var, sizeof($var));
T_OPAQUEPTR
	sv_setpvn($arg, (char *)$var, sizeof(*$var)), XFree((char *)$var);
T_PACKED
	XS_pack_$ntype($arg, $var);
T_PACKEDARRAY
	XS_pack_$ntype($arg, $var, count_$ntype);
T_DATAUNIT	
	sv_setpvn($arg, $var.chp(), $var.size());
T_CALLBACK
	sv_setpvn($arg, $var.context.value().chp(),
		$var.context.value().size());
T_ARRAY
	ST_EXTEND($var.size);
	for (U32 ix_$var = 0; ix_$var < $var.size; ix_$var++) {
		ST(ix_$var) = sv_newmortal();
	DO_ARRAY_ELEM
	}
	sp += $var.size - 1;