From a4be577f06d16a4fc851ede9a744eac9160bcb45 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Mon, 4 Apr 2016 01:14:10 +0200
Subject: Kept the user informed about the instructions printing status.

---
 ChangeLog                          |  15 ++++++
 src/analysis/disass/disassembler.c |   3 +-
 src/analysis/disass/fetch.c        |   2 +
 src/analysis/disass/output.c       | 101 +++++++++++++++++++++++++++----------
 src/analysis/disass/output.h       |   7 ++-
 src/gtkext/gtkstatusstack.c        |   5 +-
 6 files changed, 98 insertions(+), 35 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 2245532..51a73bf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+16-04-04  Cyrille Bagard <nocbos@gmail.com>
+
+	* src/analysis/disass/disassembler.c:
+	Update code.
+
+	* src/analysis/disass/fetch.c:
+	Hide the activity status when done.
+
+	* src/analysis/disass/output.c:
+	* src/analysis/disass/output.h:
+	Keep the user informed about the instructions printing status.
+
+	* src/gtkext/gtkstatusstack.c:
+	Reset the idle tag when possible and avoid a dead lock.
+
 16-04-03  Cyrille Bagard <nocbos@gmail.com>
 
 	* src/analysis/disass/disassembler.c:
diff --git a/src/analysis/disass/disassembler.c b/src/analysis/disass/disassembler.c
index 7d8494f..1d62ab5 100644
--- a/src/analysis/disass/disassembler.c
+++ b/src/analysis/disass/disassembler.c
@@ -525,8 +525,7 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkStatus
 
     proc = g_loaded_binary_get_processor(disass->binary);
 
-    print_disassembled_instructions(disass->buffer, disass->format, proc, *disass->instrs,
-                                    routines, routines_count, status, 0/*id*/);
+    print_disassembled_instructions(disass->buffer, disass->format, proc, status);
 
     g_object_unref(G_OBJECT(proc));
 
