/* 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 */