summaryrefslogtreecommitdiff
path: root/src/analysis/line.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-03-15 13:38:22 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-03-15 13:38:22 (GMT)
commit4ad9e532a78401f787f0a8a6742095512b520488 (patch)
tree2b71914a52fc930be78939362b16756efe9caa68 /src/analysis/line.c
parenta2b767b244e03f00c6a987bbd9872796ed385f47 (diff)
Avoided to crash when analysing crackmes such as grainne.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@55 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis/line.c')
-rw-r--r--src/analysis/line.c107
1 files changed, 104 insertions, 3 deletions
diff --git a/src/analysis/line.c b/src/analysis/line.c
index f5f3d9c..62acb8e 100644
--- a/src/analysis/line.c
+++ b/src/analysis/line.c
@@ -58,6 +58,7 @@ struct _rendering_line
uint64_t offset; /* Position en mémoire/physique*/
RenderingLineType type; /* Type de représentation */
+ RenderingLineFlag flags; /* Extension d'informations */
PangoLayout *layout; /* Moteur de rendu du code/txt */
@@ -169,6 +170,63 @@ void init_rendering_line(rendering_line *line)
}
+/******************************************************************************
+* *
+* Paramètres : line = ligne dont les informations sont à mettre à jour. *
+* flag = extension d'information à ajouter. *
+* *
+* Description : Ajoute une information supplémentaire à une ligne. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void add_rendering_line_flag(rendering_line *line, RenderingLineFlag flag)
+{
+ line->flags |= flag;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : line = ligne dont les informations sont à mettre à jour. *
+* flag = extension d'information à retirer. *
+* *
+* Description : Retire une information supplémentaire sur d'une ligne. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void remove_rendering_line_flag(rendering_line *line, RenderingLineFlag flag)
+{
+ line->flags &= ~flag;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : line = ligne dont les informations sont à mettre à jour. *
+* *
+* Description : Fournit les informations supplémentaires d'une ligne. *
+* *
+* Retour : Extensions d'informations courantes. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+RenderingLineFlag get_rendering_line_flags(const rendering_line *line)
+{
+ return line->flags;
+
+}
@@ -236,6 +294,30 @@ void insert_line_into_rendering_lines(rendering_line **lines, rendering_line *li
}
+/******************************************************************************
+* *
+* Paramètres : lines = liste de lignes à parcourir. *
+* offset = position en mémoire ou physique à chercher. *
+* *
+* Description : Recherche une ligne d'après sa position en mémoire/physique. *
+* *
+* Retour : Ligne représentant l'adresse donnée, NULL si aucune trouvée. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+rendering_line *find_offset_in_rendering_lines(const rendering_line **lines, uint64_t offset)
+{
+ rendering_line *result;
+
+ dl_list_for_each(result, DLL_HCAST(lines), rendering_line *)
+ if (result->offset == offset) break;
+
+ return result;
+
+}
+
/******************************************************************************
@@ -313,8 +395,10 @@ void get_rendering_line_size(rendering_line *line, int *width, int *height)
* Paramètres : line = adresse de la structure à représenter. *
* drawable = support de rendu pour le dessin. *
* gc = contexte graphique à utiliser. *
-* x = abscisse de la zone de rendu. *
+* x0 = abscisse de la zone de rendu (marge). *
+* x1 = abscisse de la zone de rendu (texte). *
* y = ordonnée de la zone de rendu. *
+* h = hauteur réservée pour la ligne. *
* *
* Description : Procède à l'initialisation des bases d'une représentation. *
* *
@@ -324,9 +408,26 @@ void get_rendering_line_size(rendering_line *line, int *width, int *height)
* *
******************************************************************************/
-void draw_rendering_line(rendering_line *line, GdkDrawable *drawable, GdkGC *gc, gint x, gint y)
+void draw_rendering_line(rendering_line *line, GdkDrawable *drawable, GdkGC *gc, gint x0, gint x1, gint y, gint h)
{
- gdk_draw_layout(drawable, gc, x, y, line->layout);
+ GdkPixbuf *pixbuf; /* Données utiles au dessin */
+
+ gdk_draw_layout(drawable, gc, x1, y, line->layout);
+
+ if (line->flags & RLF_ENTRY_POINT)
+ pixbuf = gtk_widget_render_icon(mywid, "gtk-go-forward", GTK_ICON_SIZE_MENU, NULL);
+
+ else pixbuf = NULL;
+
+ if (pixbuf != NULL)
+ {
+ gdk_draw_pixbuf(drawable, gc, pixbuf, 0, 0, x0, y,
+ gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf),
+ GDK_RGB_DITHER_NORMAL, 0, 0);
+
+ g_object_unref(pixbuf);
+
+ }
}