#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 libloc context
- struct loc_ctx* ctx;
- int r = loc_new(&ctx);
- if (r)
- return NULL;
-
- // Create stringpool
- struct loc_stringpool* pool;
- r = loc_stringpool_new(ctx, &pool);
- if (r) {
- loc_unref(ctx);
- return NULL;
- }
-
+PyObject* new_as(PyTypeObject* type, struct loc_as* as) {
ASObject* self = (ASObject*)type->tp_alloc(type, 0);
if (self) {
- self->ctx = 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);
}
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, &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_str(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);
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,
},
tp_init: (initproc)AS_init,
tp_doc: "AS object",
tp_getset: AS_getsetters,
+ tp_repr: (reprfunc)AS_repr,
+ tp_str: (reprfunc)AS_str,
+ tp_richcompare: (richcmpfunc)AS_richcompare,
};