From 9ff8702e5c51c7916e239caee13b974dccff6413 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Tue, 24 Feb 2015 20:50:41 +0000
Subject: Shown a loaded view at its entry point at the beginning.

git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@479 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
---
 ChangeLog           | 12 ++++++++++++
 src/format/format.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
 src/format/format.h |  3 +++
 src/format/symbol.c |  1 +
 src/project.c       | 13 +++++++++++++
 5 files changed, 73 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 2560d6c..8eb28e5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+15-02-24  Cyrille Bagard <nocbos@gmail.com>
+
+	* src/format/format.c:
+	* src/format/format.h:
+	Provide a way to find a symbol by its label.
+
+	* src/format/symbol.c:
+	Add a debug comment.
+
+	* src/project.c:
+	Show a loaded view at its entry point at the beginning.
+
 15-02-23  Cyrille Bagard <nocbos@gmail.com>
 
 	* src/analysis/binary.c:
diff --git a/src/format/format.c b/src/format/format.c
index 29c151d..6b63556 100644
--- a/src/format/format.c
+++ b/src/format/format.c
@@ -25,6 +25,7 @@
 
 
 #include <malloc.h>
+#include <string.h>
 
 
 #include "format-int.h"
@@ -223,6 +224,49 @@ GBinSymbol **g_binary_format_get_symbols(const GBinFormat *format, size_t *count
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : format = informations chargées à consulter.                  *
+*                label  = étiquette à retrouver lors des recherches.          *
+*                symbol = éventuel symbole trouvé à déréfenrencer. [OUT]      *
+*                                                                             *
+*  Description : Recherche le symbole correspondant à une étiquette.          *
+*                                                                             *
+*  Retour      : true si l'opération a été un succès, false sinon.            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool g_binary_format_find_symbol_by_label(const GBinFormat *format, const char *label, GBinSymbol **symbol)
+{
+    bool result;                            /* Bilan à retourner           */
+    size_t i;                               /* Boucle de parcours          */
+    const char *cur_lbl;                    /* Etiquette courante          */
+
+    result = false;
+
+    for (i = 0; i < format->symbols_count && !result; i++)
+    {
+        cur_lbl = g_binary_symbol_get_label(format->symbols[i]);
+        if (cur_lbl == NULL) continue;
+
+        if (strcmp(label, cur_lbl) == 0)
+        {
+            *symbol = format->symbols[i];
+            g_object_ref(G_OBJECT(*symbol));
+
+            result = true;
+
+        }
+
+    }
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : format = informations chargées à consulter.                  *
 *                addr   = adresse à cibler lors des recherches.               *
 *                symbol = éventuel symbole trouvé à déréfenrencer. [OUT]      *
 *                                                                             *
diff --git a/src/format/format.h b/src/format/format.h
index ebad980..e23b4bd 100644
--- a/src/format/format.h
+++ b/src/format/format.h
@@ -70,6 +70,9 @@ void g_binary_format_add_symbol(GBinFormat *, GBinSymbol *);
 /* Fournit la liste de tous les symboles détectés. */
 GBinSymbol **g_binary_format_get_symbols(const GBinFormat *, size_t *);
 
+/* Recherche le symbole correspondant à une étiquette. */
+bool g_binary_format_find_symbol_by_label(const GBinFormat *, const char *, GBinSymbol **);
+
 /* Recherche le symbole correspondant à une adresse. */
 bool g_binary_format_find_symbol_at(const GBinFormat *, const vmpa2t *, GBinSymbol **);
 
diff --git a/src/format/symbol.c b/src/format/symbol.c
index ce5c837..7817d5f 100644
--- a/src/format/symbol.c
+++ b/src/format/symbol.c
@@ -379,6 +379,7 @@ const mrange_t *g_binary_symbol_get_range(const GBinSymbol *symbol)
             break;
 
         default:
+            /* FIXME : assert(0); */
             result = NULL;
             break;
 
diff --git a/src/project.c b/src/project.c
index 7c98d96..f3a2702 100644
--- a/src/project.c
+++ b/src/project.c
@@ -324,11 +324,24 @@ const char *g_study_project_get_filename(const GStudyProject *project)
 void g_study_project_add_loaded_binary(GLoadedBinary *binary, GStudyProject *project)
 {
     size_t index;                           /* Indice du nouveau binaire   */
+    GBinFormat *format;                     /* Format associé au binaire   */
+    GBinSymbol *symbol;                     /* Point d'entrée trouvé       */
+    const mrange_t *range;                  /* Emplacement de ce point     */
 
     index = g_study_project_attach_binary(project, binary);
 
     g_panel_item_dock(G_PANEL_ITEM(project->binaries[index]->item));
 
+    format = G_BIN_FORMAT(g_loaded_binary_get_format(binary));
+
+    if (g_binary_format_find_symbol_by_label(format, "entry_point", &symbol))
+    {
+        range = g_binary_symbol_get_range(symbol);
+
+        gtk_view_panel_scroll_to_address(project->binaries[index]->views[BVW_BLOCK], get_mrange_addr(range));
+
+    }
+
 }
 
 
-- 
cgit v0.11.2-87-g4458