diff options
Diffstat (limited to 'plugins/pychrysalide/analysis/type.c')
-rw-r--r-- | plugins/pychrysalide/analysis/type.c | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/plugins/pychrysalide/analysis/type.c b/plugins/pychrysalide/analysis/type.c index 146e490..3694877 100644 --- a/plugins/pychrysalide/analysis/type.c +++ b/plugins/pychrysalide/analysis/type.c @@ -29,6 +29,9 @@ #include <pygobject.h> +#include <i18n.h> + + #include <analysis/type.h> @@ -39,6 +42,27 @@ /* Décrit le type fourni sous forme de caractères. */ static PyObject *py_data_type_to_str(PyObject *); +/* Fournit le groupe d'appartenance d'un type donné. */ +static PyObject *py_data_type_get_namespace(PyObject *, void *); + +/* Définit le groupe d'appartenance d'un type donné. */ +static int py_data_type_set_namespace(PyObject *, PyObject *, void *); + +/* Fournit les qualificatifs associés à une instance de type. */ +static PyObject *py_data_type_get_qualifiers(PyObject *, void *); + +/* Définit l'ensemble des qualificatifs d'une instance de type. */ +static int py_data_type_set_qualifiers(PyObject *, PyObject *, void *); + +/* Indique si le type est un pointeur. */ +static PyObject *py_data_type_is_pointer(PyObject *, void *); + +/* Indique si le type est une référence. */ +static PyObject *py_data_type_is_reference(PyObject *, void *); + +/* Définit les constantes pour les types de données. */ +static bool py_data_type_define_constants(PyTypeObject *); + /****************************************************************************** @@ -74,6 +98,237 @@ static PyObject *py_data_type_to_str(PyObject *self) /****************************************************************************** * * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Fournit le groupe d'appartenance d'un type donné. * +* * +* Retour : Eventuelle instance d'appartenance ou None. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_data_type_get_namespace(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GDataType *type; /* Elément à consulter */ + GDataType *ns; /* Espace de noms */ + + type = G_DATA_TYPE(pygobject_get(self)); + ns = g_data_type_get_namespace(type); + + if (ns != NULL) + { + result = pygobject_new(G_OBJECT(ns)); + g_object_unref(G_OBJECT(ns)); + } + + else + { + result = Py_None; + Py_INCREF(result); + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* value = valeur fournie à intégrer ou prendre en compte. * +* closure = non utilisé ici. * +* * +* Description : Définit le groupe d'appartenance d'un type donné. * +* * +* Retour : Bilan de l'opération pour Python. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static int py_data_type_set_namespace(PyObject *self, PyObject *value, void *closure) +{ + GDataType *type; /* Elément à traiter */ + GDataType *ns; /* Espace de noms */ + char *sep; /* Séparateur des espaces */ + + if ((!PyTuple_Check(value) || (PyTuple_Check(value) && PyTuple_Size(value) != 2)) && value != Py_None) + { + PyErr_SetString(PyExc_TypeError, + _("The attribute value must be a tuple with GDataType and a separator or None.")); + return -1; + } + + type = G_DATA_TYPE(pygobject_get(self)); + + if (value == Py_None) + g_data_type_set_namespace(type, NULL, NULL); + + else + { + if (!PyObject_IsInstance(PyTuple_GetItem(value, 0), (PyObject *)get_python_data_type_type())) + { + PyErr_SetString(PyExc_TypeError, _("The first tuple item must be a GDataType.")); + return -1; + } + + if (!PyUnicode_Check(PyTuple_GetItem(value, 1))) + { + PyErr_SetString(PyExc_TypeError, _("The second tuple item must be a string.")); + return -1; + } + + ns = G_DATA_TYPE(pygobject_get(PyTuple_GetItem(value, 0))); + sep = strdup(PyUnicode_DATA(pygobject_get(PyTuple_GetItem(value, 1)))); + + g_object_ref(G_OBJECT(ns)); + g_data_type_set_namespace(type, ns, sep); + + } + + return 0; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Fournit les qualificatifs associés à une instance de type. * +* * +* Retour : Qualificatifs éventuels. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_data_type_get_qualifiers(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GDataType *type; /* Elément à consulter */ + TypeQualifier qualifiers; /* Qualificatifs en place */ + + type = G_DATA_TYPE(pygobject_get(self)); + qualifiers = g_data_type_get_qualifiers(type); + + result = PyLong_FromUnsignedLong(qualifiers); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* value = valeur fournie à intégrer ou prendre en compte. * +* closure = non utilisé ici. * +* * +* Description : Définit l'ensemble des qualificatifs d'une instance de type. * +* * +* Retour : Bilan de l'opération pour Python. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static int py_data_type_set_qualifiers(PyObject *self, PyObject *value, void *closure) +{ + GDataType *type; /* Elément à traiter */ + unsigned long qualifiers; /* Qualificatifs à intégrer */ + + if (!PyLong_Check(value)) + { + PyErr_SetString(PyExc_TypeError, _("The attribute value must be a integer mask.")); + return -1; + } + + qualifiers = PyLong_AsUnsignedLong(value); + + if (qualifiers > TQF_ALL) + { + PyErr_SetString(PyExc_TypeError, _("Invalid value for type qualifiers.")); + return -1; + } + + type = G_DATA_TYPE(pygobject_get(self)); + + g_data_type_set_qualifiers(type, qualifiers); + + return 0; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Indique si le type est un pointeur. * +* * +* Retour : Bilan de la consultation. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_data_type_is_pointer(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GDataType *type; /* Elément à consulter */ + bool status; /* Etat à faire suivre */ + + type = G_DATA_TYPE(pygobject_get(self)); + + status = g_data_type_is_pointer(type); + + result = status ? Py_True : Py_False; + Py_INCREF(result); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Indique si le type est une référence. * +* * +* Retour : Bilan de la consultation. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_data_type_is_reference(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GDataType *type; /* Elément à consulter */ + bool status; /* Etat à faire suivre */ + + type = G_DATA_TYPE(pygobject_get(self)); + + status = g_data_type_is_reference(type); + + result = status ? Py_True : Py_False; + Py_INCREF(result); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : - * * * * Description : Fournit un accès à une définition de type à diffuser. * @@ -91,6 +346,22 @@ PyTypeObject *get_python_data_type_type(void) }; static PyGetSetDef py_data_type_getseters[] = { + { + "namespace", py_data_type_get_namespace, py_data_type_set_namespace, + "Namespace for the type, None if any.", NULL + }, + { + "qualifiers", py_data_type_get_qualifiers, py_data_type_set_qualifiers, + "Qualifiers linked to the type, TQF_NONE if any.", NULL + }, + { + "is_pointer", py_data_type_is_pointer, NULL, + "True if the type is a pointer.", NULL + }, + { + "is_reference", py_data_type_is_reference, NULL, + "True if the type is a reference.", NULL + }, { NULL } }; @@ -118,6 +389,36 @@ PyTypeObject *get_python_data_type_type(void) /****************************************************************************** * * +* Paramètres : obj_type = type dont le dictionnaire est à compléter. * +* * +* Description : Définit les constantes pour les types de données. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool py_data_type_define_constants(PyTypeObject *obj_type) +{ + bool result; /* Bilan à retourner */ + + result = true; + + result &= PyDict_AddIntMacro(obj_type, TQF_NONE); + result &= PyDict_AddIntMacro(obj_type, TQF_RESTRICT); + result &= PyDict_AddIntMacro(obj_type, TQF_VOLATILE); + result &= PyDict_AddIntMacro(obj_type, TQF_CONST); + + result &= PyDict_AddIntMacro(obj_type, TQF_ALL); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : module = module dont la définition est à compléter. * * * * Description : Prend en charge l'objet 'pychrysalide.analysis.DataType'. * @@ -140,6 +441,9 @@ bool register_python_data_type(PyObject *module) if (!register_class_for_pygobject(dict, G_TYPE_DATA_TYPE, py_data_type_type, &PyGObject_Type)) return false; + if (!py_data_type_define_constants(py_data_type_type)) + return false; + return true; } |