diff options
Diffstat (limited to 'plugins/pychrysalide/analysis/types/cse.c')
-rw-r--r-- | plugins/pychrysalide/analysis/types/cse.c | 110 |
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; } |