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
|
# Internal functions
my $c_strlen_func = sub {
local ($_) = @_;
return "strlen ($_) + 1";
};
my $c_marshal_func = sub {
my ($type, $param, $indent) = @_;
my $code = '';
$code .= sprintf ("%s_LIBGTOP_SEND_temp_len = strlen (%s)+1;\n",
$indent, $param);
$code .= sprintf ("%smemcpy (_LIBGTOP_SEND_ptr, %s, %s);\n",
$indent, "&_LIBGTOP_SEND_temp_len", "sizeof (size_t)");
$code .= sprintf ("%s_LIBGTOP_SEND_ptr += sizeof (size_t);\n", $indent);
$code .= sprintf ("%smemcpy (_LIBGTOP_DATA_ptr, %s, %s);\n",
$indent, $param, "strlen ($param)+1");
$code .= sprintf ("%s_LIBGTOP_DATA_ptr += strlen ($param)+1;\n",
$indent);
$need_temp_len = 1;
return $code;
};
my $c_demarshal_func = sub {
my ($type, $param, $indent) = @_;
my $code = '';
$code .= sprintf ("%s_LIBGTOP_demarshal_%s = _LIBGTOP_DATA_ptr;\n",
$indent, $param);
$code .= sprintf ("%sif (_LIBGTOP_TEMP_len) --_LIBGTOP_TEMP_len;\n",
$indent);
$code .= sprintf ("%s*(_LIBGTOP_DATA_ptr + _LIBGTOP_TEMP_len) = 0;\n",
$indent);
$need_temp_len = 1;
return $code;
};
# Typeinfo array fields:
# ---------------------
# * C type name
# * Flag specifying whether we need to copy the parameter into temp storage
#
$typeinfo = {'long' => ['gint64', 0],
'ulong' => ['guint64', 0],
'pid_t' => ['pid_t', 0],
'int' => ['int', 0],
'retval' => ['int', 0],
'ushort' => ['unsigned short', 0],
'unsigned' => ['unsigned', 0],
'string' => ['const char *', 1],
};
$sizeof_funcs = {'string' => $c_strlen_func,
};
$marshal_funcs = {'string' => $c_marshal_func,
};
$demarshal_funcs = {'string' => $c_demarshal_func,
};
1;
|