summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/line-int.h6
-rw-r--r--src/analysis/line.c28
-rw-r--r--src/analysis/line.h20
-rw-r--r--src/analysis/line_code.c15
-rw-r--r--src/analysis/line_comment.c20
-rw-r--r--src/analysis/line_prologue.c9
6 files changed, 65 insertions, 33 deletions
diff --git a/src/analysis/line-int.h b/src/analysis/line-int.h
index 59ef5f8..ea8bce0 100644
--- a/src/analysis/line-int.h
+++ b/src/analysis/line-int.h
@@ -36,7 +36,7 @@
typedef void (* get_bin_len_fc) (GRenderingLine *, off_t *);
/* Méthode de mise à jour d'une ligne de représentation. */
-typedef void (* refresh_markup_fc) (GRenderingLine *);
+typedef void (* refresh_markup_fc) (GRenderingLine *, LinesMainOwner);
/* Ligne de représentation générique (instance) */
@@ -57,10 +57,10 @@ struct _GRenderingLine
GRenderingLine *to; /* Eventuelle ligne visée */
InstructionLinkType link_type; /* Type de visée */
- PangoLayout *layout; /* Moteur de rendu du code/txt */
+ PangoLayout *layout[LMO_COUNT]; /* Moteur de rendu du code/txt */
get_bin_len_fc get_bin_len; /* Nbre d'octets représentés */
- off_t max_bin_len; /* Nombre global maximal */
+ off_t max_bin_len[LMO_COUNT]; /* Nombre global maximal */
refresh_markup_fc refresh_markup; /* Reconstruit la représentat° */
diff --git a/src/analysis/line.c b/src/analysis/line.c
index 958efe3..332e88d 100644
--- a/src/analysis/line.c
+++ b/src/analysis/line.c
@@ -104,6 +104,8 @@ static void g_rendering_line_init(GRenderingLine *line)
{
GdkScreen *screen; /* Ecran d'application */
PangoFontDescription *desc; /* Description de la police */
+ LinesMainOwner i; /* Boucle de parcours */
+
static PangoContext *context = NULL; /* Contexte graphique Pango */
DL_LIST_ITEM_INIT(&line->link);
@@ -118,7 +120,8 @@ static void g_rendering_line_init(GRenderingLine *line)
}
- line->layout = pango_layout_new(context);
+ for (i = 0; i < LMO_COUNT; i++)
+ line->layout[i] = pango_layout_new(context);
line->get_bin_len = NULL;
line->refresh_markup = NULL;
@@ -401,6 +404,7 @@ static GdkPixbuf *g_rendering_line_render_icon(const GRenderingLine *line, const
* x1 = abscisse de la zone de rendu (texte). *
* y = ordonnée de la zone de rendu. *
* h = hauteur réservée pour la ligne. *
+* owner = support effectif final des lignes de code. *
* *
* Description : Procède à l'initialisation des bases d'une représentation. *
* *
@@ -410,11 +414,11 @@ static GdkPixbuf *g_rendering_line_render_icon(const GRenderingLine *line, const
* *
******************************************************************************/
-void g_rendering_line_draw(GRenderingLine *line, GdkDrawable *drawable, GdkGC *gc, gint x0, gint x1, gint y, gint h)
+void g_rendering_line_draw(GRenderingLine *line, GdkDrawable *drawable, GdkGC *gc, gint x0, gint x1, gint y, gint h, LinesMainOwner owner)
{
GdkPixbuf *pixbuf; /* Données utiles au dessin */
- gdk_draw_layout(drawable, gc, x1, y, line->layout);
+ gdk_draw_layout(drawable, gc, x1, y, line->layout[owner]);
if (line->to != NULL)
pixbuf = g_rendering_line_render_icon(line, "gtk-bold", GTK_ICON_SIZE_MENU);
@@ -559,6 +563,7 @@ GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *lines, const GRen
* *
* Paramètres : lines = liste de lignes de représentation à actualiser. *
* last = dernière élément imposé du parcours ou NULL. *
+* owner = support effectif des lignes pour l'appelant. *
* *
* Description : Met à jour le nombre d'octets maximal par instruction. *
* *
@@ -568,7 +573,7 @@ GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *lines, const GRen
* *
******************************************************************************/
-void g_rendering_line_update_bin_len(GRenderingLine *lines, const GRenderingLine *last)
+void g_rendering_line_update_bin_len(GRenderingLine *lines, GRenderingLine *last, LinesMainOwner owner)
{
GRenderingLine *iter; /* Boucle de parcours */
off_t bin_len; /* Taille d'instruction */
@@ -586,8 +591,8 @@ void g_rendering_line_update_bin_len(GRenderingLine *lines, const GRenderingLine
lines_list_for_each(iter, lines)
{
- iter->max_bin_len = (bin_len > 0 ? bin_len * 2 + (bin_len - 1) : 0);
- iter->refresh_markup(iter);
+ iter->max_bin_len[owner] = (bin_len > 0 ? bin_len * 2 + (bin_len - 1) : 0);
+ iter->refresh_markup(iter, owner);
if (iter == last) break;
@@ -600,6 +605,7 @@ void g_rendering_line_update_bin_len(GRenderingLine *lines, const GRenderingLine
* *
* Paramètres : lines = liste de lignes de représentation à actualiser. *
* last = dernière élément imposé du parcours ou NULL. *
+* owner = support effectif final des lignes de code. *
* width = largeur maximale des lignes. [OUT] *
* height = hauteur maximale des lignes. [OUT] *
* alone = hauteur d'une seule ligne. [OUT] *
@@ -612,7 +618,7 @@ void g_rendering_line_update_bin_len(GRenderingLine *lines, const GRenderingLine
* *
******************************************************************************/
-void g_rendering_line_get_size(GRenderingLine *lines, const GRenderingLine *last, int *width, int *height, int *alone)
+void g_rendering_line_get_size(GRenderingLine *lines, const GRenderingLine *last, LinesMainOwner owner, int *width, int *height, int *alone)
{
GRenderingLine *iter; /* Boucle de parcours */
int w; /* Largeur de l'objet actuelle */
@@ -624,7 +630,7 @@ void g_rendering_line_get_size(GRenderingLine *lines, const GRenderingLine *last
lines_list_for_each(iter, lines)
{
- pango_layout_get_pixel_size(iter->layout, &w, &h);
+ pango_layout_get_pixel_size(iter->layout[owner], &w, &h);
*width = MAX(*width, w);
*height += h;
@@ -660,7 +666,11 @@ GRenderingLine *g_rendering_line_find_by_y(GRenderingLine *lines, const GRenderi
lines_list_for_each(result, lines)
{
- pango_layout_get_pixel_size(result->layout, NULL, &h);
+ /**
+ * Comme toutes les dispositions ont la même hauteur,
+ * on utilise la première...
+ */
+ pango_layout_get_pixel_size(result->layout[0], NULL, &h);
if (*y < h) break;
else *y -= h;
diff --git a/src/analysis/line.h b/src/analysis/line.h
index e06c53c..981cf90 100644
--- a/src/analysis/line.h
+++ b/src/analysis/line.h
@@ -34,6 +34,20 @@
+/* Support principal de lignes */
+typedef enum _LinesMainOwner
+{
+ LMO_BLOCK, /* Unique bloc de code */
+ LMO_GRAPH, /* Graphique de blocs de code */
+
+ LMO_COUNT
+
+} LinesMainOwner;
+
+
+
+
+
/* Définitions des types de ligne */
typedef enum _RenderingLineType
{
@@ -114,7 +128,7 @@ bool g_rendering_line_has_destination(const GRenderingLine *);
GRenderingLine *g_rendering_line_get_destination(const GRenderingLine *, InstructionLinkType *);
/* Procède à l'initialisation des bases d'une représentation. */
-void g_rendering_line_draw(GRenderingLine *, GdkDrawable *, GdkGC *, gint, gint, gint, gint);
+void g_rendering_line_draw(GRenderingLine *, GdkDrawable *, GdkGC *, gint, gint, gint, gint, LinesMainOwner);
@@ -131,10 +145,10 @@ void g_rendering_line_insert_into_lines(GRenderingLine **, GRenderingLine *, boo
GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *, const GRenderingLine *, const GRenderingLine *);
/* Met à jour le nombre d'octets maximal par instruction. */
-void g_rendering_line_update_bin_len(GRenderingLine *, const GRenderingLine *);
+void g_rendering_line_update_bin_len(GRenderingLine *, GRenderingLine *, LinesMainOwner);
/* Fournit les dimensions de lignes de représentation. */
-void g_rendering_line_get_size(GRenderingLine *, const GRenderingLine *, int *, int *, int *);
+void g_rendering_line_get_size(GRenderingLine *, const GRenderingLine *, LinesMainOwner, int *, int *, int *);
/* Recherche une ligne d'après sa position à l'écran. */
GRenderingLine *g_rendering_line_find_by_y(GRenderingLine *, const GRenderingLine *, gdouble *);
diff --git a/src/analysis/line_code.c b/src/analysis/line_code.c
index 5ca3623..84ab36c 100644
--- a/src/analysis/line_code.c
+++ b/src/analysis/line_code.c
@@ -61,7 +61,7 @@ static void g_code_line_init(GCodeLine *);
void g_code_line_get_binary_len(GCodeLine *, off_t *);
/* Met à jour la ligne de représentation de code. */
-void g_code_line_refresh_markup(GCodeLine *);
+void g_code_line_refresh_markup(GCodeLine *, LinesMainOwner);
@@ -140,7 +140,8 @@ void g_code_line_get_binary_len(GCodeLine *line, off_t *blen)
/******************************************************************************
* *
-* Paramètres : line = ligne de représentation à actualiser. *
+* Paramètres : line = ligne de représentation à actualiser. *
+* owner = support effectif final des lignes de code. *
* *
* Description : Met à jour la ligne de représentation de code. *
* *
@@ -150,7 +151,7 @@ void g_code_line_get_binary_len(GCodeLine *line, off_t *blen)
* *
******************************************************************************/
-void g_code_line_refresh_markup(GCodeLine *line)
+void g_code_line_refresh_markup(GCodeLine *line, LinesMainOwner owner)
{
size_t len; /* Taille du contenu */
char *content; /* Contenu réellement imprimé */
@@ -159,6 +160,7 @@ void g_code_line_refresh_markup(GCodeLine *line)
char buffer[CODE_BUFFER_LEN]; /* Zone tampon à utiliser #1 */
char *buffer2; /* Zone tampon à utiliser #2 */
const uint8_t *exe_content; /* Contenu binaire global */
+ const off_t *max_bin_len; /* Taille de ligne max/globale */
char *bin_code; /* Tampon du code binaire */
off_t k; /* Boucle de parcours #2 */
off_t j; /* Boucle de parcours #1 */
@@ -214,8 +216,9 @@ void g_code_line_refresh_markup(GCodeLine *line)
if (line->options->show_code)
{
exe_content = get_exe_content(line->options->format, NULL);
+ max_bin_len = &G_RENDERING_LINE(line)->max_bin_len[owner];
- bin_code = (char *)calloc(G_RENDERING_LINE(line)->max_bin_len + 1, sizeof(char));
+ bin_code = (char *)calloc(*max_bin_len + 1, sizeof(char));
k = 0;
@@ -227,7 +230,7 @@ void g_code_line_refresh_markup(GCodeLine *line)
k += snprintf(&bin_code[j * (2 + 1)], 3, "%02hhx", exe_content[bin_offset + j]);
}
- for (; k < G_RENDERING_LINE(line)->max_bin_len; k++)
+ for (; k < *max_bin_len; k++)
snprintf(&bin_code[k], 2, " ");
if (line->options->show_address) len += strlen("\t");
@@ -259,7 +262,7 @@ void g_code_line_refresh_markup(GCodeLine *line)
content = (char *)realloc(content, len * sizeof(char));
strcat(content, "</tt>");
- pango_layout_set_markup(G_RENDERING_LINE(line)->layout, content, len - 1);
+ pango_layout_set_markup(G_RENDERING_LINE(line)->layout[owner], content, len - 1);
free(content);
diff --git a/src/analysis/line_comment.c b/src/analysis/line_comment.c
index 1d37613..331bd19 100644
--- a/src/analysis/line_comment.c
+++ b/src/analysis/line_comment.c
@@ -58,7 +58,7 @@ static void g_comment_line_class_init(GCommentLineClass *);
static void g_comment_line_init(GCommentLine *);
/* Met à jour la ligne de représentation de commentaires. */
-void g_comment_line_refresh_markup(GCommentLine *);
+void g_comment_line_refresh_markup(GCommentLine *, LinesMainOwner);
@@ -112,7 +112,8 @@ static void g_comment_line_init(GCommentLine *line)
/******************************************************************************
* *
-* Paramètres : line = ligne de représentation à actualiser. *
+* Paramètres : line = ligne de représentation à actualiser. *
+* owner = support effectif final des lignes de code. *
* *
* Description : Met à jour la ligne de représentation de commentaires. *
* *
@@ -122,11 +123,12 @@ static void g_comment_line_init(GCommentLine *line)
* *
******************************************************************************/
-void g_comment_line_refresh_markup(GCommentLine *line)
+void g_comment_line_refresh_markup(GCommentLine *line, LinesMainOwner owner)
{
size_t len; /* Taille du contenu */
char *content; /* Contenu réellement imprimé */
char buffer[CODE_BUFFER_LEN]; /* Zone tampon à utiliser */
+ const off_t *max_bin_len; /* Taille de ligne max/globale */
size_t clen; /* Taille du commentaire */
len = strlen("<tt>") + 1;
@@ -176,8 +178,10 @@ void g_comment_line_refresh_markup(GCommentLine *line)
if (line->options->show_code)
{
+ max_bin_len = &G_RENDERING_LINE(line)->max_bin_len[owner];
+
clen = (line->options->show_address ? strlen("\t") : 0);
- clen += G_RENDERING_LINE(line)->max_bin_len;
+ clen += *max_bin_len;
content = (char *)realloc(content, (len + clen) * sizeof(char));
@@ -187,9 +191,9 @@ void g_comment_line_refresh_markup(GCommentLine *line)
len += strlen("\t");
}
- memset(&content[len - 1], G_RENDERING_LINE(line)->type == RLT_PROTOTYPE ? '-' : ' ',
- G_RENDERING_LINE(line)->max_bin_len);
- len += G_RENDERING_LINE(line)->max_bin_len;
+ memset(&content[len - 1],
+ G_RENDERING_LINE(line)->type == RLT_PROTOTYPE ? '-' : ' ', *max_bin_len);
+ len += *max_bin_len;
content[len - 1] = '\0';
@@ -221,7 +225,7 @@ void g_comment_line_refresh_markup(GCommentLine *line)
content = (char *)realloc(content, len * sizeof(char));
strcat(content, "</tt>");
- pango_layout_set_markup(G_RENDERING_LINE(line)->layout, content, len - 1);
+ pango_layout_set_markup(G_RENDERING_LINE(line)->layout[owner], content, len - 1);
free(content);
diff --git a/src/analysis/line_prologue.c b/src/analysis/line_prologue.c
index 74b5642..16876af 100644
--- a/src/analysis/line_prologue.c
+++ b/src/analysis/line_prologue.c
@@ -57,7 +57,7 @@ static void g_prologue_line_class_init(GPrologueLineClass *);
static void g_prologue_line_init(GPrologueLine *);
/* Met à jour la ligne de représentation de prologue. */
-void g_prologue_line_refresh_markup(GPrologueLine *);
+void g_prologue_line_refresh_markup(GPrologueLine *, LinesMainOwner);
@@ -113,7 +113,8 @@ static void g_prologue_line_init(GPrologueLine *line)
/******************************************************************************
* *
-* Paramètres : line = ligne de représentation à actualiser. *
+* Paramètres : line = ligne de représentation à actualiser. *
+* owner = support effectif final des lignes de code. *
* *
* Description : Met à jour la ligne de représentation de prologue. *
* *
@@ -123,7 +124,7 @@ static void g_prologue_line_init(GPrologueLine *line)
* *
******************************************************************************/
-void g_prologue_line_refresh_markup(GPrologueLine *line)
+void g_prologue_line_refresh_markup(GPrologueLine *line, LinesMainOwner owner)
{
size_t len; /* Taille du contenu */
char *content; /* Contenu réellement imprimé */
@@ -136,7 +137,7 @@ void g_prologue_line_refresh_markup(GPrologueLine *line)
snprintf(content, len + 1, "<b><span foreground='#003300'>; %s</span></b>", line->comment);
- pango_layout_set_markup(G_RENDERING_LINE(line)->layout, content, len);
+ pango_layout_set_markup(G_RENDERING_LINE(line)->layout[owner], content, len);
free(content);