/* Chrysalide - Outil d'analyse de fichiers binaires * gcodebuffer.h - prototypes pour l'affichage d'un fragment de code d'assemblage * * Copyright (C) 2010-2014 Cyrille Bagard * * This file is part of Chrysalide. * * Chrysalide 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. * * Chrysalide 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_GCODEBUFFER_H #define _GLIBEXT_GCODEBUFFER_H #include #include "delayed.h" #include "gbufferline.h" #include "gwidthtracker.h" /* -------------------------- TAMPON POUR CODE DESASSEMBLE -------------------------- */ #define G_TYPE_CODE_BUFFER (g_code_buffer_get_type()) #define G_CODE_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_CODE_BUFFER, GCodeBuffer)) #define G_CODE_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_CODE_BUFFER, GCodeBufferClass)) #define G_IS_CODE_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_CODE_BUFFER)) #define G_IS_CODE_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_CODE_BUFFER)) #define G_CODE_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_CODE_BUFFER, GCodeBufferClass)) /* Tampon pour code désassemblé (instance) */ typedef struct _GCodeBuffer GCodeBuffer; /* Tampon pour code désassemblé (classe) */ typedef struct _GCodeBufferClass GCodeBufferClass; /* Détermine le type du composant de tampon pour code désassemblé. */ GType g_code_buffer_get_type(void); /* Crée un nouveau composant de tampon pour code désassemblé. */ GCodeBuffer *g_code_buffer_new(BufferLineColumn); /* Compte le nombre de lignes rassemblées dans un tampon. */ size_t g_code_buffer_count_lines(const GCodeBuffer *); /* Fournit un lien vers la structure de suivi de largeurs. */ const GWidthTracker *g_code_buffer_get_width_tracker(const GCodeBuffer *); /* Initie une nouvelle ligne devant être insérée dans le tampon. */ GBufferLine *g_code_buffer_prepare_new_line(GCodeBuffer *, const mrange_t *); /* Ajoute une nouvelle ligne en fin de tampon. */ void g_code_buffer_append_new_line(GCodeBuffer *, GBufferLine *); /* Ajoute de nouvelles lignes par rapport à une ligne donnée. */ bool g_code_buffer_insert_lines(GCodeBuffer *, GBufferLine **, size_t, const GBufferLine *, bool); /* Supprime une ou plusieurs lignes du tampon indiqué. */ void g_code_buffer_delete_lines(GCodeBuffer *, size_t, size_t); /* FIXME */ #define g_code_buffer_append_new_line_fixme(b) \ g_code_buffer_prepare_new_line(b, (mrange_t []){ { 0, 0 }, 0 }) /* FIXME */ #define g_code_buffer_insert_at(buf, a, b) NULL /* Retrouve une ligne au sein d'un tampon avec une adresse. */ GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *, const vmpa2t *, BufferLineFlags, size_t *); /* Retrouve une ligne au sein d'un tampon avec un indice. */ GBufferLine *g_code_buffer_find_line_by_index(const GCodeBuffer *, size_t); /* Convertit une adresse en indice de ligne. */ size_t g_code_buffer_get_index_from_address(const GCodeBuffer *, const vmpa2t *, bool); /* Retrouve l'indice associé à une ligne au sein d'un tampon. */ size_t g_code_buffer_find_index_by_line(const GCodeBuffer *, const GBufferLine *); /* Augmente l'indentation des prochaines lignes. */ void g_code_buffer_inc_indentation(GCodeBuffer *); /* Diminue l'indentation des prochaines lignes. */ void g_code_buffer_dec_indentation(GCodeBuffer *); /* Traitement d'une ligne parcourue. */ typedef bool (* process_line_fc) (GCodeBuffer *, GBufferLine *, void *); /* Lance un parcours des différentes lignes du tampon de code. */ GDelayedWork *g_buffer_code_scan(GCodeBuffer *, const vmpa2t *, const vmpa2t *, const char *, process_line_fc, void *); /* ------------------------- CONFORTS POUR LES COMMENTAIRES ------------------------- */ /* Séparateur commun à tous les plateformes */ #define COMMENT_LINE_SEP "\n" /* Affiche un commentaire sur une ligne de tampon donnée. */ bool g_code_buffer_update_inlined_comment(GCodeBuffer *, GBufferLine *, const char *, GObject *); /* Affiche un commentaire sur une ligne de tampon dédiée. */ bool g_code_buffer_update_comment_area(GCodeBuffer *, GBufferLine *, const char *, bool, GObject *); /* Retrouve le créateur d'un commentaire existant. */ GObject *g_code_buffer_get_comment_creator(const GCodeBuffer *, const GBufferLine *); /* Récupère le contenu d'un commentaire existant. */ char *g_code_buffer_get_lines_comment(const GCodeBuffer *, const GBufferLine *); /* Supprime un commentaire existant. */ bool g_code_buffer_delete_lines_comment(GCodeBuffer *, GBufferLine *); /* ------------------------- SIGNAUX IMMEDIATS POUR UNE VUE ------------------------- */ /* Accompagne une variation de la quantité de lignes du tampon. */ typedef void (* buffer_size_changed_cb) (const GCodeBuffer *, bool, size_t, size_t, GObject *); /* Enregistre l'adresse d'une fonction de mise à jour de vue. */ void g_code_buffer_register_view_callback(GCodeBuffer *, buffer_size_changed_cb, GObject *); /* Supprime un élément des vues à contacter pour mises à jour. */ void g_code_buffer_unregister_view_callback(GCodeBuffer *, GObject *); #endif /* _GLIBEXT_GCODEBUFFER_H */