diff options
Diffstat (limited to 'src/analysis/line.c')
-rw-r--r-- | src/analysis/line.c | 76 |
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; |