/* Chrysalide - Outil d'analyse de fichiers binaires
* gbuffersegment.h - prototypes pour la concentration d'un fragment de caractères aux propriétés communes
*
* Copyright (C) 2010-2014 Cyrille Bagard
*
* This file is part of Chrysalide.
*
* 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 .
*/
#ifndef _GLIBEXT_GBUFFERSEGMENT_H
#define _GLIBEXT_GBUFFERSEGMENT_H
#include
#include
#include
#include
/* Liste identifiant un ensemble de segments */
typedef struct _segcnt_list segcnt_list;
/* -------------------- NATURE DE BASE POUR UN FRAGMENT DE TEXTE -------------------- */
#define G_TYPE_BUFFER_SEGMENT (g_buffer_segment_get_type())
#define G_BUFFER_SEGMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_BUFFER_SEGMENT, GBufferSegment))
#define G_BUFFER_SEGMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BUFFER_SEGMENT, GBufferSegmentClass))
#define G_IS_BUFFER_SEGMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_BUFFER_SEGMENT))
#define G_IS_BUFFER_SEGMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BUFFER_SEGMENT))
#define G_BUFFER_SEGMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BUFFER_SEGMENT, GBufferSegmentClass))
/* Types de partie de rendu */
typedef enum _RenderingTagType
{
RTT_RAW, /* Contenu brut */
RTT_COMMENT, /* Commentaire */
RTT_INDICATION, /* Aide à la lecture */
RTT_PHYS_ADDR_PAD, /* Position physique (début) */
RTT_PHYS_ADDR, /* Position physique */
RTT_VIRT_ADDR_PAD, /* Adresse virtuelle (début) */
RTT_VIRT_ADDR, /* Adresse virtuelle */
RTT_RAW_CODE, /* Code binaire brut */
RTT_LABEL, /* Etiquette sur une adresse */
RTT_INSTRUCTION, /* Code binaire brut */
RTT_IMMEDIATE, /* Valeur immédiate */
RTT_REGISTER, /* Registre */
RTT_PUNCT, /* Signes de ponctuation */
RTT_HOOK, /* Crochets '[' et ']' */
RTT_SIGNS, /* Signes '+', '-' et '*' */
RTT_LTGT, /* Caractères '<' et '>' */
RTT_SECTION, /* Identifiant de section */
RTT_SEGMENT, /* Indication de segment */
RTT_STRING, /* Chaîne de caractères avec " */
RTT_VAR_NAME, /* Nom de variable */
RTT_KEY_WORD, /* Mot clef de langage */
RTT_ERROR, /* Erreur "interne" */
RTT_COUNT
} RenderingTagType;
/* Fragment de caractères aux propriétés communes (instance) */
typedef struct _GBufferSegment GBufferSegment;
/* Fragment de caractères aux propriétés communes (classe) */
typedef struct _GBufferSegmentClass GBufferSegmentClass;
/* Détermine le type du fragment de caractères aux propriétés communes. */
GType g_buffer_segment_get_type(void);
/* Crée un nouveau fragment de texte avec des propriétés. */
GBufferSegment *g_buffer_segment_new(RenderingTagType, const char *, size_t);
/* Associe à un segment un objet GLib identifié comme créateur. */
void g_buffer_segment_set_creator(GBufferSegment *, GObject *);
/* Renvoie vers un éventuel objet lié en tant que créateur. */
GObject *g_buffer_segment_get_creator(const GBufferSegment *);
/* Indique si les textes de deux segments sont identiques. */
bool g_buffer_segment_compare(const GBufferSegment *, const GBufferSegment *);
/* Fournit le texte brut conservé dans le segment. */
char *g_buffer_segment_get_text(const GBufferSegment *, bool);
/* Fournit la quantité de pixels requise pour l'impression. */
gint g_buffer_segment_get_width(const GBufferSegment *);
/* Fournit la position idéale pour un marqueur. */
gint g_buffer_segment_get_caret_position(const GBufferSegment *, gint);
/* Déplace le curseur au sein d'un segment de tampon. */
bool g_buffer_segment_move_caret(const GBufferSegment *, gint *, bool, GdkScrollDirection);
/* Imprime le fragment de texte représenté. */
void g_buffer_segment_draw(GBufferSegment *, cairo_t *, gint *, gint, const segcnt_list *);
/* Types d'exportation */
typedef enum _BufferExportType
{
BET_TEXT, /* Exportation en texte brut */
BET_HTML, /* Exportation en HTML */
BET_COUNT
} BufferExportType;
/* Elements sur lesquels une exportation peut s'appuyer */
typedef struct _buffer_export_context
{
union
{
int fd; /* Flux ouvert en écriture */
};
union
{
/* BET_TEXT */
const char *sep; /* Séparation entre colonnes */
/* BET_HTML */
struct
{
const char *font_name; /* Police d'impression */
const char *bg_color; /* Fond du tableau HTML */
};
};
} buffer_export_context;
/* Exporte tous les styles utilisés par des segments. */
void g_buffer_segment_export_style(buffer_export_context *, BufferExportType);
/* Exporte le fragment de texte représenté. */
void g_buffer_segment_export(const GBufferSegment *, buffer_export_context *, BufferExportType);
/* -------------------- GESTION OPTIMALE D'UNE LISTE DE CONTENUS -------------------- */
/* Initilise une liste de contenus de segments. */
segcnt_list *init_segment_content_list(void);
/* Libère la mémoire occupée par une liste de contenus. */
void exit_segment_content_list(segcnt_list *);
/* Vide, si besoin est, une liste de contenus de segments. */
bool reset_segment_content_list(segcnt_list *);
/* Marque le contenu d'un segment comme remarquable. */
bool add_segment_content_to_selection_list(segcnt_list *, const GBufferSegment *);
/* Indique si le contenu d'un segment est notable ou non. */
bool selection_list_has_segment_content(const segcnt_list *, const GBufferSegment *);
#endif /* _GLIBEXT_GBUFFERSEGMENT_H */