diff --git a/src/analysis/disass/fetch.c b/src/analysis/disass/fetch.c
index f484f05..373b8dc 100644
--- a/src/analysis/disass/fetch.c
+++ b/src/analysis/disass/fetch.c
@@ -567,6 +567,8 @@ GArchInstruction *disassemble_binary_content(const GLoadedBinary *binary, wgroup
 
     result = collect_instructions_from_mem_areas_v2(template.areas, template.count);
 
+    gtk_status_stack_remove_activity(status, template.id);
+
     /* Libérations finales */
 
     //g_object_unref(G_OBJECT(template.format));
diff --git a/src/analysis/disass/output.c b/src/analysis/disass/output.c
index dce5497..b2bfce7 100644
--- a/src/analysis/disass/output.c
+++ b/src/analysis/disass/output.c
@@ -35,15 +35,18 @@
 
 
 
+#define ROUTINE_INTRO_MSG "; --------------- BEGIN OF PROCEDURE ---------------"
+
+
+
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : buffer    = tampon de récueil des résultats d'impression.    *
-*                format    = format du binaire traité.                        *
-*                instrs    = ensemble d'instructions à traiter.               *
-*                routines  = liste de routines intervenant dans le flot.      *
-*                count     = quantité de ces routines.                        *
-*                statusbar = barre de statut avec progression à mettre à jour.*
-*                id        = identifiant du message affiché à l'utilisateur.  *
+*  Paramètres  : buffer   = tampon de récueil des résultats d'impression.     *
+*                format   = format du binaire traité.                         *
+*                instrs   = ensemble d'instructions à traiter.                *
+*                routines = liste de routines intervenant dans le flot.       *
+*                count    = quantité de ces routines.                         *
+*                status   = barre de statut avec progression à mettre à jour. *
 *                                                                             *
 *  Description : Transcrit du code désassemblé en texte humainement lisible.  *
 *                                                                             *
@@ -53,7 +56,7 @@
 *                                                                             *
 ******************************************************************************/
 
-void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *format, GArchProcessor *proc, const GArchInstruction *instrs, GBinRoutine * const *routines, size_t count, GtkExtStatusBar *statusbar, bstatus_id_t id)
+void print_disassembled_instructions(GCodeBuffer *buffer, GExeFormat *format, GArchProcessor *proc, GtkStatusStack *status)
 {
     GLangOutput *output;                    /* Modèle de sortie adéquat    */
     GPortionLayer *layer;                   /* Couche première de portions */
@@ -68,15 +71,14 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
     MemoryDataSize msize;                   /* Taille du bus d'adresses    */
     const GBinContent *content;             /* Contenu binaire global      */
 
-#if 0
-    const mrange_t *range;                  /* Cou
+    size_t count;                           /* Nombre total d'instructions */
+    activity_id_t id;                       /* Identifiant de progression  */
+
 
-    vmpa_t start;                           /* Adresse de départ           */
-    vmpa_t end;                             /* Adresse de fin              */
-#endif
 
-    const GArchInstruction *iter;           /* Boucle de parcours #1       */
-    size_t i;                               /* Boucle de parcours #2       */
+    size_t i;                               /* Boucle de parcours          */
+    GArchInstruction *instr;                /* Instruction à traiter       */
+
     const vmpa2t *iaddr;                    /* Adresse d'instruction       */
     const vmpa2t *saddr;                    /* Adresse de symbole          */
 
@@ -86,7 +88,7 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
     const vmpa2t *paddr;                    /* Adresse de portion          */
 
     int compared;                           /* Bilan d'une comparaison     */
-
+    SymbolType stype;                       /* Type de symbole trouvé      */
     const char *label;                      /* Etiquette ciblant un symbole*/
     mrange_t range;                         /* Couverture sans surface     */
 
@@ -141,10 +143,17 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
     g_arch_instruction_get_location(iter, NULL, NULL, &end);
 #endif
 
-    for (iter = instrs, i = 0;
-         iter != NULL;
-         iter = g_arch_instruction_get_next_iter(instrs, iter, VMPA_MAX))
+
+    count = g_arch_processor_count_disassembled_instructions(proc);
+
+    id = gtk_status_stack_add_activity(status, _("Printing all disassebled parts..."), count);
+
+    for (i = 0; i < count; i++)
     {
+        instr = g_arch_processor_get_disassembled_instruction(proc, i);
+
+
+
 #if 0
         g_arch_instruction_get_location(iter, NULL, NULL, &iaddr);
 
@@ -160,7 +169,7 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
 #endif
 
 
-        iaddr = get_mrange_addr(g_arch_instruction_get_range(iter));
+        iaddr = get_mrange_addr(g_arch_instruction_get_range(instr));
 
         while (portion_index < portions_count)
         {
@@ -181,7 +190,7 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
 
         if (sym_index < sym_count)
         {
-            iaddr = get_mrange_addr(g_arch_instruction_get_range(iter));
+            iaddr = get_mrange_addr(g_arch_instruction_get_range(instr));
             saddr = get_mrange_addr(g_binary_symbol_get_range(symbols[sym_index]));
 
             /* On écarte les symboles qu'on ne sait pas réintroduire */
@@ -202,14 +211,49 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
 
             if (compared == 0)
             {
+                /* Ligne de séparation */
+
+                init_mrange(&range, get_mrange_addr(g_binary_symbol_get_range(symbols[sym_index])), 0);
+
+                line = g_code_buffer_prepare_new_line(buffer, &range);
+                g_buffer_line_add_flag(line, BLF_IS_LABEL);
+                g_buffer_line_fill_mrange(line, msize, msize);
+
+                g_code_buffer_append_new_line(buffer, line);
+
+                /* Coupure pour une nouvelle routine */
+
+                stype = g_binary_symbol_get_target_type(symbols[sym_index]);
+
+                if (stype == STP_ROUTINE || stype == STP_FUNCTION || stype == STP_ENTRY_POINT)
+                {
+
+                    line = g_code_buffer_prepare_new_line(buffer, &range);
+                    g_buffer_line_add_flag(line, BLF_IS_LABEL);
+                    g_buffer_line_fill_mrange(line, msize, msize);
+
+                    g_buffer_line_start_merge_at(line, BLC_ASSEMBLY_HEAD);
+                    g_buffer_line_insert_text(line, BLC_ASSEMBLY_HEAD,
+                                              ROUTINE_INTRO_MSG, strlen(ROUTINE_INTRO_MSG), RTT_COMMENT);
+
+                    g_code_buffer_append_new_line(buffer, line);
+
+                    init_mrange(&range, get_mrange_addr(g_binary_symbol_get_range(symbols[sym_index])), 0);
+
+                    line = g_code_buffer_prepare_new_line(buffer, &range);
+                    g_buffer_line_add_flag(line, BLF_IS_LABEL);
+                    g_buffer_line_fill_mrange(line, msize, msize);
+
+                    g_code_buffer_append_new_line(buffer, line);
+
+                }
+
                 /* Etiquette ? */
 
                 label = g_binary_symbol_get_label(symbols[sym_index]);
 
                 if (label != NULL)
                 {
-                    init_mrange(&range, get_mrange_addr(g_binary_symbol_get_range(symbols[sym_index])), 0);
-
                     line = g_code_buffer_prepare_new_line(buffer, &range);
                     g_buffer_line_add_flag(line, BLF_IS_LABEL);
                     g_buffer_line_fill_mrange(line, msize, msize);
@@ -230,16 +274,16 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
 
 
 
-        line = g_arch_instruction_print(iter, buffer, msize, content, ASX_INTEL);
+        line = g_arch_instruction_print(instr, buffer, msize, content, ASX_INTEL);
 
 
-        if (g_arch_instruction_get_flags(iter) & AIF_RETURN_POINT)
+        if (g_arch_instruction_get_flags(instr) & AIF_RETURN_POINT)
             g_buffer_line_add_flag(line, BLF_BOOKMARK);
 
 
         if (sym_index < sym_count)
         {
-            iaddr = get_mrange_addr(g_arch_instruction_get_range(iter));
+            iaddr = get_mrange_addr(g_arch_instruction_get_range(instr));
             saddr = get_mrange_addr(g_binary_symbol_get_range(symbols[sym_index]));
 
             if (cmp_vmpa(iaddr, saddr) == 0)
@@ -286,11 +330,12 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
 
         g_code_buffer_append_new_line(buffer, line);
 
-
-        //gtk_extended_status_bar_update_activity(statusbar, id, (iaddr - start) * 1.0 / (end - start));
+        gtk_status_stack_update_activity_value(status, id, 1);
 
     }
 
+    gtk_status_stack_remove_activity(status, id);
+
     g_object_unref(G_OBJECT(content));
 
     if (portions != NULL)
diff --git a/src/analysis/disass/output.h b/src/analysis/disass/output.h
index 549fa23..a79273c 100644
--- a/src/analysis/disass/output.h
+++ b/src/analysis/disass/output.h
@@ -25,16 +25,15 @@
 #define _ANALYSIS_DISASS_OUTPUT_H
 
 
-#include "../routine.h"
-#include "../../arch/instruction.h"
 #include "../../arch/processor.h"
+#include "../../format/executable.h"
 #include "../../glibext/gcodebuffer.h"
-#include "../../gtkext/gtkextstatusbar.h"
+#include "../../gtkext/gtkstatusstack.h"
 
 
 
 /* Transcrit du code désassemblé en texte humainement lisible. */
-void print_disassembled_instructions(GCodeBuffer *, const GExeFormat *, GArchProcessor *, const GArchInstruction *, GBinRoutine * const *, size_t, GtkExtStatusBar *, bstatus_id_t);
+void print_disassembled_instructions(GCodeBuffer *, GExeFormat *, GArchProcessor *, GtkStatusStack *);
 
 
 
diff --git a/src/gtkext/gtkstatusstack.c b/src/gtkext/gtkstatusstack.c
index 880f4ed..f8bb4e8 100644
--- a/src/gtkext/gtkstatusstack.c
+++ b/src/gtkext/gtkstatusstack.c
@@ -1059,7 +1059,10 @@ void gtk_status_stack_remove_activity(GtkStatusStack *stack, activity_id_t id)
         info->count--;
 
         if (info->count == 0)
-            info->tag = g_idle_add((GSourceFunc)gtk_status_stack_show_current_instruction, stack);
+        {
+            info->tag = 0;
+            g_idle_add((GSourceFunc)gtk_status_stack_show_current_instruction, stack);
+        }
         else
             info->tag = g_idle_add((GSourceFunc)gtk_status_stack_show_current_activity, stack);
 
-- 
cgit v0.11.2-87-g4458