summaryrefslogtreecommitdiff
path: root/plugins/pychrysalide/analysis/type.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/pychrysalide/analysis/type.c')
-rw-r--r--plugins/pychrysalide/analysis/type.c304
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;
}