start python bindings
This commit is contained in:
parent
68662e5bcc
commit
6c64a61ffa
|
@ -2410,6 +2410,193 @@ sub finish {
|
|||
$self->SUPER::finish;
|
||||
}
|
||||
|
||||
package SigarWrapper::Python;
|
||||
|
||||
our @ISA = qw(SigarWrapper);
|
||||
|
||||
our %field_types = (
|
||||
Long => "PyLong_FromUnsignedLongLong",
|
||||
Double => "PyFloat_FromDouble",
|
||||
Int => "PyInt_FromLong",
|
||||
Char => "PySigarInt_FromChar",
|
||||
String => "PyString_FromString",
|
||||
NetAddress => "PySigarString_FromNetAddr",
|
||||
);
|
||||
|
||||
my $c_file = '_sigar_generated.c';
|
||||
|
||||
sub sources {
|
||||
return $c_file;
|
||||
}
|
||||
|
||||
sub start {
|
||||
my $self = shift;
|
||||
$self->SUPER::start;
|
||||
$self->{cfh} = $self->create($c_file);
|
||||
}
|
||||
|
||||
sub pyclass {
|
||||
my $class = shift;
|
||||
return "Sigar.$class";
|
||||
}
|
||||
|
||||
sub pytype {
|
||||
my $class = shift;
|
||||
return 'pysigar_PySigar' . $class . 'Type';
|
||||
}
|
||||
|
||||
sub generate_class {
|
||||
my($self, $func) = @_;
|
||||
|
||||
my $cfh = $self->{cfh};
|
||||
my $pyclass = pyclass($func->{name});
|
||||
my $pytype = pytype($func->{name});
|
||||
my $cname = $func->{cname};
|
||||
my $parse_args = "";
|
||||
my $vars = "";
|
||||
my $args = 'sigar';
|
||||
|
||||
if ($func->{num_args} == 1) {
|
||||
if ($func->{is_proc}) {
|
||||
$parse_args = 'PySigar_ParsePID;';
|
||||
$vars = "long $func->{arg};\n";
|
||||
}
|
||||
else {
|
||||
$parse_args .= 'PySigar_ParseName;';
|
||||
$vars = "char *$func->{arg}; int $func->{arg}_len;\n";
|
||||
}
|
||||
$args .= ", $func->{arg}";
|
||||
}
|
||||
|
||||
my $prefix = "py$func->{sigar_prefix}_";
|
||||
my $methods = $prefix . 'methods';
|
||||
my $dtor = 'pysigar_free';
|
||||
|
||||
for my $field (@{ $func->{fields} }) {
|
||||
my $name = $field->{name};
|
||||
my $type = $field_types{ $field->{type} };
|
||||
my $method = $prefix . $name;
|
||||
|
||||
print $cfh <<EOF;
|
||||
static PyObject *$method(PyObject *self, PyObject *args)
|
||||
{
|
||||
$func->{sigar_type} *$cname = ($func->{sigar_type} *)PySIGAR_OBJ->ptr;
|
||||
return $type($cname->$name);
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
print $cfh "static PyMethodDef $methods [] = {\n";
|
||||
for my $field (@{ $func->{fields} }) {
|
||||
my $name = $field->{name};
|
||||
print $cfh qq( { "$name", ${prefix}$name, METH_NOARGS, "$name" },\n);
|
||||
}
|
||||
print $cfh " {NULL}\n};\n";
|
||||
|
||||
print $cfh <<EOF;
|
||||
static PyTypeObject $pytype = {
|
||||
PyObject_HEAD_INIT(NULL)
|
||||
0, /*ob_size*/
|
||||
"$pyclass", /*tp_name*/
|
||||
sizeof(PySigarObject), /*tp_basicsize*/
|
||||
0, /*tp_itemsize*/
|
||||
pysigar_free, /*tp_dealloc*/
|
||||
0, /*tp_print*/
|
||||
0, /*tp_getattr*/
|
||||
0, /*tp_setattr*/
|
||||
0, /*tp_compare*/
|
||||
0, /*tp_repr*/
|
||||
0, /*tp_as_number*/
|
||||
0, /*tp_as_sequence*/
|
||||
0, /*tp_as_mapping*/
|
||||
0, /*tp_hash */
|
||||
0, /*tp_call*/
|
||||
0, /*tp_str*/
|
||||
0, /*tp_getattro*/
|
||||
0, /*tp_setattro*/
|
||||
0, /*tp_as_buffer*/
|
||||
PySigar_TPFLAGS, /*tp_flags*/
|
||||
0, /*tp_doc*/
|
||||
0, /*tp_traverse*/
|
||||
0, /*tp_clear*/
|
||||
0, /*tp_richcompare*/
|
||||
0, /*tp_weaklistoffset*/
|
||||
0, /*tp_iter*/
|
||||
0, /*tp_iternext*/
|
||||
$methods, /*tp_methods*/
|
||||
0, /*tp_members*/
|
||||
0, /*tp_getset*/
|
||||
0, /*tp_base*/
|
||||
0, /*tp_dict*/
|
||||
0, /*tp_descr_get*/
|
||||
0, /*tp_descr_set*/
|
||||
0, /*tp_dictoffset*/
|
||||
0, /*tp_init*/
|
||||
0, /*tp_alloc*/
|
||||
0 /*tp_new*/
|
||||
};
|
||||
EOF
|
||||
|
||||
print $cfh <<EOF if $func->{has_get};
|
||||
static PyObject *py$func->{sigar_function}(PyObject *self, PyObject *args)
|
||||
{
|
||||
int status;
|
||||
sigar_t *sigar = PySIGAR;
|
||||
$func->{sigar_type} *RETVAL = malloc(sizeof(*RETVAL));
|
||||
$vars
|
||||
$parse_args
|
||||
|
||||
if ((status = $func->{sigar_function}($args, RETVAL)) != SIGAR_OK) {
|
||||
free(RETVAL);
|
||||
PySigar_Croak();
|
||||
return NULL;
|
||||
}
|
||||
else {
|
||||
PyObject *self = PySigar_new($pytype);
|
||||
PySIGAR_OBJ->ptr = RETVAL;
|
||||
return self;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
sub finish {
|
||||
my $self = shift;
|
||||
|
||||
my $mappings = $self->get_mappings;
|
||||
my $cfh = $self->{cfh};
|
||||
my $nl = '\\' . "\n";
|
||||
|
||||
print $cfh "#define PY_SIGAR_METHODS $nl";
|
||||
for my $func (@$mappings) {
|
||||
next unless $func->{has_get};
|
||||
my $arginfo = $func->{num_args} ? 'METH_VARARGS' : 'METH_NOARGS';
|
||||
print $cfh qq( {"$func->{cname}", py$func->{sigar_function}, $arginfo, NULL},);
|
||||
if ($func == $mappings->[-1]) {
|
||||
print $cfh "\n";
|
||||
}
|
||||
else {
|
||||
print $cfh $nl;
|
||||
}
|
||||
}
|
||||
|
||||
print $cfh "#define PY_SIGAR_ADD_TYPES $nl";
|
||||
for my $func (@$mappings) {
|
||||
next unless $func->{has_get};
|
||||
my $pyclass = pyclass($func->{name});
|
||||
my $pytype = pytype($func->{name});
|
||||
print $cfh qq{ PySigar_AddType("$pyclass", $pytype)};
|
||||
if ($func == $mappings->[-1]) {
|
||||
print $cfh "\n";
|
||||
}
|
||||
else {
|
||||
print $cfh ";$nl";
|
||||
}
|
||||
}
|
||||
|
||||
$self->SUPER::finish;
|
||||
}
|
||||
|
||||
#XXX not currently supporting netware
|
||||
package SigarWrapper::Netware;
|
||||
|
||||
|
|
Loading…
Reference in New Issue