Also listing strings in the interface

This commit is contained in:
Pierre Pronchery 2011-12-01 03:02:45 +00:00
parent 1ed0d9143b
commit 55ed70839e

View File

@ -25,8 +25,8 @@
/* TODO:
* - add a preferences structure
* - complete the function list
* - add a check box to open in raw mode
* - also display strings (calls...) */
* - add a window automatically displaying integers in base 2, 8, 10 and 16
* - add a check box to open in raw mode */
@ -49,6 +49,7 @@ typedef struct _GDeasm
/* widgets */
GtkListStore * func_store;
GtkListStore * str_store;
GtkTreeStore * asm_store;
GtkWidget * asm_view;
} GDeasm;
@ -84,12 +85,14 @@ static GDeasm * _gdeasm_new(int raw, char const * arch, char const * format,
GtkWidget * toolbar;
GtkToolItem * toolitem;
GtkWidget * hpaned;
GtkWidget * vpaned;
GtkWidget * scrolled;
GtkWidget * treeview;
GtkCellRenderer * renderer;
GtkTreeViewColumn * column;
char const * headers1[] = { "Functions", "Offset" };
char const * headers2[] = { "Address", "Instruction", "Operand",
char const * headers2[] = { "Strings" };
char const * headers3[] = { "Address", "Instruction", "Operand",
"Operand", "Operand", "Operand", "Operand", "Comment" };
size_t i;
@ -100,6 +103,7 @@ static GDeasm * _gdeasm_new(int raw, char const * arch, char const * format,
gdeasm->format = (format != NULL) ? strdup(format) : NULL;
gdeasm->func_store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_UINT);
gdeasm->str_store = gtk_list_store_new(1, G_TYPE_STRING);
gdeasm->asm_store = gtk_tree_store_new(9, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
@ -118,6 +122,7 @@ static GDeasm * _gdeasm_new(int raw, char const * arch, char const * format,
gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, TRUE, 0);
/* view */
hpaned = gtk_hpaned_new();
vpaned = gtk_vpaned_new();
/* functions */
scrolled = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
@ -138,7 +143,25 @@ static GDeasm * _gdeasm_new(int raw, char const * arch, char const * format,
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
}
gtk_container_add(GTK_CONTAINER(scrolled), treeview);
gtk_paned_add1(GTK_PANED(hpaned), scrolled);
gtk_paned_pack1(GTK_PANED(vpaned), scrolled, FALSE, TRUE);
/* strings */
scrolled = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(
gdeasm->str_store));
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE);
gtk_tree_view_set_reorderable(GTK_TREE_VIEW(treeview), FALSE);
for(i = 0; i < sizeof(headers2) / sizeof(*headers2); i++)
{
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(headers2[i],
renderer, "text", i, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
}
gtk_container_add(GTK_CONTAINER(scrolled), treeview);
gtk_paned_pack2(GTK_PANED(vpaned), scrolled, FALSE, FALSE);
gtk_paned_add1(GTK_PANED(hpaned), vpaned);
/* assembly */
scrolled = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
@ -149,10 +172,10 @@ static GDeasm * _gdeasm_new(int raw, char const * arch, char const * format,
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
gtk_tree_view_set_reorderable(GTK_TREE_VIEW(treeview), FALSE);
gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
for(i = 0; i < sizeof(headers2) / sizeof(*headers2); i++)
for(i = 0; i < sizeof(headers3) / sizeof(*headers3); i++)
{
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(headers2[i],
column = gtk_tree_view_column_new_with_attributes(headers3[i],
renderer, "text", i, NULL);
if(i == 0)
g_object_set(renderer, "family", "Monospace", NULL);
@ -196,6 +219,7 @@ static void _open_instruction(GDeasm * gdeasm, GtkTreeIter * parent,
static void _open_parse_dregister(char * buf, size_t size, ArchOperand * ao);
static void _open_parse_dregister2(char * buf, size_t size, ArchOperand * ao);
static void _open_parse_immediate(char * buf, size_t size, ArchOperand * ao);
static void _open_strings(GDeasm * gdeasm, AsmString * as, size_t as_cnt);
static int _gdeasm_open(GDeasm * gdeasm, char const * filename, int raw)
{
@ -204,6 +228,8 @@ static int _gdeasm_open(GDeasm * gdeasm, char const * filename, int raw)
AsmCode * code;
AsmFunction * af;
size_t af_cnt;
AsmString * as;
size_t as_cnt;
if((a = asm_new(gdeasm->arch, gdeasm->format)) == NULL)
return -1;
@ -211,6 +237,8 @@ static int _gdeasm_open(GDeasm * gdeasm, char const * filename, int raw)
ret = _open_code(gdeasm, code);
asmcode_get_functions(code, &af, &af_cnt);
_open_functions(gdeasm, af, af_cnt);
asmcode_get_strings(code, &as, &as_cnt);
_open_strings(gdeasm, as, as_cnt);
asm_close(a);
asm_delete(a);
return ret;
@ -289,7 +317,8 @@ static void _open_instruction(GDeasm * gdeasm, GtkTreeIter * parent,
break;
case AOT_IMMEDIATE:
_open_parse_immediate(buf, sizeof(buf), ao);
if(AO_GET_VALUE(ao->definition) == AOI_REFERS_STRING
if(AO_GET_VALUE(ao->definition)
== AOI_REFERS_STRING
|| AO_GET_VALUE(ao->definition)
== AOI_REFERS_FUNCTION)
gtk_tree_store_set(gdeasm->asm_store,
@ -333,6 +362,18 @@ static void _open_parse_immediate(char * buf, size_t size, ArchOperand * ao)
? "-" : "", (unsigned long)ao->value.immediate.value);
}
static void _open_strings(GDeasm * gdeasm, AsmString * as, size_t as_cnt)
{
size_t i;
GtkTreeIter iter;
for(i = 0; i < as_cnt; i++)
{
gtk_list_store_append(gdeasm->str_store, &iter);
gtk_list_store_set(gdeasm->str_store, &iter, 0, as[i].name, -1);
}
}
/* callbacks */
/* gdeasm_on_closex */
@ -386,6 +427,7 @@ static void _gdeasm_on_function_activated(GtkTreeView * view,
treesel = gtk_tree_view_get_selection(view);
gtk_tree_selection_select_iter(treesel, &iter);
path = gtk_tree_model_get_path(model, &iter);
gtk_tree_view_expand_to_path(view, path);
gtk_tree_view_scroll_to_cell(view, path, NULL, FALSE,
0.0, 0.0);
gtk_tree_path_free(path);
@ -412,6 +454,7 @@ static void _gdeasm_on_open(gpointer data)
if(filename == NULL)
return;
gtk_list_store_clear(gdeasm->func_store);
gtk_list_store_clear(gdeasm->str_store);
gtk_tree_store_clear(gdeasm->asm_store);
_gdeasm_open(gdeasm, filename, gdeasm->raw);
g_free(filename);