summaryrefslogtreecommitdiff
path: root/src/format/mangling/demangler.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2010-08-01 14:16:09 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2010-08-01 14:16:09 (GMT)
commitbcfcb4ec8b4cf9a35b77e93d172e7dae81e8872a (patch)
tree49320473d97a18f4c2fcb705358871be5a5e33c0 /src/format/mangling/demangler.c
parent8725bd7f911369b04a507040256bf889517b377e (diff)
Cleaned the code and provided a fast way to demangle strings.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@178 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format/mangling/demangler.c')
-rw-r--r--src/format/mangling/demangler.c84
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;
}