/* 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"
static name_demangler **demanglers = NULL;
static size_t demanglers_count = 0;
/* Enregistre un nouveau décodeur de noms. */
void register_new_demangler(name_demangler *);
/******************************************************************************
* *
* Paramètres : - *
* *
* Description : Procède au chargement des différents décodeurs de noms. *
* *
* Retour : true pour indiquer un chargement réussi, false sinon. *
* *
* Remarques : - *
* *
******************************************************************************/
bool init_all_demanglers(void)
{
register_new_demangler(create_itanium_demangler());
return true;
}
/******************************************************************************
* *
* Paramètres : demangler = décodeur opérationnel. *
* *
* Description : Enregistre un nouveau décodeur de noms. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void register_new_demangler(name_demangler *demangler)
{
demanglers = (name_demangler **)realloc(demanglers, ++demanglers_count * sizeof(name_demangler *));
demanglers[demanglers_count - 1] = demangler;
}
/******************************************************************************
* *
* 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 = 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;
}