summaryrefslogtreecommitdiff
path: root/src/format/mangling/demangler.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2010-05-13 12:32:03 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2010-05-13 12:32:03 (GMT)
commit118a668adbf6ca9d4c549618e54f58330f46ce58 (patch)
tree10e75f1a7e83ab48aba82a5a595441a065a6037e /src/format/mangling/demangler.c
parente56b4db3aae87f0458319019635dea4968a5c529 (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.c99
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;