/* Chrysalide - Outil d'analyse de fichiers binaires * basic.c - manipulation des types de données de base * * Copyright (C) 2012 Cyrille Bagard * * This file is part of Chrysalide. * * OpenIDA is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * OpenIDA is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see . */ #include "basic.h" #include #include #include "../type-int.h" /* Description de type basique (instance) */ struct _GBasicType { GDataType parent; /* A laisser en premier */ BaseType type; /* Type représenté si connu */ }; /* Description de type basique (classe) */ struct _GBasicTypeClass { GDataTypeClass parent; /* A laisser en premier */ }; /* Initialise la classe des types basiques. */ static void g_basic_type_class_init(GBasicTypeClass *); /* Initialise l'instance d'un type basique. */ static void g_basic_type_init(GBasicType *); /* Crée un copie d'un type existant. */ static GDataType *g_basic_type_dup(const GBasicType *); /* Décrit le type fourni sous forme de caractères. */ static char *g_basic_type_to_string(const GBasicType *); /* Procède à l'impression de la description d'un type. */ static void g_basic_type_output(const GBasicType *, GLangOutput *, GBufferLine *, bool, bool); /* Indique le type défini pour un type basique. */ G_DEFINE_TYPE(GBasicType, g_basic_type, G_TYPE_DATA_TYPE); /****************************************************************************** * * * Paramètres : klass = classe à initialiser. * * * * Description : Initialise la classe des types basiques. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_basic_type_class_init(GBasicTypeClass *klass) { } /****************************************************************************** * * * Paramètres : type = instance à initialiser. * * * * Description : Initialise l'instance d'un type basique. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_basic_type_init(GBasicType *type) { GDataType *data_type; /* Version basique */ data_type = G_DATA_TYPE(type); data_type->dup = (type_dup_fc)g_basic_type_dup; data_type->to_string = (type_to_string_fc)g_basic_type_to_string; data_type->output = (output_type_fc)g_basic_type_output; } /****************************************************************************** * * * Paramètres : type = type simple à représenter. * * * * Description : Crée une représentation de type basique. * * * * Retour : Adresse de la structure mise en place. * * * * Remarques : - * * * ******************************************************************************/ GDataType *g_basic_type_new(BaseType type) { GBasicType *result; /* Structure à retourner */ result = g_object_new(G_TYPE_BASIC_TYPE, NULL); result->type = type; return G_DATA_TYPE(result); } /****************************************************************************** * * * Paramètres : type = type à dupliquer. * * * * Description : Crée un copie d'un type existant. * * * * Retour : Nouvelle instance de type identique à celle fournie. * * * * Remarques : - * * * ******************************************************************************/ static GDataType *g_basic_type_dup(const GBasicType *type) { return g_basic_type_new(type->type); } /****************************************************************************** * * * Paramètres : type = type à convertir. * * * * Description : Décrit le type fourni sous forme de caractères. * * * * Retour : Chaîne à libérer de la mémoire après usage. * * * * Remarques : - * * * ******************************************************************************/ static char *g_basic_type_to_string(const GBasicType *type) { const char *desc; /* Représentation à copier */ switch (type->type) { case BTP_VOID: desc = "void"; break; case BTP_WCHAR_T: desc = "wchar_t"; break; case BTP_BOOL: desc = "bool"; break; case BTP_CHAR: desc = "char"; break; case BTP_SCHAR: desc = "signed char"; break; case BTP_UCHAR: desc = "unsigned char"; break; case BTP_SHORT: desc = "short"; break; case BTP_USHORT: desc = "unsigned short"; break; case BTP_INT: desc = "int"; break; case BTP_UINT: desc = "unsigned int"; break; case BTP_LONG: desc = "long"; break; case BTP_ULONG: desc = "unsigned long"; break; case BTP_LONG_LONG: desc = "long long"; break; case BTP_ULONG_LONG: desc = "unsigned long long"; break; case BTP_INT128: desc = "__int128"; break; case BTP_UINT128: desc = "unsigned __int128"; break; case BTP_FLOAT: desc = "float"; break; case BTP_DOUBLE: desc = "double"; break; case BTP_LONG_DOUBLE: desc = "long double"; break; case BTP_FLOAT128: desc = "__float128"; break; case BTP_ELLIPSIS: desc = "..."; break; case BTP_754R_64: desc = "__float754r_64"; break; case BTP_754R_128: desc = "__float754r_128"; break; case BTP_754R_32: desc = "__float754r_32"; break; case BTP_754R_16: desc = "__float754r_16"; break; case BTP_CHAR32_T: desc = "char32_t"; break; case BTP_CHAR16_T: desc = "char16_t"; break; default: case BTP_OTHER: desc = "user"; break; } return strdup(desc); } /****************************************************************************** * * * 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 ? * * * * Description : Procède à l'impression de la description d'un type. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_basic_type_output(const GBasicType *type, GLangOutput *lang, GBufferLine *line, bool info, bool full) { char *text; /* Version humaine à imprimer */ size_t len; /* Taille de cette version */ text = g_basic_type_to_string(type); len = strlen(text); g_buffer_line_append_text(line, BLC_LAST_USED, text, len, info ? RTT_COMMENT : RTT_RAW, NULL); free(text); } /****************************************************************************** * * * Paramètres : type = type à consulter. * * * * Description : Fournit le type de base géré par le type. * * * * Retour : Type basique. * * * * Remarques : - * * * ******************************************************************************/ BaseType g_basic_type_get_btype(const GBasicType *type) { return type->type; }