/* OpenIDA - Outil d'analyse de fichiers binaires
* demangler.c - décodage des noms d'éléments
*
* Copyright (C) 2008 Cyrille Bagard
*
* This file is part of OpenIDA.
*
* 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 "demangler.h"
#include
#include "demangler-int.h"
#include "itanium.h"
#include "java.h"
/* Prépare de quoi effectuer un décodage. */
typedef GDemanglingContext * (* create_context_fc) (void);
/* Procède au décodage d'une chaîne de caractères. */
typedef bool (* demangle_type_fc) (GDemanglingContext *, const char *);
/* Appels liés à un décodeur */
typedef struct _demangling_properties
{
create_context_fc create_context; /* Création de contextes */
demangle_type_fc demangle_type; /* Décodage d'un type */
} demangling_properties;
/* Liste des décodeurs */
static demangling_properties demanglers[DGT_COUNT] = {
[DGT_ITANIUM] = {
.create_context = (create_context_fc)NULL,
.demangle_type = (demangle_type_fc)NULL
},
[DGT_JAVA] = {
.create_context = (create_context_fc)g_java_dcontext_new,
.demangle_type = (demangle_type_fc)demangle_java_type
}
};
/******************************************************************************
* *
* Paramètres : type = identifiant du décodeur visé. *
* *
* Description : Fournit la référence correspondant à un décodeur donné. *
* *
* Retour : Adresse du décodeur trouvé ou NULL. *
* *
* Remarques : - *
* *
******************************************************************************/
name_demangler *get_demangler_by_type(DemanglerType type)
{
name_demangler *result; /* Adresse à retourner */
result = NULL;//demanglers[0];
return result;
}
/******************************************************************************
* *
* Paramètres : demangler = décodeur à utiliser. *
* name = chaîne de caractères à décoder. *
* *
* Description : Tente de décoder une chaîne de caractères donnée. *
* *
* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
GBinRoutine *try_to_demangle_routine(name_demangler *demangler, const char *name)
{
GBinRoutine *result; /* Construction à remonter */
result = NULL;
/*
if (demangler->can_be_demangled(demangler, name))
result = demangler->demangle_routine(demangler, name);
*/
return result;
}
/******************************************************************************
* *
* Paramètres : type = type de décodeur à utiliser. *
* desc = chaîne de caractères à décoder. *
* *
* Description : Tente de décoder une chaîne de caractères donnée. *
* *
* Retour : Bilan de l'opération. *
* *
* Remarques : - *
* *
******************************************************************************/
GOpenidaType *demangle_type(DemanglerType type, const char *desc)
{
GOpenidaType *result; /* Construction à remonter */
GDemanglingContext *context; /* Contexte pour le décodage */
result = NULL;
/*
if (demangler->can_be_demangled(demangler, name))
result = demangler->demangle_routine(demangler, name);
*/
context = demanglers[type].create_context();
if (demanglers[type].demangle_type(context, desc))
{
result = g_demangling_context_get_decoded_type(context);
g_object_ref(result);
}
g_object_unref(context);
return result;
}