diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2010-05-13 12:32:03 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2010-05-13 12:32:03 (GMT) |
commit | 118a668adbf6ca9d4c549618e54f58330f46ce58 (patch) | |
tree | 10e75f1a7e83ab48aba82a5a595441a065a6037e /src/format/mangling/demangler.c | |
parent | e56b4db3aae87f0458319019635dea4968a5c529 (diff) |
Supported Dalvik VM / DEX (partially).
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@155 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format/mangling/demangler.c')
-rw-r--r-- | src/format/mangling/demangler.c | 99 |
1 files changed, 61 insertions, 38 deletions
diff --git a/src/format/mangling/demangler.c b/src/format/mangling/demangler.c index e8b6b0f..47ffd36 100644 --- a/src/format/mangling/demangler.c +++ b/src/format/mangling/demangler.c @@ -29,79 +29,90 @@ #include "demangler-int.h" #include "itanium.h" +#include "java.h" -static name_demangler **demanglers = NULL; -static size_t demanglers_count = 0; +/* 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 *); -/* Enregistre un nouveau décodeur de noms. */ -void register_new_demangler(name_demangler *); +/* 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; -/****************************************************************************** -* * -* 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()); +/* Liste des décodeurs */ +static demangling_properties demanglers[DGT_COUNT] = { - return true; + [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 : demangler = décodeur opérationnel. * +* Paramètres : type = identifiant du décodeur visé. * * * -* Description : Enregistre un nouveau décodeur de noms. * +* Description : Fournit la référence correspondant à un décodeur donné. * * * -* Retour : - * +* Retour : Adresse du décodeur trouvé ou NULL. * * * * Remarques : - * * * ******************************************************************************/ -void register_new_demangler(name_demangler *demangler) +name_demangler *get_demangler_by_type(DemanglerType type) { - demanglers = (name_demangler **)realloc(demanglers, ++demanglers_count * sizeof(name_demangler *)); - demanglers[demanglers_count - 1] = demangler; + name_demangler *result; /* Adresse à retourner */ + + result = NULL;//demanglers[0]; + + return result; } /****************************************************************************** * * -* Paramètres : type = identifiant du décodeur visé. * +* Paramètres : demangler = décodeur à utiliser. * +* name = chaîne de caractères à décoder. * * * -* Description : Fournit la référence correspondant à un décodeur donné. * +* Description : Tente de décoder une chaîne de caractères donnée. * * * -* Retour : Adresse du décodeur trouvé ou NULL. * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -name_demangler *get_demangler_by_type(DemanglerType type) +GBinRoutine *try_to_demangle_routine(name_demangler *demangler, const char *name) { - name_demangler *result; /* Adresse à retourner */ - - result = demanglers[0]; + GBinRoutine *result; /* Construction à remonter */ + result = NULL; + /* + if (demangler->can_be_demangled(demangler, name)) + result = demangler->demangle_routine(demangler, name); + */ return result; } @@ -109,8 +120,8 @@ name_demangler *get_demangler_by_type(DemanglerType type) /****************************************************************************** * * -* Paramètres : demangler = décodeur à utiliser. * -* name = chaîne de caractères à décoder. * +* 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. * * * @@ -120,14 +131,26 @@ name_demangler *get_demangler_by_type(DemanglerType type) * * ******************************************************************************/ -GBinRoutine *try_to_demangle_routine(name_demangler *demangler, const char *name) +GOpenidaType *demangle_type(DemanglerType type, const char *desc) { - GBinRoutine *result; /* Construction à remonter */ + 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; |