summaryrefslogtreecommitdiff
path: root/src/analysis/type.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/type.c')
-rw-r--r--src/analysis/type.c295
1 files changed, 246 insertions, 49 deletions
diff --git a/src/analysis/type.c b/src/analysis/type.c
index 350b4e2..a5cc46c 100644
--- a/src/analysis/type.c
+++ b/src/analysis/type.c
@@ -29,6 +29,7 @@
#include "type-int.h"
+#include "storage/serialize.h"
#include "../common/extstr.h"
@@ -39,16 +40,32 @@ static void g_data_type_class_init(GDataTypeClass *);
/* Initialise l'instance d'un type quelconque. */
static void g_data_type_init(GDataType *);
+/* Procède à l'initialisation de l'interface de sérialisation. */
+static void g_serializable_object_interface_init(GSerializableObjectIface *);
+
/* Supprime toutes les références externes. */
static void g_data_type_dispose(GDataType *);
/* Procède à la libération totale de la mémoire. */
static void g_data_type_finalize(GDataType *);
+/* Charge un objet depuis une mémoire tampon. */
+static bool _g_data_type_load(GDataType *, GObjectStorage *, packed_buffer *);
+
+/* Charge un objet depuis une mémoire tampon. */
+static bool g_data_type_load(GDataType *, GObjectStorage *, packed_buffer *);
+
+/* Sauvegarde un objet dans une mémoire tampon. */
+static bool _g_data_type_store(const GDataType *, GObjectStorage *, packed_buffer *);
+
+/* Sauvegarde un objet dans une mémoire tampon. */
+static bool g_data_type_store(const GDataType *, GObjectStorage *, packed_buffer *);
+
/* Indique le type défini pour un type quelconque. */
-G_DEFINE_TYPE(GDataType, g_data_type, G_TYPE_OBJECT);
+G_DEFINE_TYPE_WITH_CODE(GDataType, g_data_type, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE(G_TYPE_SERIALIZABLE_OBJECT, g_serializable_object_interface_init));
/******************************************************************************
@@ -72,6 +89,9 @@ static void g_data_type_class_init(GDataTypeClass *klass)
object->dispose = (GObjectFinalizeFunc/* ! */)g_data_type_dispose;
object->finalize = (GObjectFinalizeFunc)g_data_type_finalize;
+ klass->load = (type_load_fc)_g_data_type_load;
+ klass->store = (type_store_fc)_g_data_type_store;
+
}
@@ -89,6 +109,30 @@ static void g_data_type_class_init(GDataTypeClass *klass)
static void g_data_type_init(GDataType *type)
{
+ g_data_type_set_qualifiers(type, TQF_NONE);
+
+ type->namespace = NULL;
+ type->ns_sep = NULL;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : iface = interface GLib à initialiser. *
+* *
+* Description : Procède à l'initialisation de l'interface de sérialisation. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_serializable_object_interface_init(GSerializableObjectIface *iface)
+{
+ iface->load = (load_serializable_object_cb)g_data_type_load;
+ iface->store = (store_serializable_object_cb)g_data_type_store;
}
@@ -138,6 +182,159 @@ static void g_data_type_finalize(GDataType *type)
/******************************************************************************
* *
+* Paramètres : type = type de données à constuire. *
+* storage = conservateur de données à manipuler ou NULL. *
+* pbuf = zone tampon à remplir. *
+* *
+* Description : Charge un objet depuis une mémoire tampon. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool _g_data_type_load(GDataType *type, GObjectStorage *storage, packed_buffer *pbuf)
+{
+ bool result; /* Bilan à retourner */
+ uint8_t has_ns; /* Association d'un espace ? */
+ uleb128_t value; /* Valeur ULEB128 à charger */
+
+ result = unpack_uleb128(&value, pbuf);
+ if (!result) goto exit;
+
+ g_data_type_set_qualifiers(type, value);
+
+ result = extract_packed_buffer(pbuf, &has_ns, sizeof(uint8_t), false);
+ if (!result) goto exit;
+
+ if (has_ns == 0x01)
+ {
+ result = g_data_type_load(type->namespace, storage, pbuf);
+ if (!result) goto exit;
+
+ result = unpack_uleb128(&value, pbuf);
+ if (!result) goto exit;
+
+ type->ns_sep = calloc(value, sizeof(char));
+ result = extract_packed_buffer(pbuf, type->ns_sep, value, false);
+
+ }
+
+ exit:
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : type = type de données à constuire. *
+* storage = conservateur de données à manipuler ou NULL. *
+* pbuf = zone tampon à remplir. *
+* *
+* Description : Charge un objet depuis une mémoire tampon. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool g_data_type_load(GDataType *type, GObjectStorage *storage, packed_buffer *pbuf)
+{
+ bool result; /* Bilan à retourner */
+ GDataTypeClass *class; /* Classe du type */
+
+ class = G_DATA_TYPE_GET_CLASS(type);
+
+ result = class->load(type, storage, pbuf);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : type = type de données à consulter. *
+* storage = conservateur de données à manipuler ou NULL. *
+* pbuf = zone tampon à remplir. *
+* *
+* Description : Sauvegarde un objet dans une mémoire tampon. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool _g_data_type_store(const GDataType *type, GObjectStorage *storage, packed_buffer *pbuf)
+{
+ bool result; /* Bilan à retourner */
+ uint8_t has_ns; /* Association d'un espace ? */
+ size_t ns_sep_len; /* Taille du séparateur */
+
+ result = pack_uleb128((uleb128_t []){ g_data_type_get_qualifiers(type) }, pbuf);
+ if (!result) goto exit;
+
+ has_ns = (type->namespace != NULL ? 0x01 : 0x00);
+
+ result = extend_packed_buffer(pbuf, &has_ns, sizeof(uint8_t), false);
+ if (!result) goto exit;
+
+ if (type->namespace != NULL)
+ {
+ result = g_data_type_store(type->namespace, storage, pbuf);
+ if (!result) goto exit;
+
+ ns_sep_len = strlen(type->ns_sep);
+
+ result = pack_uleb128((uleb128_t []){ ns_sep_len }, pbuf);
+ if (!result) goto exit;
+
+ result = extend_packed_buffer(pbuf, type->ns_sep, ns_sep_len, false);
+
+ }
+
+ exit:
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : type = type de données à consulter. *
+* storage = conservateur de données à manipuler ou NULL. *
+* pbuf = zone tampon à remplir. *
+* *
+* Description : Sauvegarde un objet dans une mémoire tampon. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool g_data_type_store(const GDataType *type, GObjectStorage *storage, packed_buffer *pbuf)
+{
+ bool result; /* Bilan à retourner */
+ GDataTypeClass *class; /* Classe du type */
+
+ class = G_DATA_TYPE_GET_CLASS(type);
+
+ result = class->store(type, storage, pbuf);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : type = type à consulter. *
* *
* Description : Calcule une empreinte pour un type de données. *
@@ -259,11 +456,10 @@ char *g_data_type_to_string(const GDataType *type, bool include)
/******************************************************************************
* *
-* Paramètres : type = type à mettre à jour. *
-* namespace = instance d'appartenance. *
-* sep = séparateur à utiliser entre les éléments. *
+* Paramètres : type = instance à mettre à jour. *
+* qualifiers = nouveaux qualificatifs pour la variable. *
* *
-* Description : Définit le groupe d'appartenance d'un type donné. *
+* Description : Définit l'ensemble des qualificatifs d'une instance de type. *
* *
* Retour : - *
* *
@@ -271,63 +467,50 @@ char *g_data_type_to_string(const GDataType *type, bool include)
* *
******************************************************************************/
-void g_data_type_set_namespace(GDataType *type, GDataType *namespace, char *sep)
+void g_data_type_set_qualifiers(GDataType *type, TypeQualifier qualifiers)
{
- if (type->namespace != NULL)
- g_object_unref(G_OBJECT(type->namespace));
-
- if (type->ns_sep != NULL)
- free(type->ns_sep);
-
- type->namespace = namespace;
- type->ns_sep = sep;
+ type->qualifiers = qualifiers;
}
/******************************************************************************
* *
-* Paramètres : type = type à consulter. *
+* Paramètres : type = instance à mettre à jour. *
+* qualifier = nouveau qualificatif pour la variable. *
* *
-* Description : Fournit le groupe d'appartenance d'un type donné. *
+* Description : Ajoute un qualificatif à une instance de type. *
* *
-* Retour : Eventuelle instance d'appartenance ou NULL. *
+* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
-GDataType *g_data_type_get_namespace(const GDataType *type)
+void g_data_type_add_qualifier(GDataType *type, TypeQualifier qualifier)
{
- GDataType *result; /* Espace à renvoyer */
-
- result = type->namespace;
-
- if (result != NULL)
- g_object_ref(G_OBJECT(result));
-
- return result;
+ type->qualifiers |= qualifier;
}
/******************************************************************************
* *
-* Paramètres : type = type à consulter. *
+* Paramètres : type = instance à consulter. *
* *
-* Description : Fournit la chaîne de séparation entre deux entités. *
+* Description : Fournit les qualificatifs associés à une instance de type. *
* *
-* Retour : Eventuelle chaîne de séparation ou NULL. *
+* Retour : Qualificatifs éventuels. *
* *
* Remarques : - *
* *
******************************************************************************/
-const char *g_data_type_get_namespace_separator(const GDataType *type)
+TypeQualifier g_data_type_get_qualifiers(const GDataType *type)
{
- char *result; /* Séparateur à retourner */
+ TypeQualifier result; /* Qualificatifs à renvoyer */
- result = type->ns_sep;
+ result = type->qualifiers;
return result;
@@ -336,10 +519,11 @@ const char *g_data_type_get_namespace_separator(const GDataType *type)
/******************************************************************************
* *
-* Paramètres : type = instance à mettre à jour. *
-* qualifiers = nouveaux qualificatifs pour la variable. *
+* Paramètres : type = type à mettre à jour. *
+* namespace = instance d'appartenance. *
+* sep = séparateur à utiliser entre les éléments. *
* *
-* Description : Définit l'ensemble des qualificatifs d'une instance de type. *
+* Description : Définit le groupe d'appartenance d'un type donné. *
* *
* Retour : - *
* *
@@ -347,50 +531,63 @@ const char *g_data_type_get_namespace_separator(const GDataType *type)
* *
******************************************************************************/
-void g_data_type_set_qualifiers(GDataType *type, TypeQualifier qualifiers)
+void g_data_type_set_namespace(GDataType *type, GDataType *namespace, char *sep)
{
- type->qualifiers = qualifiers;
+ if (type->namespace != NULL)
+ g_object_unref(G_OBJECT(type->namespace));
+
+ if (type->ns_sep != NULL)
+ free(type->ns_sep);
+
+ type->namespace = namespace;
+ type->ns_sep = sep;
}
/******************************************************************************
* *
-* Paramètres : type = instance à mettre à jour. *
-* qualifier = nouveau qualificatif pour la variable. *
+* Paramètres : type = type à consulter. *
* *
-* Description : Ajoute un qualificatif à une instance de type. *
+* Description : Fournit le groupe d'appartenance d'un type donné. *
* *
-* Retour : - *
+* Retour : Eventuelle instance d'appartenance ou NULL. *
* *
* Remarques : - *
* *
******************************************************************************/
-void g_data_type_add_qualifier(GDataType *type, TypeQualifier qualifier)
+GDataType *g_data_type_get_namespace(const GDataType *type)
{
- type->qualifiers |= qualifier;
+ GDataType *result; /* Espace à renvoyer */
+
+ result = type->namespace;
+
+ if (result != NULL)
+ g_object_ref(G_OBJECT(result));
+
+ return result;
}
/******************************************************************************
* *
-* Paramètres : type = instance à consulter. *
+* Paramètres : type = type à consulter. *
* *
-* Description : Fournit les qualificatifs associés à une instance de type. *
+* Description : Fournit la chaîne de séparation entre deux entités. *
* *
-* Retour : Qualificatifs éventuels. *
+* Retour : Eventuelle chaîne de séparation ou NULL. *
* *
* Remarques : - *
* *
******************************************************************************/
-TypeQualifier g_data_type_get_qualifiers(const GDataType *type)
+const char *g_data_type_get_namespace_separator(const GDataType *type)
{
- TypeQualifier result; /* Qualificatifs à renvoyer */
+ char *result; /* Séparateur à retourner */
- result = type->qualifiers;
+ result = type->ns_sep;
return result;