Use PyList_SET_ITEM for list initialization in _isl.c
[linpy.git] / pypol / _isl.c
index 974b0c0..b9d6092 100644 (file)
@@ -1,7 +1,70 @@
 #include <Python.h>
-#include <isl/space.h>
+
+#include <isl/constraint.h>
+#include <isl/set.h>
+
+struct _isl_constraint_list {
+    int cursor;
+    PyObject *constraints;
+};
+typedef struct _isl_constraint_list _isl_constraint_list;
+
+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;
 }