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/cse.c | |
parent | 4630eb7a2b0b61a4e9ea3a99e7a8cdaba05392cd (diff) |
Extented the types definitions.
Diffstat (limited to 'src/analysis/types/cse.c')
-rw-r--r-- | src/analysis/types/cse.c | 167 |
1 files changed, 145 insertions, 22 deletions
diff --git a/src/analysis/types/cse.c b/src/analysis/types/cse.c index f20f340..a543630 100644 --- a/src/analysis/types/cse.c +++ b/src/analysis/types/cse.c @@ -24,22 +24,50 @@ #include "cse.h" +#include <malloc.h> #include <string.h> -#include "cse-int.h" +#include "../type-int.h" +/* Description de type classe/structure et énumération (instance) */ +struct _GClassEnumType +{ + GDataType parent; /* A laisser en premier */ + + ClassEnumType type; /* Type représenté si connu */ + char *name; /* Description humaine */ + +}; + +/* Description de type classe/structure et énumération (classe) */ +struct _GClassEnumTypeClass +{ + GDataTypeClass parent; /* A laisser en premier */ + +}; + + /* Initialise la classe des types classe ou assimilés. */ static void g_class_enum_type_class_init(GClassEnumTypeClass *); /* Initialise l'instance d'un type classe ou assimilé. */ static void g_class_enum_type_init(GClassEnumType *); +/* Supprime toutes les références externes. */ +static void g_class_enum_type_dispose(GClassEnumType *); + +/* Procède à la libération totale de la mémoire. */ +static void g_class_enum_type_finalize(GClassEnumType *); + /* Crée un copie d'un type existant. */ static GDataType *g_class_enum_type_dup(const GClassEnumType *); +/* Décrit le type fourni sous forme de caractères. */ +static char *g_class_enum_type_to_string(const GClassEnumType *, bool); + /* Indique le type défini pour un type classe ou assimilé. */ @@ -60,6 +88,18 @@ G_DEFINE_TYPE(GClassEnumType, g_class_enum_type, G_TYPE_DATA_TYPE); static void g_class_enum_type_class_init(GClassEnumTypeClass *klass) { + GObjectClass *object; /* Autre version de la classe */ + GDataTypeClass *type; /* Version parente et basique */ + + object = G_OBJECT_CLASS(klass); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_class_enum_type_dispose; + object->finalize = (GObjectFinalizeFunc)g_class_enum_type_finalize; + + type = G_DATA_TYPE_CLASS(klass); + + type->dup = (type_dup_fc)g_class_enum_type_dup; + type->to_string = (type_to_string_fc)g_class_enum_type_to_string; } @@ -78,13 +118,49 @@ static void g_class_enum_type_class_init(GClassEnumTypeClass *klass) static void g_class_enum_type_init(GClassEnumType *type) { - GDataType *data_type; /* Version basique */ + type->type = CET_COUNT; + type->name = NULL; + +} + + +/****************************************************************************** +* * +* Paramètres : type = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_class_enum_type_dispose(GClassEnumType *type) +{ + G_OBJECT_CLASS(g_class_enum_type_parent_class)->dispose(G_OBJECT(type)); + +} + + +/****************************************************************************** +* * +* Paramètres : type = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ - data_type = G_DATA_TYPE(type); +static void g_class_enum_type_finalize(GClassEnumType *type) +{ + if (type->name != NULL) + free(type->name); - data_type->dup = (type_dup_fc)g_class_enum_type_dup; - data_type->to_string = (type_to_string_fc)g_class_enum_type_to_string; - //data_type->output = (output_type_fc)g_class_enum_type_output; + G_OBJECT_CLASS(g_class_enum_type_parent_class)->finalize(G_OBJECT(type)); } @@ -130,14 +206,22 @@ GDataType *g_class_enum_type_new(ClassEnumType type, char *name) static GDataType *g_class_enum_type_dup(const GClassEnumType *type) { - return g_class_enum_type_new(type->type, type->name); + GDataType *result; /* Copie à retourner */ + char *name; /* Nouveau nom copié */ + + name = (type->name != NULL ? strdup(type->name) : NULL); + + result = g_class_enum_type_new(type->type, name); + + return result; } /****************************************************************************** * * -* Paramètres : type = type à convertir. * +* Paramètres : type = type à convertir. * +* include = doit-on inclure les espaces de noms ? * * * * Description : Décrit le type fourni sous forme de caractères. * * * @@ -147,33 +231,72 @@ static GDataType *g_class_enum_type_dup(const GClassEnumType *type) * * ******************************************************************************/ -char *g_class_enum_type_to_string(const GClassEnumType *type) +static char *g_class_enum_type_to_string(const GClassEnumType *type, bool include) { - return strdup(type->name); + char *result; /* Valeur à renvoyer */ + + switch (type->type) + { + case CET_VIRTUAL_TABLE: + result = strdup("vtable"); + break; + + case CET_VIRTUAL_STRUCT: + result = strdup("vstruct"); + break; + + default: + result = (type->name != NULL ? strdup(type->name) : NULL); + break; + + } + + return 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 à consulter. * * * -* Description : Procède à l'impression de la description d'un type. * +* Description : Fournit le type pris en compte géré par le type. * * * -* Retour : - * +* Retour : Type pris en compte. * +* * +* Remarques : - * +* * +******************************************************************************/ + +ClassEnumType g_class_enum_type_get_base(const GClassEnumType *type) +{ + ClassEnumType result; /* Type de base à renvoyer */ + + result = type->type; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : type = type à consulter. * +* * +* Description : Donne la désignation de la classe / structure / énumération. * +* * +* Retour : Chaîne de caractères. * * * * Remarques : - * * * ******************************************************************************/ -#if 0 -void g_class_enum_type_output(const GClassEnumType *type, GLangOutput *lang, GBufferLine *line, bool info, bool full) + +const char *g_class_enum_type_get_name(const GClassEnumType *type) { - g_buffer_line_append_text(line, BLC_LAST_USED, type->name, strlen(type->name), - info ? RTT_COMMENT : RTT_RAW, NULL); + char *result; /* Valeur à renvoyer */ + + result = type->name; + + return result; } -#endif |