X-Git-Url: https://scm.cri.ensmp.fr/git/linpy.git/blobdiff_plain/3b1b3560c8880ef25995a18b6e365e0d730a2df2..f85fc6de63ea023ab1a6aa4f5ff4ca96c79e384d:/pypol/_isl.c diff --git a/pypol/_isl.c b/pypol/_isl.c index 974b0c0..06f63fe 100644 --- a/pypol/_isl.c +++ b/pypol/_isl.c @@ -1,7 +1,70 @@ #include -#include + +#include +#include + +struct _isl_constraint_list { + int cursor; + PyObject *constraints; +}; +typedef struct _isl_constraint_list _isl_constraint_list; + +static int _isl_isl_basic_set_add_constraint_list(__isl_take isl_constraint *c, + void *user) { + _isl_constraint_list *list; + PyObject *value; + + list = (_isl_constraint_list *) user; + value = PyLong_FromVoidPtr(c); + if (value == NULL) { + return -1; + } + PyList_SET_ITEM(list->constraints, list->cursor++, value); + return 0; +} + +static PyObject * _isl_isl_basic_set_constraints(PyObject *self, + PyObject* args) { + long ptr; + isl_basic_set *bset; + int n; + PyObject *constraints; + _isl_constraint_list *list; + + if (!PyArg_ParseTuple(args, "l", &ptr)) + return NULL; + bset = (isl_basic_set*) ptr; + n = isl_basic_set_n_constraint(bset); + if (n == -1) { + PyErr_SetString(PyExc_RuntimeError, + "an error occurred in isl_basic_set_n_constraint"); + return NULL; + } + constraints = PyList_New(n); + if (constraints == NULL) { + return NULL; + } + list = malloc(sizeof(_isl_constraint_list)); + if (list == NULL) { + Py_DECREF(constraints); + return PyErr_NoMemory(); + } + list->cursor = 0; + list->constraints = constraints; + n = isl_basic_set_foreach_constraint(bset, + _isl_isl_basic_set_add_constraint_list, list); + free(list); + if (n == -1) { + PyErr_SetString(PyExc_RuntimeError, + "an error occurred in isl_basic_set_foreach_constraint"); + Py_DECREF(constraints); + return NULL; + } + return constraints; +} static PyMethodDef _isl_methods[] = { + {"isl_basic_set_constraints", _isl_isl_basic_set_constraints, METH_VARARGS, NULL}, {NULL, NULL, 0, NULL} }; @@ -9,17 +72,20 @@ static struct PyModuleDef _islmodule = { PyModuleDef_HEAD_INIT, "_isl", NULL, - -1, + 0, _isl_methods }; PyMODINIT_FUNC PyInit__isl(void) { PyObject *m; m = PyModule_Create(&_islmodule); - if (m == NULL) + if (m == NULL) { return NULL; + } - PyModule_AddObject(m, "isl_dim_set", PyLong_FromLong(isl_dim_set)); + if (PyModule_AddObject(m, "isl_dim_set", PyLong_FromLong(isl_dim_set)) == -1) { + return NULL; + } return m; }