summaryrefslogtreecommitdiff
path: root/src/gui/panels/symbols.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-01-13 22:37:31 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-01-13 22:37:31 (GMT)
commit23b9c6e68bbe5f0531f9a9408c2deb9f897701dc (patch)
tree3804d6c21c9cd5e291cb8c7853607cdda992d125 /src/gui/panels/symbols.c
parenta6975c1d754a1ba5bfb9e23f0b26692c746e6f9c (diff)
Created a real iterator for symbols.
Diffstat (limited to 'src/gui/panels/symbols.c')
-rw-r--r--src/gui/panels/symbols.c65
1 files changed, 40 insertions, 25 deletions
diff --git a/src/gui/panels/symbols.c b/src/gui/panels/symbols.c
index f64f087..dee03b5 100644
--- a/src/gui/panels/symbols.c
+++ b/src/gui/panels/symbols.c
@@ -39,6 +39,7 @@
#include "panel-int.h"
#include "../core/global.h"
#include "../../format/format.h"
+#include "../../format/symiter.h"
#include "../../gtkext/easygtk.h"
#include "../../gtkext/support.h"
#include "../../gtkext/tmgt.h"
@@ -649,11 +650,10 @@ static void change_symbols_panel_current_binary(GSymbolsPanel *panel, GLoadedBin
static void reload_symbols_for_new_list_view(GSymbolsPanel *panel)
{
GExeFormat *format; /* Format associé au binaire */
- GBinSymbol **symbols; /* Symboles à représenter */
- size_t sym_count; /* Qté de symboles présents */
GArchProcessor *proc; /* Architecture utilisée */
MemoryDataSize size; /* Taille des localisations */
- size_t i; /* Boucle de parcours */
+ sym_iter_t *siter; /* Parcours des symboles */
+ GBinSymbol *symbol; /* Symbole manipulé */
regmatch_t match; /* Récupération des trouvailles*/
cairo_surface_t *icon; /* Image associée au symbole */
const char *original; /* Etiquette brute d'origine */
@@ -664,18 +664,20 @@ static void reload_symbols_for_new_list_view(GSymbolsPanel *panel)
format = g_loaded_binary_get_format(panel->binary);
- symbols = g_binary_format_get_symbols(G_BIN_FORMAT(format), &sym_count);
-
proc = g_loaded_binary_get_processor(panel->binary);
size = g_arch_processor_get_memory_size(proc);
g_object_unref(G_OBJECT(proc));
- for (i = 0; i < sym_count; i++)
+ siter = create_symbol_iterator(G_BIN_FORMAT(format), 0);
+
+ for (symbol = get_symbol_iterator_current(siter);
+ symbol != NULL;
+ symbol = get_symbol_iterator_next(siter))
{
- if (!is_symbol_matching(panel, symbols[i], &match))
- continue;
+ if (!is_symbol_matching(panel, symbol, &match))
+ goto rsfnlv_next;
- switch (g_binary_symbol_get_target_type(symbols[i]))
+ switch (g_binary_symbol_get_target_type(symbol))
{
case STP_ROUTINE:
case STP_ENTRY_POINT:
@@ -689,15 +691,15 @@ static void reload_symbols_for_new_list_view(GSymbolsPanel *panel)
break;
}
- original = g_binary_symbol_get_label(symbols[i]);
+ original = g_binary_symbol_get_label(symbol);
name = build_highlighted_name(original, &match, 0);
- addr = get_mrange_addr(g_binary_symbol_get_range(symbols[i]));
+ addr = get_mrange_addr(g_binary_symbol_get_range(symbol));
vmpa2_virt_to_string(addr, size, virt, NULL);
gtk_tree_store_append(panel->store, &iter, NULL);
gtk_tree_store_set(panel->store, &iter,
- SBC_SYMBOL, symbols[i],
+ SBC_SYMBOL, symbol,
SBC_PICTURE, icon,
SBC_NAME, name,
SBC_ORIGINAL, original,
@@ -706,8 +708,14 @@ static void reload_symbols_for_new_list_view(GSymbolsPanel *panel)
free(name);
+ rsfnlv_next:
+
+ g_object_unref(G_OBJECT(symbol));
+
}
+ delete_symbol_iterator(siter);
+
g_object_unref(G_OBJECT(format));
}
@@ -849,11 +857,10 @@ static bool find_parent_for_symbol(GSymbolsPanel *panel, const GBinSymbol *symbo
static void reload_symbols_for_new_tree_view(GSymbolsPanel *panel)
{
GExeFormat *format; /* Format associé au binaire */
- GBinSymbol **symbols; /* Symboles à représenter */
- size_t sym_count; /* Qté de symboles présents */
GArchProcessor *proc; /* Architecture utilisée */
MemoryDataSize size; /* Taille des localisations */
- size_t i; /* Boucle de parcours */
+ sym_iter_t *siter; /* Parcours des symboles */
+ GBinSymbol *symbol; /* Symbole manipulé */
regmatch_t match; /* Récupération des trouvailles*/
GtkTreeIter parent; /* Point d'insertion parent */
size_t last; /* Position du dernier élément */
@@ -866,18 +873,20 @@ static void reload_symbols_for_new_tree_view(GSymbolsPanel *panel)
format = g_loaded_binary_get_format(panel->binary);
- symbols = g_binary_format_get_symbols(G_BIN_FORMAT(format), &sym_count);
-
proc = g_loaded_binary_get_processor(panel->binary);
size = g_arch_processor_get_memory_size(proc);
g_object_unref(G_OBJECT(proc));
- for (i = 0; i < sym_count; i++)
+ siter = create_symbol_iterator(G_BIN_FORMAT(format), 0);
+
+ for (symbol = get_symbol_iterator_current(siter);
+ symbol != NULL;
+ symbol = get_symbol_iterator_next(siter))
{
- if (!is_symbol_matching(panel, symbols[i], &match))
- continue;
+ if (!is_symbol_matching(panel, symbol, &match))
+ goto rsfntv_next;
- if (find_parent_for_symbol(panel, symbols[i], &parent, &match, &last))
+ if (find_parent_for_symbol(panel, symbol, &parent, &match, &last))
{
gtk_tree_store_set(panel->store, &parent,
SBC_PICTURE, G_SYMBOLS_PANEL_GET_CLASS(panel)->class_img,
@@ -890,7 +899,7 @@ static void reload_symbols_for_new_tree_view(GSymbolsPanel *panel)
else
gtk_tree_store_append(panel->store, &iter, NULL);
- switch (g_binary_symbol_get_target_type(symbols[i]))
+ switch (g_binary_symbol_get_target_type(symbol))
{
case STP_ROUTINE:
case STP_ENTRY_POINT:
@@ -904,14 +913,14 @@ static void reload_symbols_for_new_tree_view(GSymbolsPanel *panel)
break;
}
- original = g_binary_symbol_get_label(symbols[i]);
+ original = g_binary_symbol_get_label(symbol);
name = build_highlighted_name(original + last, &match, last);
- addr = get_mrange_addr(g_binary_symbol_get_range(symbols[i]));
+ addr = get_mrange_addr(g_binary_symbol_get_range(symbol));
vmpa2_virt_to_string(addr, size, virt, NULL);
gtk_tree_store_set(panel->store, &iter,
- SBC_SYMBOL, symbols[i],
+ SBC_SYMBOL, symbol,
SBC_PICTURE, icon,
SBC_NAME, name,
SBC_ORIGINAL, original + last,
@@ -920,8 +929,14 @@ static void reload_symbols_for_new_tree_view(GSymbolsPanel *panel)
free(name);
+ rsfntv_next:
+
+ g_object_unref(G_OBJECT(symbol));
+
}
+ delete_symbol_iterator(siter);
+
g_object_unref(G_OBJECT(format));
}