diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2018-07-02 22:39:25 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2018-07-02 22:40:18 (GMT) |
commit | de2cb8e2fad4a3031d7b7c2cb189a6dbdaf8d5a9 (patch) | |
tree | eb9b01fc893ace47e0311ebca7511162769c36be /src/analysis/types/template.c | |
parent | 4630eb7a2b0b61a4e9ea3a99e7a8cdaba05392cd (diff) |
Extented the types definitions.
Diffstat (limited to 'src/analysis/types/template.c')
-rw-r--r-- | src/analysis/types/template.c | 264 |
1 files changed, 172 insertions, 92 deletions
diff --git a/src/analysis/types/template.c b/src/analysis/types/template.c index 5e6e95f..5555985 100644 --- a/src/analysis/types/template.c +++ b/src/analysis/types/template.c @@ -24,11 +24,11 @@ #include "template.h" +#include <assert.h> #include <malloc.h> #include <string.h> -#include "cse-int.h" #include "../type-int.h" #include "../../common/extstr.h" @@ -37,17 +37,19 @@ /* Description de type reposant sur des gabarits (instance) */ struct _GTemplateType { - GClassEnumType parent; /* A laisser en premier */ + GDataType parent; /* A laisser en premier */ - GDataType **models; /* Sous-types associés */ - size_t models_count; /* Quantité de ces modèles */ + char *name; /* Désignation de la base */ + + GDataType **params; /* Sous-types associés */ + size_t count; /* Quantité de ces paramètres */ }; /* Description de type reposant sur des gabarits (classe) */ struct _GTemplateTypeClass { - GClassEnumTypeClass parent; /* A laisser en premier */ + GDataTypeClass parent; /* A laisser en premier */ }; @@ -58,19 +60,22 @@ static void g_template_type_class_init(GTemplateTypeClass *); /* Initialise l'instance d'un type reposant sur des gabarits. */ static void g_template_type_init(GTemplateType *); +/* Supprime toutes les références externes. */ +static void g_template_type_dispose(GTemplateType *); + +/* Procède à la libération totale de la mémoire. */ +static void g_template_type_finalize(GTemplateType *); + /* Crée un copie d'un type existant. */ static GDataType *g_template_type_dup(const GTemplateType *); /* Décrit le type fourni sous forme de caractères. */ -static char *g_template_type_to_string(const GTemplateType *); - -/* Procède à l'impression de la description d'un type. */ -//static void g_template_type_output(const GTemplateType *, GLangOutput *, GBufferLine *, bool, bool); +static char *g_template_type_to_string(const GTemplateType *, bool); /* Indique le type défini pour un type reposant sur des gabarits. */ -G_DEFINE_TYPE(GTemplateType, g_template_type, G_TYPE_CLASS_ENUM_TYPE); +G_DEFINE_TYPE(GTemplateType, g_template_type, G_TYPE_DATA_TYPE); /****************************************************************************** @@ -87,6 +92,18 @@ G_DEFINE_TYPE(GTemplateType, g_template_type, G_TYPE_CLASS_ENUM_TYPE); static void g_template_type_class_init(GTemplateTypeClass *klass) { + GObjectClass *object; /* Autre version de la classe */ + GDataTypeClass *type; /* Version parente et basique */ + + object = G_OBJECT_CLASS(klass); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_template_type_dispose; + object->finalize = (GObjectFinalizeFunc)g_template_type_finalize; + + type = G_DATA_TYPE_CLASS(klass); + + type->dup = (type_dup_fc)g_template_type_dup; + type->to_string = (type_to_string_fc)g_template_type_to_string; } @@ -105,26 +122,66 @@ static void g_template_type_class_init(GTemplateTypeClass *klass) static void g_template_type_init(GTemplateType *type) { - GDataType *data_type; /* Version basique */ - GClassEnumType *ce_type; /* Version basique #2 */ + type->name = NULL; + + type->params = NULL; + type->count = 0; + +} + + +/****************************************************************************** +* * +* Paramètres : type = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_template_type_dispose(GTemplateType *type) +{ + size_t i; /* Boucle de parcours */ + + for (i = 0; i < type->count; i++) + g_object_unref(G_OBJECT(type->params[i])); - data_type = G_DATA_TYPE(type); + G_OBJECT_CLASS(g_template_type_parent_class)->dispose(G_OBJECT(type)); - data_type->dup = (type_dup_fc)g_template_type_dup; - data_type->to_string = (type_to_string_fc)g_template_type_to_string; - //data_type->output = (output_type_fc)g_template_type_output; +} + + +/****************************************************************************** +* * +* Paramètres : type = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_template_type_finalize(GTemplateType *type) +{ + if (type->name != NULL) + free(type->name); - ce_type = G_CLASS_ENUM_TYPE(type); + if (type->params != NULL) + free(type->params); - ce_type->type = CET_CLASS; + G_OBJECT_CLASS(g_template_type_parent_class)->finalize(G_OBJECT(type)); } /****************************************************************************** * * -* Paramètres : name = désignation humaine du type. * -* list = élements du modèle sur lequel doit reposer le type. * +* Paramètres : - * * * * Description : Crée une représentation de type reposant sur des gabarits. * * * @@ -134,16 +191,12 @@ static void g_template_type_init(GTemplateType *type) * * ******************************************************************************/ -GDataType *g_template_type_new(const char *name, GSList *list) +GDataType *g_template_type_new(void) { GTemplateType *result; /* Structure à retourner */ result = g_object_new(G_TYPE_TEMPLATE_TYPE, NULL); - G_CLASS_ENUM_TYPE(result)->name = strdup(name); - - g_template_type_add_params(result, list); - return G_DATA_TYPE(result); } @@ -151,138 +204,152 @@ GDataType *g_template_type_new(const char *name, GSList *list) /****************************************************************************** * * -* Paramètres : type = type à dupliquer. * +* Paramètres : type = type base sur des gabarits à modifier. * * * -* Description : Crée un copie d'un type existant. * +* Description : Indique la désignation principale du type. * * * -* Retour : Nouvelle instance de type identique à celle fournie. * +* Retour : Désignation humaine du type. * * * * Remarques : - * * * ******************************************************************************/ -static GDataType *g_template_type_dup(const GTemplateType *type) +const char *g_template_type_get_name(GTemplateType *type) { - GDataType *result; /* Copie à retourner */ - GSList *list; /* Format de liste à fournir */ - size_t i; /* Boucle de parcours */ + char *result; /* Désignation à retourner */ - list = NULL; + result = type->name; - for (i = 0; i < type->models_count; i++) - list = g_slist_prepend(list, type->models[i]); + return result; - result = g_template_type_new(G_CLASS_ENUM_TYPE(type)->name, list); +} - return G_DATA_TYPE(result); + +/****************************************************************************** +* * +* Paramètres : type = type base sur des gabarits à modifier. * +* name = désignation humaine du type. * +* * +* Description : Précise la désignation principale du type. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_template_type_set_name(GTemplateType *type, char *name) +{ + if (type->name != NULL) + free(type->name); + + type->name = name; } /****************************************************************************** * * -* Paramètres : type = type à convertir. * +* Paramètres : type = type à dupliquer. * * * -* Description : Décrit le type fourni sous forme de caractères. * +* Description : Crée un copie d'un type existant. * * * -* Retour : Chaîne à libérer de la mémoire après usage. * +* Retour : Nouvelle instance de type identique à celle fournie. * * * * Remarques : - * * * ******************************************************************************/ -static char *g_template_type_to_string(const GTemplateType *type) +static GDataType *g_template_type_dup(const GTemplateType *type) { - char *result; /* Valeur à renvoyer */ + GTemplateType *result; /* Copie à retourner */ size_t i; /* Boucle de parcours */ - char *sub; /* Sous-type à décrire */ + GDataType *param; /* Paramètre copié */ - result = g_class_enum_type_to_string(G_CLASS_ENUM_TYPE(type)); + result = G_TEMPLATE_TYPE(g_template_type_new()); - result = stradd(result, "<"); + if (type->name != NULL) + g_template_type_set_name(result, strdup(type->name)); - for (i = 0; i < type->models_count; i++) + for (i = 0; i < type->count; i++) { - if (i > 0) result = stradd(result, ", "); - - sub = g_data_type_to_string(type->models[i]); - result = stradd(result, sub); - free(sub); - + param = g_data_type_dup(type->params[i]); + g_template_type_add_param(result, param); } - result = stradd(result, ">"); - - return result; + return G_DATA_TYPE(result); } /****************************************************************************** * * -* Paramètres : type = type à afficher. * -* lang = langage à utiliser pour la sortie humaine. * -* buffer = tampon mis à disposition pour la sortie. * -* info = nature du cadre de destination. * -* full = besoin de descriptions étendues ? * +* Paramètres : type = type à convertir. * +* include = doit-on inclure les espaces de noms ? * * * -* Description : Procède à l'impression de la description d'un type. * +* Description : Décrit le type fourni sous forme de caractères. * * * -* Retour : - * +* Retour : Chaîne à libérer de la mémoire après usage. * * * * Remarques : - * * * ******************************************************************************/ -#if 0 -static void g_template_type_output(const GTemplateType *type, GLangOutput *lang, GBufferLine *line, bool info, bool full) + +static char *g_template_type_to_string(const GTemplateType *type, bool include) { + char *result; /* Valeur à renvoyer */ size_t i; /* Boucle de parcours */ + char *param; /* Paramètre à décrire */ - g_class_enum_type_output(G_CLASS_ENUM_TYPE(type), lang, line, info, full); + if (type->name != NULL) + result = strdup(type->name); + else + result = NULL; - g_buffer_line_append_text(line, BLC_LAST_USED, "<", 1, info ? RTT_COMMENT : RTT_LTGT, NULL); + result = stradd(result, "<"); - for (i = 0; i < type->models_count; i++) + for (i = 0; i < type->count; i++) { - if (i > 0) - g_buffer_line_append_text(line, BLC_LAST_USED, ", ", 2, info ? RTT_COMMENT : RTT_SIGNS, NULL); + if (i > 0) result = stradd(result, ", "); - g_data_type_output(type->models[i], lang, line, info, full); + param = g_data_type_to_string(type->params[i], include); + if (param == NULL) goto error; + + result = stradd(result, param); + free(param); } - g_buffer_line_append_text(line, BLC_LAST_USED, ">", 1, info ? RTT_COMMENT : RTT_LTGT, NULL); + result = stradd(result, ">"); + + return result; + + error: + + free(result); + + return NULL; } -#endif /****************************************************************************** * * -* Paramètres : type = type à mettre à jour. * -* list = élements du modèle sur lequel doit reposer le type. * +* Paramètres : type = type à mettre à jour. * +* param = nouveau paramètre à intégrer au gabarit. * * * -* Description : Ajoute une série de paramètres à un gabarit. * +* Description : Ajoute un paramètre à un gabarit. * * * * Retour : - * * * -* Remarques : La liste doit contenir des éléments dans l'ordre inverse * -* d'apparition. De plus, elle est libérée dans cette fonction. * +* Remarques : - * * * ******************************************************************************/ -void g_template_type_add_params(GTemplateType *type, GSList *list) +void g_template_type_add_param(GTemplateType *type, GDataType *param) { - GSList *iter; /* Boucle de parcours */ - - list = g_slist_reverse(list); - for (iter = list; iter != NULL; iter = g_slist_next(iter)) - { - type->models = (GDataType **)realloc(type->models, - ++type->models_count * sizeof(GDataType *)); - type->models[type->models_count - 1] = G_DATA_TYPE(iter->data); - } - g_slist_free(list); + type->params = (GDataType **)realloc(type->params, ++type->count * sizeof(GDataType *)); + type->params[type->count - 1] = param; } @@ -291,7 +358,7 @@ void g_template_type_add_params(GTemplateType *type, GSList *list) * * * Paramètres : type = type à consulter. * * * -* Description : Indique le nombre de paramètres associés du gabarit. * +* Description : Indique le nombre de paramètres associés au gabarit. * * * * Retour : Nombre de paramètres inclus dans le gabarit. * * * @@ -299,9 +366,9 @@ void g_template_type_add_params(GTemplateType *type, GSList *list) * * ******************************************************************************/ -size_t g_template_type_count_param(const GTemplateType *type) +size_t g_template_type_count_params(const GTemplateType *type) { - return type->models_count; + return type->count; } @@ -321,6 +388,19 @@ size_t g_template_type_count_param(const GTemplateType *type) GDataType *g_template_type_get_param(const GTemplateType *type, size_t index) { - return (index < type->models_count ? type->models[index] : NULL); + GDataType *result; /* Paramètre à retourner */ + + assert(index < type->count); + + if (index < type->count) + { + result = type->params[index]; + g_object_ref(G_OBJECT(result)); + } + + else + result = NULL; + + return result; } |