summaryrefslogtreecommitdiff
path: root/src/analysis/types/template.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-07-02 22:39:25 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-07-02 22:40:18 (GMT)
commitde2cb8e2fad4a3031d7b7c2cb189a6dbdaf8d5a9 (patch)
treeeb9b01fc893ace47e0311ebca7511162769c36be /src/analysis/types/template.c
parent4630eb7a2b0b61a4e9ea3a99e7a8cdaba05392cd (diff)
Extented the types definitions.
Diffstat (limited to 'src/analysis/types/template.c')
-rw-r--r--src/analysis/types/template.c264
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;
}