summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/analysis/binary.c3
-rw-r--r--src/analysis/disass/disassembler.c14
-rw-r--r--src/analysis/disass/disassembler.h2
-rw-r--r--src/glibext/gbufferline.c38
-rw-r--r--src/glibext/gbufferline.h3
-rw-r--r--src/glibext/gbuffersegment.c26
-rw-r--r--src/glibext/gbuffersegment.h3
-rw-r--r--src/glibext/gcodebuffer.c31
-rw-r--r--src/glibext/gcodebuffer.h3
-rw-r--r--src/gui/menus/project.c8
-rw-r--r--src/project.c6
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);
+
}