summaryrefslogtreecommitdiff
path: root/src/format
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2010-11-28 13:03:25 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2010-11-28 13:03:25 (GMT)
commitf2d479c16a427696790441fa1459e7194f49bb6a (patch)
treec9c5f7b6d75bec1ab22932f36ca7f4142b29d4b9 /src/format
parent6ceb627a1d7c0752124563c636cd9ef6241e8a3a (diff)
Loaded all buffers of decompiled files.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@195 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format')
-rwxr-xr-xsrc/format/dex/dex.c46
-rw-r--r--src/format/format-int.h3
-rw-r--r--src/format/format.c24
-rw-r--r--src/format/format.h3
4 files changed, 76 insertions, 0 deletions
diff --git a/src/format/dex/dex.c b/src/format/dex/dex.c
index e30ed7a..25482af 100755
--- a/src/format/dex/dex.c
+++ b/src/format/dex/dex.c
@@ -45,6 +45,9 @@ static void g_dex_format_class_init(GDexFormatClass *);
/* Initialise une instance de format d'exécutable DEX. */
static void g_dex_format_init(GDexFormat *);
+/* Détermine tous les fichiers source indiqués. */
+static void g_dex_format_find_all_sources(GDexFormat *);
+
/* Procède à la décompilation complète du format. */
static void g_dex_format_decompile(const GDexFormat *, GCodeBuffer *, const char *);
@@ -191,6 +194,7 @@ GBinFormat *g_dex_format_new(const bin_t *content, off_t length)
register_all_dex_class_methods(result);
+ g_dex_format_find_all_sources(result);
return G_BIN_FORMAT(result);
@@ -200,6 +204,48 @@ GBinFormat *g_dex_format_new(const bin_t *content, off_t length)
/******************************************************************************
* *
+* Paramètres : format = informations chargées à mettre à jour. *
+* *
+* Description : Détermine tous les fichiers source indiqués. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_dex_format_find_all_sources(GDexFormat *format)
+{
+ GBinFormat *bf; /* Instance parente */
+ size_t i; /* Boucle de parcours #1 */
+ const char *source; /* Fichier source trouvé */
+ bool found; /* Présence dans la liste */
+ size_t k; /* Boucle de parcours #2 */
+
+ bf = G_BIN_FORMAT(format);
+
+ for (i = 0; i < format->classes_count; i++)
+ {
+ source = g_dex_class_get_source_file(format->classes[i], format);
+ found = false;
+
+ for (k = 0; k < bf->src_count && !found; k++)
+ found = (strcmp(source, bf->src_files[k]) == 0);
+
+ if (!found)
+ {
+ bf->src_files = (const char **)realloc(bf->src_files,
+ ++bf->src_count * sizeof(const char **));
+ bf->src_files[bf->src_count - 1] = source;
+ }
+
+ }
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : format = informations chargées à consulter. *
* buffer = tampon mis à disposition pour la sortie. *
* filename = nom du fichier source à cibler. *
diff --git a/src/format/format-int.h b/src/format/format-int.h
index 27d4129..5473e57 100644
--- a/src/format/format-int.h
+++ b/src/format/format-int.h
@@ -50,6 +50,9 @@ struct _GBinFormat
GBinRoutine **routines; /* Liste des routines trouvées */
size_t routines_count; /* Nombre de ces routines */
+ const char **src_files; /* Nom des fichiers source */
+ size_t src_count; /* Taille de la liste */
+ size_t def_source; /* Fichier source principal */
format_decompile_fc decompile; /* Décompilation d'un fichier */
};
diff --git a/src/format/format.c b/src/format/format.c
index e618120..c104649 100644
--- a/src/format/format.c
+++ b/src/format/format.c
@@ -335,6 +335,30 @@ GDecInstruction *g_binary_format_decompile_routine(const GBinFormat *format, GBi
/******************************************************************************
* *
+* Paramètres : format = informations chargées à consulter. *
+* count = taille de la liste retournée. [OUT] *
+* defsrc = fichier de code principal. [OUT] *
+* *
+* Description : Fournit la liste des fichiers source détectés. *
+* *
+* Retour : Liste de noms de fichier ou NULL si aucun. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const char * const *g_binary_format_get_source_files(const GBinFormat *format, size_t *count, size_t *defsrc)
+{
+ *count = format->src_count;
+ *defsrc = format->def_source;
+
+ return format->src_files;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : format = informations chargées à consulter. *
* buffer = tampon mis à disposition pour la sortie. *
* filename = nom du fichier source à cibler. *
diff --git a/src/format/format.h b/src/format/format.h
index 5a8c684..90aabbc 100644
--- a/src/format/format.h
+++ b/src/format/format.h
@@ -75,6 +75,9 @@ GBinRoutine **g_binary_format_get_routines(const GBinFormat *, size_t *);
/* Procède à la décompilation basique d'une routine donnée. */
GDecInstruction *g_binary_format_decompile_routine(const GBinFormat *, GBinRoutine *);
+/* Fournit la liste des fichiers source détectés. */
+const char * const *g_binary_format_get_source_files(const GBinFormat *, size_t *, size_t *);
+
/* Procède à la décompilation complète du format. */
void g_binary_format_decompile(const GBinFormat *, GCodeBuffer *, const char *filename);