summaryrefslogtreecommitdiff
path: root/plugins/pychrysalide/analysis/types/cse.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/pychrysalide/analysis/types/cse.c')
-rw-r--r--plugins/pychrysalide/analysis/types/cse.c110
1 files changed, 53 insertions, 57 deletions
diff --git a/plugins/pychrysalide/analysis/types/cse.c b/plugins/pychrysalide/analysis/types/cse.c
index 5f0bb0a..7701d48 100644
--- a/plugins/pychrysalide/analysis/types/cse.c
+++ b/plugins/pychrysalide/analysis/types/cse.c
@@ -32,6 +32,7 @@
#include <analysis/types/cse.h>
+#include "constants.h"
#include "../type.h"
#include "../../access.h"
#include "../../helpers.h"
@@ -42,14 +43,11 @@
static PyObject *py_class_enum_type_new(PyTypeObject *, PyObject *, PyObject *);
/* Fournit le type pris en compte géré par le type. */
-static PyObject *py_class_enum_type_get_base_type(PyObject *, void *);
+static PyObject *py_class_enum_type_get_kind(PyObject *, void *);
/* Donne la désignation de la classe / structure / énumération. */
static PyObject *py_class_enum_type_get_name(PyObject *, void *);
-/* Définit les constantes pour les types de classe/énumération. */
-static bool py_class_enum_type_define_constants(PyTypeObject *);
-
/******************************************************************************
@@ -69,21 +67,35 @@ static bool py_class_enum_type_define_constants(PyTypeObject *);
static PyObject *py_class_enum_type_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject *result; /* Instance à retourner */
- unsigned long base; /* Type de base à créer */
+ ClassEnumKind kind; /* Type de base à créer */
const char *name; /* Désignation humaine */
int ret; /* Bilan de lecture des args. */
GDataType *dtype; /* Version GLib du type */
- ret = PyArg_ParseTuple(args, "ks", &base, &name);
+#define CLASS_ENUM_TYPE_DOC \
+ "The ClassEnumType class handles types embedding other types, such as" \
+ " classes, structures or enumerations.\n" \
+ "\n" \
+ "Instances can be created using the following constructor:\n" \
+ "\n" \
+ " ClassEnumType(kind, name=None)" \
+ "\n" \
+ "Where *kind* is one of the" \
+ " pychrysalide.analysis.types.ClassEnumType.ClassEnumKind values," \
+ " except *ClassEnumKind.COUNT*, and *name* is an optional string."
+
+ name = NULL;
+
+ ret = PyArg_ParseTuple(args, "O&|s", convert_to_class_enum_type_class_enum_kind, &kind, &name);
if (!ret) return NULL;
- if (base >= CET_COUNT)
+ if (kind >= CEK_COUNT)
{
- PyErr_SetString(PyExc_TypeError, _("Bad basic type."));
+ PyErr_SetString(PyExc_TypeError, _("Bad class/enum kind."));
return NULL;
}
- dtype = g_class_enum_type_new(base, strdup(name));
+ dtype = g_class_enum_type_new(kind, name != NULL ? strdup(name) : NULL);
result = pygobject_new(G_OBJECT(dtype));
g_object_unref(dtype);
@@ -105,17 +117,26 @@ static PyObject *py_class_enum_type_new(PyTypeObject *type, PyObject *args, PyOb
* *
******************************************************************************/
-static PyObject *py_class_enum_type_get_base_type(PyObject *self, void *closure)
+static PyObject *py_class_enum_type_get_kind(PyObject *self, void *closure)
{
PyObject *result; /* Résultat à retourner */
GClassEnumType *type; /* Version GLib du type */
- ClassEnumType base; /* Type de base à renvoyer */
+ ClassEnumKind kind; /* Type de base à renvoyer */
+
+#define CLASS_ENUM_TYPE_KIND_ATTRIB PYTHON_GET_DEF_FULL \
+( \
+ kind, py_class_enum_type, \
+ "Provide the internal identifier for the kind of the type.\n" \
+ "\n" \
+ "This property provides a" \
+ " pychrysalide.analysis.types.ClassEnumType.ClassEnumKind value." \
+)
type = G_CLASS_ENUM_TYPE(pygobject_get(self));
- base = g_class_enum_type_get_base(type);
+ kind = g_class_enum_type_get_kind(type);
- result = PyLong_FromUnsignedLong(base);
+ result = cast_with_constants_group_from_type(get_python_class_enum_type_type(), "ClassEnumKind", kind);
return result;
@@ -141,11 +162,25 @@ static PyObject *py_class_enum_type_get_name(PyObject *self, void *closure)
GClassEnumType *type; /* Version GLib du type */
const char *name; /* Désignation humaine */
+#define CLASS_ENUM_TYPE_NAME_ATTRIB PYTHON_GET_DEF_FULL \
+( \
+ name, py_class_enum_type, \
+ "Provide the name registered for the type.\n" \
+ "\n" \
+ "This property provides a string or None if no value is defined." \
+)
+
type = G_CLASS_ENUM_TYPE(pygobject_get(self));
name = g_class_enum_type_get_name(type);
- result = PyUnicode_FromString(name);
+ if (name != NULL)
+ result = PyUnicode_FromString(name);
+ else
+ {
+ result = Py_None;
+ Py_INCREF(result);
+ }
return result;
@@ -171,14 +206,8 @@ PyTypeObject *get_python_class_enum_type_type(void)
};
static PyGetSetDef py_class_enum_type_getseters[] = {
- {
- "base", py_class_enum_type_get_base_type, NULL,
- "Provide the internal identifier of the type.", NULL
- },
- {
- "name", py_class_enum_type_get_name, NULL,
- "Provide the name of the type.", NULL
- },
+ CLASS_ENUM_TYPE_KIND_ATTRIB,
+ CLASS_ENUM_TYPE_NAME_ATTRIB,
{ NULL }
};
@@ -191,7 +220,7 @@ PyTypeObject *get_python_class_enum_type_type(void)
.tp_flags = Py_TPFLAGS_DEFAULT,
- .tp_doc = "PyChrysalide basic type",
+ .tp_doc = CLASS_ENUM_TYPE_DOC,
.tp_methods = py_class_enum_type_methods,
.tp_getset = py_class_enum_type_getseters,
@@ -206,39 +235,6 @@ PyTypeObject *get_python_class_enum_type_type(void)
/******************************************************************************
* *
-* Paramètres : obj_type = type dont le dictionnaire est à compléter. *
-* *
-* Description : Définit les constantes pour les types de classe/énumération. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static bool py_class_enum_type_define_constants(PyTypeObject *obj_type)
-{
- bool result; /* Bilan à retourner */
-
- result = true;
-
- result &= PyDict_AddULongMacro(obj_type, CET_UNKNOWN);
- result &= PyDict_AddULongMacro(obj_type, CET_STRUCT);
- result &= PyDict_AddULongMacro(obj_type, CET_ENUM);
- result &= PyDict_AddULongMacro(obj_type, CET_CLASS);
- result &= PyDict_AddULongMacro(obj_type, CET_NAMESPACE);
- result &= PyDict_AddULongMacro(obj_type, CET_VIRTUAL_TABLE);
- result &= PyDict_AddULongMacro(obj_type, CET_VIRTUAL_STRUCT);
-
- result &= PyDict_AddULongMacro(obj_type, CET_COUNT);
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
* Paramètres : module = module dont la définition est à compléter. *
* *
* Description : Prend en charge l'objet 'pychrysalide.....ClassEnumType'. *
@@ -269,7 +265,7 @@ bool ensure_python_class_enum_type_is_registered(void)
if (!register_class_for_pygobject(dict, G_TYPE_CLASS_ENUM_TYPE, type, get_python_data_type_type()))
return false;
- if (!py_class_enum_type_define_constants(type))
+ if (!define_class_enum_type_constants(type))
return false;
}