diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/binary.c | 3 | ||||
-rw-r--r-- | src/analysis/disass/disassembler.c | 14 | ||||
-rw-r--r-- | src/analysis/disass/disassembler.h | 2 | ||||
-rw-r--r-- | src/glibext/gbufferline.c | 38 | ||||
-rw-r--r-- | src/glibext/gbufferline.h | 3 | ||||
-rw-r--r-- | src/glibext/gbuffersegment.c | 26 | ||||
-rw-r--r-- | src/glibext/gbuffersegment.h | 3 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.c | 31 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.h | 3 | ||||
-rw-r--r-- | src/gui/menus/project.c | 8 | ||||
-rw-r--r-- | src/project.c | 6 |
11 files changed, 126 insertions, 11 deletions
diff --git a/src/analysis/binary.c b/src/analysis/binary.c index 21b4b14..73070b1 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -664,7 +664,8 @@ void g_openida_binary_analyse(GOpenidaBinary *binary) } } - binary->disass_buffer = disassemble_binary(binary, parts, parts_count, &binary->instrs); + disassemble_binary(binary, parts, parts_count, + &binary->instrs, &binary->disass_buffer); /* TODO : remme ! */ ack_completed_disassembly(NULL, binary); diff --git a/src/analysis/disass/disassembler.c b/src/analysis/disass/disassembler.c index 75e411f..872dc09 100644 --- a/src/analysis/disass/disassembler.c +++ b/src/analysis/disass/disassembler.c @@ -371,18 +371,18 @@ static void build_disass_prologue(GCodeBuffer *buffer, const char *filename, con * parts = parties binaires à désassembler. * * count = nombre de parties à traiter. * * instrs = liste des instructions chargées. [OUT] * +* buffer = tampon de code mis en place. [OUT] * * * * Description : Procède au désassemblage d'un contenu binaire donné. * * * -* Retour : Tampon de code mis en place. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -GCodeBuffer *disassemble_binary(GOpenidaBinary *binary, GBinPart **parts, size_t parts_count, GArchInstruction **instrs) +void disassemble_binary(GOpenidaBinary *binary, GBinPart **parts, size_t parts_count, GArchInstruction **instrs, GCodeBuffer **buffer) { - GCodeBuffer *result; /* Tampon constitué à renvoyer */ const uint8_t *data; /* Données binaires brutes */ off_t length; /* Quantité de ces données */ GDelayedDisassembly *disass; /* Désassemblage à mener */ @@ -393,12 +393,12 @@ GCodeBuffer *disassemble_binary(GOpenidaBinary *binary, GBinPart **parts, size_t /* Déroulement de l'opération principale */ - result = g_code_buffer_new(); + *buffer = g_code_buffer_new(); data = g_openida_binary_get_data(binary, &length); - build_disass_prologue(result, g_openida_binary_get_filename(binary), data, length); + build_disass_prologue(*buffer, g_openida_binary_get_filename(binary), data, length); - disass = g_delayed_disassembly_new(binary, parts, parts_count, result); + disass = g_delayed_disassembly_new(binary, parts, parts_count, *buffer); queue = get_work_queue(); g_work_queue_schedule_work(queue, G_DELAYED_WORK(disass)); @@ -422,6 +422,4 @@ GCodeBuffer *disassemble_binary(GOpenidaBinary *binary, GBinPart **parts, size_t } - return result; - } diff --git a/src/analysis/disass/disassembler.h b/src/analysis/disass/disassembler.h index 54da069..2c5adef 100644 --- a/src/analysis/disass/disassembler.h +++ b/src/analysis/disass/disassembler.h @@ -31,7 +31,7 @@ /* Procède à la décompilation des routines d'un fichier donné. */ -GCodeBuffer *disassemble_binary(GOpenidaBinary *, GBinPart **parts, size_t parts_count, GArchInstruction **); +void disassemble_binary(GOpenidaBinary *, GBinPart **parts, size_t parts_count, GArchInstruction **, GCodeBuffer **); diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c index e32e450..08f5ae7 100644 --- a/src/glibext/gbufferline.c +++ b/src/glibext/gbufferline.c @@ -24,9 +24,12 @@ #include "gbufferline.h" +#include <string.h> #include <gtk/gtk.h> /* Récupération du langage par défaut ; FIXME ? */ +#include "../common/extstr.h" + #include <malloc.h> /* FIXME : à virer */ @@ -495,6 +498,41 @@ void g_buffer_line_insert_text(GBufferLine *line, BufferLineColumn column, const /****************************************************************************** * * +* Paramètres : line = ligne à venir consulter. * +* * +* Description : Donne le texte représenté par une ligne de tampon. * +* * +* Retour : Texte à libérer de la mémoire après usage. * +* * +* Remarques : - * +* * +******************************************************************************/ + +char *g_buffer_line_get_text(const GBufferLine *line) +{ + char *result; /* Construction à retourner */ + BufferLineColumn i; /* Boucle de parcours #1 */ + size_t j; /* Boucle de parcours #2 */ + + result = NULL; + + for (i = BLC_ASSEMBLY_HEAD; i < BLC_COUNT; i++) + for (j = 0; j < line->columns[i].count; j++) + if (result == NULL) + { + result = strdup(g_buffer_segment_get_text(line->columns[i].segments[j])); + result = stradd(result, " "); + } + else + result = stradd(result, g_buffer_segment_get_text(line->columns[i].segments[j])); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : line = ligne à venir compléter. * * index = index de la colonne visée par la procédure. * * * diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h index 1e115cd..a9f6391 100644 --- a/src/glibext/gbufferline.h +++ b/src/glibext/gbufferline.h @@ -121,6 +121,9 @@ void g_buffer_line_add_segment(GBufferLine *, BufferLineColumn, GBufferSegment * /* Ajoute du texte à formater dans une ligne donnée. */ void g_buffer_line_insert_text(GBufferLine *, BufferLineColumn, const char *, size_t, RenderingTagType); +/* Donne le texte représenté par une ligne de tampon. */ +char *g_buffer_line_get_text(const GBufferLine *); + /* Fournit la largeur requise pour une colonne de ligne donnée. */ gint g_buffer_line_get_width(GBufferLine *, BufferLineColumn); diff --git a/src/glibext/gbuffersegment.c b/src/glibext/gbuffersegment.c index 0714e9c..6e862ad 100644 --- a/src/glibext/gbuffersegment.c +++ b/src/glibext/gbuffersegment.c @@ -25,6 +25,7 @@ #include <stdbool.h> +#include <string.h> @@ -38,6 +39,8 @@ struct _GBufferSegment { GObject parent; /* A laisser en premier */ + char *text; /* Texte brut conservé */ + PangoAttrList *attribs; /* Propriétés du rendu */ GdkColor cache_fg; /* Couleur d'impression */ @@ -376,6 +379,8 @@ GBufferSegment *g_buffer_segment_new(PangoContext *context, PangoAttrList *attri result = g_object_new(G_TYPE_BUFFER_SEGMENT, NULL); //result = g_new(GBufferSegment, 1); + result->text = strdup(text); + result->attribs = pango_attr_list_ref(attribs); g_buffer_segment_prepare(result, context, attribs, text, length); @@ -389,7 +394,26 @@ GBufferSegment *g_buffer_segment_new(PangoContext *context, PangoAttrList *attri /****************************************************************************** * * -* Paramètres : segment = fragment de texte à consulter. * +* Paramètres : segment = fragment de texte à consulter. * +* * +* Description : Fournit le texte brut conservé dans le segment. * +* * +* Retour : Texte conservé en interne. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const char *g_buffer_segment_get_text(const GBufferSegment *segment) +{ + return segment->text; + +} + + +/****************************************************************************** +* * +* Paramètres : segment = fragment de texte à consulter. * * * * Description : Fournit la quantité de pixels requise pour l'impression. * * * diff --git a/src/glibext/gbuffersegment.h b/src/glibext/gbuffersegment.h index b335ab6..ead0560 100644 --- a/src/glibext/gbuffersegment.h +++ b/src/glibext/gbuffersegment.h @@ -64,6 +64,9 @@ GType g_buffer_segment_get_type(void); /* Crée un nouveau fragment de texte avec des propriétés. */ GBufferSegment *g_buffer_segment_new(PangoContext *, PangoAttrList *, const char *, size_t); +/* Fournit le texte brut conservé dans le segment. */ +const char *g_buffer_segment_get_text(const GBufferSegment *); + /* Fournit la quantité de pixels requise pour l'impression. */ gint g_buffer_segment_get_width(const GBufferSegment *); diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index fe00e2d..ac63a87 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -445,6 +445,37 @@ GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *buffer, vmpa_t addr) /****************************************************************************** * * * Paramètres : buffer = composant GTK à mettre à jour. * +* addr = adresse où retrouver la ligne recherchée. * +* * +* Description : Retrouve une ligne au sein d'un tampon avec une adresse. * +* * +* Retour : Line retrouvée ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, vmpa_t addr) +{ + GBufferLine *result; /* Instance à retourner */ + size_t i; /* Boucle de parcours */ + + result = NULL; + + /* TODO : coder un parcours plus optimal ! */ + + for (i = 0; i < buffer->used && result == NULL; i++) + if (g_buffer_line_get_address(buffer->lines[i]) == addr) + result = buffer->lines[i]; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : buffer = composant GTK à mettre à jour. * * * * Description : Augmente l'indentation des prochaines lignes. * * * diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h index 1cac790..2c8dbe9 100644 --- a/src/glibext/gcodebuffer.h +++ b/src/glibext/gcodebuffer.h @@ -62,6 +62,9 @@ GCodeBuffer *g_code_buffer_new(void); /* Ajoute une nouvelle ligne à un tampon pour code désassemblé. */ GBufferLine *g_code_buffer_append_new_line(GCodeBuffer *, vmpa_t); +/* Retrouve une ligne au sein d'un tampon avec une adresse. */ +GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *, vmpa_t); + /* Augmente l'indentation des prochaines lignes. */ void g_code_buffer_inc_indentation(GCodeBuffer *); diff --git a/src/gui/menus/project.c b/src/gui/menus/project.c index 7e9fc3f..96b411b 100644 --- a/src/gui/menus/project.c +++ b/src/gui/menus/project.c @@ -192,6 +192,14 @@ static void mcb_project_add_binary_file(GtkMenuItem *menuitem, GMenuBar *bar) free(dir); } + if (g_study_project_get_filename(get_current_project()) != NULL) + { + dir = strdup(g_study_project_get_filename(get_current_project())); + dir = dirname(dir); + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), dir); + free(dir); + } + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); diff --git a/src/project.c b/src/project.c index 9763e2d..91fe36c 100644 --- a/src/project.c +++ b/src/project.c @@ -664,6 +664,8 @@ void push_project_into_recent_list(const GStudyProject *project) /* Constitution de la liste des projets récents */ + /* Constitution de la liste des projets récents */ + manager = get_projects_manager(); qualified = (char *)calloc(strlen("file://") + strlen(project->filename) + 1, sizeof(char)); @@ -685,4 +687,8 @@ void push_project_into_recent_list(const GStudyProject *project) set_string_config_value(get_main_configuration(), MPT_LAST_PROJECT, project->filename); + /* Pour la prochaine ouverture du programme... */ + + set_string_config_value(get_main_configuration(), MPT_LAST_PROJECT, project->filename); + } |