summaryrefslogtreecommitdiff
path: root/src/analysis/line.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-06-14 11:57:14 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-06-14 11:57:14 (GMT)
commitae0135d727fdc67a268ede1530042a42a2a1ccd3 (patch)
treed3dc13797072c261ea8bb49dc2e83b0858478bc7 /src/analysis/line.c
parentfa0509e2914e3cb562a7cc58293f1171886fafb0 (diff)
Cleaned and improved the binary views ; implemented some first steps for the graphical view.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@76 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis/line.c')
-rw-r--r--src/analysis/line.c76
1 files changed, 63 insertions, 13 deletions
diff --git a/src/analysis/line.c b/src/analysis/line.c
index 2697f77..08ef3c1 100644
--- a/src/analysis/line.c
+++ b/src/analysis/line.c
@@ -126,6 +126,25 @@ static void g_rendering_line_init(GRenderingLine *line)
* *
* Paramètres : line = ligne dont les informations sont à consulter. *
* *
+* Description : Fournit l'adresse physique ou en mémoire d'une ligne. *
+* *
+* Retour : Position physique ou en mémoire associée à la ligne. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+vmpa_t get_rendering_line_address(const GRenderingLine *line)
+{
+ return line->offset;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : line = ligne dont les informations sont à consulter. *
+* *
* Description : Fournit le type d'une ligne. *
* *
* Retour : Type de la ligne fournie. *
@@ -395,8 +414,9 @@ void g_rendering_line_insert_into_lines(GRenderingLine **lines, GRenderingLine *
/******************************************************************************
* *
-* Paramètres : line = liste de lignes de représentation à actualiser. *
-* : iter = position actuelle dans la liste. *
+* Paramètres : lines = liste de lignes de représentation à actualiser. *
+* : iter = position actuelle dans la liste. *
+* last = dernière élément imposé du parcours ou NULL. *
* *
* Description : Fournit l'élement suivant un autre pour un parcours. *
* *
@@ -406,13 +426,14 @@ void g_rendering_line_insert_into_lines(GRenderingLine **lines, GRenderingLine *
* *
******************************************************************************/
-GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *lines, const GRenderingLine *iter)
+GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *lines, const GRenderingLine *iter, const GRenderingLine *last)
{
GRenderingLine *result; /* Elément suivant à renvoyer */
if (iter == NULL) iter = lines;
- result = lines_list_next_iter(iter, lines);
+ if (iter == last) result = NULL;
+ else result = lines_list_next_iter(iter, lines);
return result;
@@ -421,7 +442,8 @@ GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *lines, const GRen
/******************************************************************************
* *
-* Paramètres : line = liste de lignes de représentation à actualiser. *
+* Paramètres : lines = liste de lignes de représentation à actualiser. *
+* last = dernière élément imposé du parcours ou NULL. *
* *
* Description : Met à jour le nombre d'octets maximal par instruction. *
* *
@@ -431,7 +453,7 @@ GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *lines, const GRen
* *
******************************************************************************/
-void g_rendering_line_update_bin_len(GRenderingLine *lines)
+void g_rendering_line_update_bin_len(GRenderingLine *lines, const GRenderingLine *last)
{
GRenderingLine *iter; /* Boucle de parcours */
off_t bin_len; /* Taille d'instruction */
@@ -439,13 +461,21 @@ void g_rendering_line_update_bin_len(GRenderingLine *lines)
bin_len = 0;
lines_list_for_each(iter, lines)
+ {
if (iter->get_bin_len != NULL)
iter->get_bin_len(iter, &bin_len);
+ if (iter == last) break;
+
+ }
+
lines_list_for_each(iter, lines)
{
- iter->max_bin_len = bin_len * 2 + (bin_len - 1);
+ iter->max_bin_len = (bin_len > 0 ? bin_len * 2 + (bin_len - 1) : 0);
iter->refresh_markup(iter);
+
+ if (iter == last) break;
+
}
}
@@ -454,6 +484,7 @@ void g_rendering_line_update_bin_len(GRenderingLine *lines)
/******************************************************************************
* *
* Paramètres : lines = liste de lignes de représentation à actualiser. *
+* last = dernière élément imposé du parcours ou NULL. *
* width = largeur maximale des lignes. [OUT] *
* height = hauteur maximale des lignes. [OUT] *
* alone = hauteur d'une seule ligne. [OUT] *
@@ -466,7 +497,7 @@ void g_rendering_line_update_bin_len(GRenderingLine *lines)
* *
******************************************************************************/
-void g_rendering_line_get_size(GRenderingLine *lines, int *width, int *height, int *alone)
+void g_rendering_line_get_size(GRenderingLine *lines, const GRenderingLine *last, int *width, int *height, int *alone)
{
GRenderingLine *iter; /* Boucle de parcours */
int w; /* Largeur de l'objet actuelle */
@@ -486,6 +517,8 @@ void g_rendering_line_get_size(GRenderingLine *lines, int *width, int *height, i
if (iter == lines)
*alone = h;
+ if (iter == last) break;
+
}
}
@@ -494,6 +527,7 @@ void g_rendering_line_get_size(GRenderingLine *lines, int *width, int *height, i
/******************************************************************************
* *
* Paramètres : lines = liste de lignes à parcourir. *
+* last = dernière élément imposé du parcours ou NULL. *
* y = ordonnée à vérifier et à mettre à jour. [OUT] *
* *
* Description : Recherche une ligne d'après sa position à l'écran. *
@@ -504,7 +538,7 @@ void g_rendering_line_get_size(GRenderingLine *lines, int *width, int *height, i
* *
******************************************************************************/
-GRenderingLine *g_rendering_line_find_by_y(GRenderingLine *lines, gdouble *y)
+GRenderingLine *g_rendering_line_find_by_y(GRenderingLine *lines, const GRenderingLine *last, gdouble *y)
{
GRenderingLine *result; /* Trouvaille à retourner */
int h; /* Hauteur de l'objet actuel */
@@ -516,6 +550,12 @@ GRenderingLine *g_rendering_line_find_by_y(GRenderingLine *lines, gdouble *y)
if (*y < h) break;
else *y -= h;
+ if (result == last)
+ {
+ result = NULL;
+ break;
+ }
+
}
return result;
@@ -525,8 +565,9 @@ GRenderingLine *g_rendering_line_find_by_y(GRenderingLine *lines, gdouble *y)
/******************************************************************************
* *
-* Paramètres : lines = liste de lignes à parcourir. *
-* offset = position en mémoire ou physique à chercher. *
+* Paramètres : lines = liste de lignes à parcourir. *
+* last = dernière élément imposé du parcours ou NULL. *
+* addr = position en mémoire ou physique à chercher. *
* *
* Description : Recherche une ligne d'après sa position en mémoire/physique. *
* *
@@ -536,12 +577,21 @@ GRenderingLine *g_rendering_line_find_by_y(GRenderingLine *lines, gdouble *y)
* *
******************************************************************************/
-GRenderingLine *g_rendering_line_find_by_offset(GRenderingLine *lines, uint64_t offset)
+GRenderingLine *g_rendering_line_find_by_address(GRenderingLine *lines, const GRenderingLine *last, vmpa_t addr)
{
GRenderingLine *result; /* Trouvaille à retourner */
lines_list_for_each(result, lines)
- if (result->offset == offset) break;
+ {
+ if (result->offset == addr) break;
+
+ if (result == last)
+ {
+ result = NULL;
+ break;
+ }
+
+ }
return result;