/* OpenIDA - Outil d'analyse de fichiers binaires
* line.c - représentation des lignes de rendu
*
* Copyright (C) 2008 Cyrille Bagard
*
* This file is part of OpenIDA.
*
* OpenIDA is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* OpenIDA is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Foobar. If not, see .
*/
#include "line.h"
#include
#include
#include
#include "../common/dllist.h"
/* FIXME */
extern GtkWidget *mywid;
/* Ligne de représentation générique */
struct _rendering_line
{
DL_LIST_ITEM;
RenderingLineType type; /* Type de représentation */
PangoLayout *layout; /* Moteur de rendu du code/txt */
};
#define RENDERING_LINE(l) ((rendering_line *)l)
/* Procède à l'initialisation des bases d'une représentation. */
void init_rendering_line(rendering_line *);
/* ------------------------- LIGNE EN TETE DE DESASSEMBLAGE ------------------------- */
/* Ligne de représentation de prologue */
typedef struct _prologue_line
{
rendering_line basic; /* A laisser en premier */
char *comment; /* Texte à afficher */
} prologue_line;
/* Met à jour la ligne de représentation de prologue. */
void refresh_prologue_markup(prologue_line *);
/******************************************************************************
* *
* Paramètres : line = adresse de la structure commune. *
* *
* Description : Procède à l'initialisation des bases d'une représentation. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void init_rendering_line(rendering_line *line)
{
DL_LIST_ITEM_INIT(DLL_CAST(line));
line->layout = gtk_widget_create_pango_layout(mywid, NULL);
}
/******************************************************************************
* *
* Paramètres : lines = liste de lignes à compléter, ou NULL. *
* line = nouvelle ligne à intégrer à l'ensemble. *
* *
* Description : Ajoute une ligne à un ensemble existant. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void add_line_to_rendering_lines(rendering_line **lines, rendering_line *line)
{
dl_list_add_tail(DLL_CAST(line), (dl_list_item **)lines);
}
/******************************************************************************
* *
* 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. *
* y = ordonnée de la zone de rendu. *
* *
* Description : Procède à l'initialisation des bases d'une représentation. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void draw_rendering_line(rendering_line *line, GdkDrawable *drawable, GdkGC *gc, gint x, gint y)
{
gdk_draw_layout(drawable, gc, x, y, line->layout);
}
/* ---------------------------------------------------------------------------------- */
/* LIGNE EN TETE DE DESASSEMBLAGE */
/* ---------------------------------------------------------------------------------- */
/******************************************************************************
* *
* Paramètres : comment = texte à afficher au final. *
* *
* Description : Choisit d'afficher le code brut ou non. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
rendering_line *create_prologue_line(const char *comment)
{
prologue_line *result; /* Structure à retourner */
result = (prologue_line *)calloc(1, sizeof(prologue_line));
init_rendering_line(RENDERING_LINE(result));
RENDERING_LINE(result)->type = RLT_PROLOGUE;
result->comment = strdup(comment);
refresh_prologue_markup(result);
return RENDERING_LINE(result);
}
/******************************************************************************
* *
* Paramètres : line = ligne de représentation à actualiser. *
* *
* Description : Met à jour la ligne de représentation de prologue. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void refresh_prologue_markup(prologue_line *line)
{
size_t len; /* Taille du contenu */
char *content; /* Contenu réellement imprimé */
len = strlen("");
len += strlen("; ") + strlen(line->comment);
len += strlen("");
content = (char *)calloc(len + 1, sizeof(char));
snprintf(content, len + 1, "; %s", line->comment);
pango_layout_set_markup(RENDERING_LINE(line)->layout, content, len);
free(content);
}