diff options
Diffstat (limited to 'src/format/mangling/demangler.c')
-rw-r--r-- | src/format/mangling/demangler.c | 84 |
1 files changed, 48 insertions, 36 deletions
diff --git a/src/format/mangling/demangler.c b/src/format/mangling/demangler.c index de9fbbb..dec4cb5 100644 --- a/src/format/mangling/demangler.c +++ b/src/format/mangling/demangler.c @@ -25,29 +25,34 @@ #include <malloc.h> +#include <string.h> -#include "demangler-int.h" #include "itanium.h" #include "java.h" +/* Indique si une chaîne peut être traitée par le décodeur. */ +typedef bool (* can_be_demangled_fc) (const char *); + /* 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 *); +typedef bool (* demangle_fc) (GDemanglingContext *, const char *); /* Appels liés à un décodeur */ typedef struct _demangling_properties { + can_be_demangled_fc can_demangle; /* Possibilité de traitement */ + create_context_fc create_context; /* Création de contextes */ - demangle_type_fc demangle_routine; /* Décodage d'une routine */ - demangle_type_fc demangle_type; /* Décodage d'un type */ + demangle_fc demangle_routine; /* Décodage d'une routine */ + demangle_fc demangle_type; /* Décodage d'un type */ } demangling_properties; @@ -56,15 +61,17 @@ typedef struct _demangling_properties static demangling_properties demanglers[DGT_COUNT] = { [DGT_ITANIUM] = { + .can_demangle = (can_be_demangled_fc)can_be_itanium_demangled, .create_context = (create_context_fc)g_itanium_dcontext_new, - .demangle_routine = (demangle_type_fc)demangle_itanium_routine, - .demangle_type = (demangle_type_fc)NULL + .demangle_routine = (demangle_fc)demangle_itanium_routine, + .demangle_type = (demangle_fc)NULL }, [DGT_JAVA] = { + .can_demangle = (can_be_demangled_fc)NULL, .create_context = (create_context_fc)g_java_dcontext_new, - .demangle_routine = (demangle_type_fc)NULL, - .demangle_type = (demangle_type_fc)demangle_java_type + .demangle_routine = (demangle_fc)NULL, + .demangle_type = (demangle_fc)demangle_java_type } }; @@ -73,49 +80,54 @@ static demangling_properties demanglers[DGT_COUNT] = { /****************************************************************************** * * -* Paramètres : type = identifiant du décodeur visé. * +* Paramètres : desc = 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(const char *desc) { - name_demangler *result; /* Adresse à retourner */ + GBinRoutine *result; /* Construction à remonter */ + DemanglerType i; /* Boucle de parcours */ - result = NULL;//demanglers[0]; + result = NULL; - return result; + for (i = 0; i < DGT_COUNT; i++) + { + if (demanglers[i].can_demangle == NULL) + continue; -} + if (!demanglers[i].can_demangle(desc)) + continue; + printf("++ routine :: %s\n", desc); + fflush(NULL); -/****************************************************************************** -* * -* 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 : - * -* * -******************************************************************************/ + result = demangle_routine(i, desc); -GBinRoutine *try_to_demangle_routine(name_demangler *demangler, const char *name) -{ - GBinRoutine *result; /* Construction à remonter */ + /* FIXME : à supprimer quand mature */ + if (result == NULL) + { + printf("++failed :: %s\n", desc); + exit(-1); + } + else printf(" -->> '%s'\n", g_binary_routine_get_name(result)); + + if (result != NULL) break; + + } + + if (result == NULL) + { + result = g_binary_routine_new(); + g_binary_routine_set_name(result, strdup(desc)); + } - result = NULL; - /* - if (demangler->can_be_demangled(demangler, name)) - result = demangler->demangle_routine(demangler, name); - */ return result; } |