diff options
Diffstat (limited to 'src/analysis/type.c')
-rw-r--r-- | src/analysis/type.c | 295 |
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; |