]> git.ipfire.org Git - people/ms/libloc.git/blobdiff - src/python/as.c
python: Fix setters
[people/ms/libloc.git] / src / python / as.c
index 4aad074fc653add9c7aab9d06ec2d74475f9ff76..ec1573b26bb8039f03dd967583f64e53d8a697f4 100644 (file)
 
 #include <loc/libloc.h>
 #include <loc/as.h>
-#include <loc/stringpool.h>
 
 #include "locationmodule.h"
 #include "as.h"
 
-static PyObject* AS_new(PyTypeObject* type, PyObject* args, PyObject* kwds) {
-       // Create stringpool
-       struct loc_stringpool* pool;
-       int r = loc_stringpool_new(loc_ctx, &pool);
-       if (r)
-               return NULL;
-
+PyObject* new_as(PyTypeObject* type, struct loc_as* as) {
        ASObject* self = (ASObject*)type->tp_alloc(type, 0);
        if (self) {
-               self->ctx = loc_ref(loc_ctx);
-               self->pool = pool;
+               self->as = loc_as_ref(as);
        }
 
        return (PyObject*)self;
 }
 
+static PyObject* AS_new(PyTypeObject* type, PyObject* args, PyObject* kwds) {
+       ASObject* self = (ASObject*)type->tp_alloc(type, 0);
+
+       return (PyObject*)self;
+}
+
 static void AS_dealloc(ASObject* self) {
        if (self->as)
                loc_as_unref(self->as);
 
-       if (self->pool)
-               loc_stringpool_unref(self->pool);
-
-       if (self->ctx)
-               loc_unref(self->ctx);
-
        Py_TYPE(self)->tp_free((PyObject* )self);
 }
 
@@ -59,13 +51,23 @@ static int AS_init(ASObject* self, PyObject* args, PyObject* kwargs) {
                return -1;
 
        // Create the AS object
-       int r = loc_as_new(self->ctx, self->pool, &self->as, number);
+       int r = loc_as_new(loc_ctx, NULL, &self->as, number);
        if (r)
                return -1;
 
        return 0;
 }
 
+static PyObject* AS_repr(ASObject* self) {
+       uint32_t number = loc_as_get_number(self->as);
+       const char* name = loc_as_get_name(self->as);
+
+       if (name)
+               return PyUnicode_FromFormat("<AS %d (%s)>", number, name);
+
+       return PyUnicode_FromFormat("<AS %d>", number);
+}
+
 static PyObject* AS_get_number(ASObject* self) {
        uint32_t number = loc_as_get_number(self->as);
 
@@ -78,11 +80,46 @@ static PyObject* AS_get_name(ASObject* self) {
        return PyUnicode_FromString(name);
 }
 
+static int AS_set_name(ASObject* self, PyObject* value) {
+       const char* name = PyUnicode_AsUTF8(value);
+
+       int r = loc_as_set_name(self->as, name);
+       if (r) {
+               PyErr_Format(PyExc_ValueError, "Could not set name: %s", name);
+               return r;
+       }
+
+       return 0;
+}
+
+static PyObject* AS_richcompare(ASObject* self, ASObject* other, int op) {
+       int r = loc_as_cmp(self->as, other->as);
+
+       switch (op) {
+               case Py_EQ:
+                       if (r == 0)
+                               Py_RETURN_TRUE;
+
+                       Py_RETURN_FALSE;
+
+               case Py_LT:
+                       if (r < 0)
+                               Py_RETURN_TRUE;
+
+                       Py_RETURN_FALSE;
+
+               default:
+                       break;
+       }
+
+       Py_RETURN_NOTIMPLEMENTED;
+}
+
 static struct PyGetSetDef AS_getsetters[] = {
        {
                "name",
                (getter)AS_get_name,
-               NULL,
+               (setter)AS_set_name,
                NULL,
                NULL,
        },
@@ -106,4 +143,6 @@ PyTypeObject ASType = {
        tp_init:                (initproc)AS_init,
        tp_doc:                 "AS object",
        tp_getset:              AS_getsetters,
+       tp_repr:                (reprfunc)AS_repr,
+       tp_richcompare:         (richcmpfunc)AS_richcompare,
 };