diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/glibext/Makefile.am | 1 | ||||
-rw-r--r-- | src/glibext/gbuffercache-int.h | 96 | ||||
-rw-r--r-- | src/glibext/gbuffercache.c | 111 | ||||
-rw-r--r-- | src/glibext/gbuffercache.h | 15 | ||||
-rw-r--r-- | src/glibext/gbufferline.c | 5 | ||||
-rw-r--r-- | src/glibext/gbufferline.h | 14 | ||||
-rw-r--r-- | src/glibext/linegen.c | 22 | ||||
-rw-r--r-- | src/glibext/linegen.h | 4 | ||||
-rw-r--r-- | src/gtkext/hexdisplay.c | 3 |
9 files changed, 178 insertions, 93 deletions
diff --git a/src/glibext/Makefile.am b/src/glibext/Makefile.am index af4f876..4739fef 100644 --- a/src/glibext/Makefile.am +++ b/src/glibext/Makefile.am @@ -11,6 +11,7 @@ libglibext_la_SOURCES = \ gbinarycursor.h gbinarycursor.c \ gbinportion-int.h \ gbinportion.h gbinportion.c \ + gbuffercache-int.h \ gbuffercache.h gbuffercache.c \ gbufferline.h gbufferline.c \ gbufferview.h gbufferview.c \ diff --git a/src/glibext/gbuffercache-int.h b/src/glibext/gbuffercache-int.h new file mode 100644 index 0000000..6886fb0 --- /dev/null +++ b/src/glibext/gbuffercache-int.h @@ -0,0 +1,96 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * gbuffercache-int.h - définitions internes d'affichage à la demande d'un ensemble de lignes + * + * Copyright (C) 2020 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 Chrysalide. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _GLIBEXT_GBUFFERCACHE_INT_H +#define _GLIBEXT_GBUFFERCACHE_INT_H + + +#include "gbuffercache.h" + + + +/* --------------------- FONCTIONS AUXILIAIRES DE MANIPULATIONS --------------------- */ + + +/* Informations rattachées à la génération d'une ligne */ +typedef struct _generator_link +{ + GLineGenerator *instance; /* Fournisseur de contenu */ + size_t repeat; /* Compteur de successions */ + +} generator_link; + +/* Suivi interne de l'état d'une ligne */ +typedef struct _cache_info +{ + union + { + generator_link generator; /* Générateur unique */ + generator_link *generators; /* Liste de générateurs */ + }; + size_t count; /* Taille de cette liste */ + + GBufferLine *line; /* Ligne en place ou NULL */ + + BufferLineFlags extra_flags; /* Propriétés supplémentaires */ + +} cache_info; + + + +/* -------------------------- TAMPON POUR CODE DESASSEMBLE -------------------------- */ + + +/* Tampon pour gestion de lignes optimisée (instance) */ +struct _GBufferCache +{ + GObject parent; /* A laisser en premier */ + + GBinContent *content; /* Contenu binaire global */ + + cache_info *lines; /* Liste des lignes intégrées */ + size_t count; /* Quantité en cache */ + size_t used; /* Quantité utilisée */ + + GWidthTracker *tracker; /* Suivi des largeurs */ + +}; + +/* Tampon pour gestion de lignes optimisée (classe) */ +struct _GBufferCacheClass +{ + GObjectClass parent; /* A laisser en premier */ + + gint line_height; /* Hauteur maximale des lignes */ + gint left_margin; /* Marge gauche + espace */ + gint text_pos; /* Début d'impression du code */ + + /* Signaux */ + + void (* size_changed) (GBufferCache *, bool, size_t, size_t); + +}; + + + +#endif /* _GLIBEXT_GBUFFERCACHE_INT_H */ diff --git a/src/glibext/gbuffercache.c b/src/glibext/gbuffercache.c index 08ca020..d918a5d 100644 --- a/src/glibext/gbuffercache.c +++ b/src/glibext/gbuffercache.c @@ -29,6 +29,7 @@ #include <stdlib.h> +#include "gbuffercache-int.h" #include "chrysamarshal.h" @@ -36,31 +37,6 @@ /* --------------------- FONCTIONS AUXILIAIRES DE MANIPULATIONS --------------------- */ -/* Informations rattachées à la génération d'une ligne */ -typedef struct _generator_link -{ - GLineGenerator *instance; /* Fournisseur de contenu */ - size_t repeat; /* Compteur de successions */ - -} generator_link; - -/* Suivi interne de l'état d'une ligne */ -typedef struct _cache_info -{ - union - { - generator_link generator; /* Générateur unique */ - generator_link *generators; /* Liste de générateurs */ - }; - size_t count; /* Taille de cette liste */ - - GBufferLine *line; /* Ligne en place ou NULL */ - - BufferLineFlags extra_flags; /* Propriétés supplémentaires */ - -} cache_info; - - /* Gros verrou global pour alléger les structures... */ G_LOCK_DEFINE_STATIC(_line_update); @@ -97,37 +73,6 @@ static void reset_cache_info_line(cache_info *); /* -------------------------- TAMPON POUR CODE DESASSEMBLE -------------------------- */ -/* Tampon pour gestion de lignes optimisée (instance) */ -struct _GBufferCache -{ - GObject parent; /* A laisser en premier */ - - GBinContent *content; /* Contenu binaire global */ - - cache_info *lines; /* Liste des lignes intégrées */ - size_t count; /* Quantité en cache */ - size_t used; /* Quantité utilisée */ - - GWidthTracker *tracker; /* Suivi des largeurs */ - -}; - -/* Tampon pour gestion de lignes optimisée (classe) */ -struct _GBufferCacheClass -{ - GObjectClass parent; /* A laisser en premier */ - - gint line_height; /* Hauteur maximale des lignes */ - gint left_margin; /* Marge gauche + espace */ - gint text_pos; /* Début d'impression du code */ - - /* Signaux */ - - void (* size_changed) (GBufferCache *, bool, size_t, size_t); - -}; - - /* Taille des allocations de masse */ #define LINE_ALLOC_BULK 1000 @@ -388,7 +333,7 @@ static void get_cache_info_cursor(const cache_info *info, size_t index, gint x, else generator = &info->generators[0]; - g_line_generator_compute_cursor(generator->instance, x, index, generator->repeat, cursor); + *cursor = g_line_generator_compute_cursor(generator->instance, x, index, generator->repeat); } @@ -586,6 +531,12 @@ static void g_buffer_cache_class_init(GBufferCacheClass *class) static void g_buffer_cache_init(GBufferCache *cache) { + cache->content = NULL; + + cache->lines = NULL; + cache->count = 0; + cache->used = 0; + cache->tracker = g_width_tracker_new(cache); } @@ -723,6 +674,32 @@ gint g_buffer_cache_get_line_height(const GBufferCache *cache) * * * Paramètres : cache = tampon de lignes à consulter. * * * +* Description : Indique l'éventuel contenu binaire associé au cache. * +* * +* Retour : Eventuel contenu renseigné ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBinContent *g_buffer_cache_get_content(const GBufferCache *cache) +{ + GBinContent *result; /* Contenu à retourner */ + + result = cache->content; + + if (result != NULL) + g_object_ref(G_OBJECT(result)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : cache = tampon de lignes à consulter. * +* * * Description : Fournit la taille réservée pour la marge gauche. * * * * Retour : Largeur en pixels. * @@ -895,14 +872,14 @@ void g_buffer_cache_insert_at(GBufferCache *cache, size_t index, GLineGenerator if (!before && !after) { - g_line_generator_compute_cursor(generator, 0, index, 0, &gen_cursor); + gen_cursor = g_line_generator_compute_cursor(generator, 0, index, 0); get_cache_info_cursor(&cache->lines[index], index, 0, &line_cursor); ret = g_line_cursor_compare(gen_cursor, line_cursor); - g_object_unref(G_OBJECT(gen_cursor)); g_object_unref(G_OBJECT(line_cursor)); + g_object_unref(G_OBJECT(gen_cursor)); assert(ret == 0); @@ -1264,8 +1241,6 @@ void g_buffer_cache_extend_with(GBufferCache *cache, size_t count, GLineGenerato cache->used = count; - g_object_unref(G_OBJECT(generator)); - if (added > 0) { g_width_tracker_update_added(cache->tracker, index, added); @@ -1297,8 +1272,6 @@ void g_buffer_cache_truncate(GBufferCache *cache, size_t max) size_t j; /* Boucle de parcours #2 */ size_t removed; /* Nombre de retraits effectués*/ - assert(max <= cache->used); - for (i = max; i < cache->used; i++) { info = &cache->lines[i]; @@ -1319,12 +1292,12 @@ void g_buffer_cache_truncate(GBufferCache *cache, size_t max) } - removed = cache->used - max; + if (max < cache->used) + { + removed = cache->used - max; - cache->used = max; + cache->used = max; - if (removed > 0) - { g_width_tracker_update_deleted(cache->tracker, max, max + removed - 1); g_signal_emit_by_name(cache, "size-changed", false, max, removed); @@ -1378,6 +1351,8 @@ BufferLineFlags g_buffer_cache_get_line_flags(const GBufferCache *cache, size_t const generator_link *generator; /* Générateur retenu */ size_t i; /* Boucle de parcours */ + // TODO : check lock + assert(index < cache->used); info = &cache->lines[index]; @@ -1650,6 +1625,8 @@ size_t g_buffer_cache_look_for_flag(const GBufferCache *cache, size_t start, Buf GLineCursor *next; /* Localisation suivante */ int ret; /* Bilan de comparaison */ + // TODO : check lock + assert(start < cache->used); result = start; diff --git a/src/glibext/gbuffercache.h b/src/glibext/gbuffercache.h index 58516b2..79158c4 100644 --- a/src/glibext/gbuffercache.h +++ b/src/glibext/gbuffercache.h @@ -39,12 +39,12 @@ /* -------------------------- TAMPON POUR CODE DESASSEMBLE -------------------------- */ -#define G_TYPE_BUFFER_CACHE (g_buffer_cache_get_type()) -#define G_BUFFER_CACHE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_CODE_BUFFER, GBufferCache)) -#define G_BUFFER_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_CODE_BUFFER, GBufferCacheClass)) -#define G_IS_BUFFER_CACHE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_CODE_BUFFER)) -#define G_IS_BUFFER_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_CODE_BUFFER)) -#define G_BUFFER_CACHE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_CODE_BUFFER, GBufferCacheClass)) +#define G_TYPE_BUFFER_CACHE g_buffer_cache_get_type() +#define G_BUFFER_CACHE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_BUFFER_CACHE, GBufferCache)) +#define G_BUFFER_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BUFFER_CACHE, GBufferCacheClass)) +#define G_IS_BUFFER_CACHE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_BUFFER_CACHE)) +#define G_IS_BUFFER_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BUFFER_CACHE)) +#define G_BUFFER_CACHE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BUFFER_CACHE, GBufferCacheClass)) /* Tampon pour gestion de lignes optimisée (instance) */ @@ -60,6 +60,9 @@ GType g_buffer_cache_get_type(void); /* Crée un nouveau composant de tampon pour code désassemblé. */ GBufferCache *g_buffer_cache_new(GBinContent *); +/* Indique l'éventuel contenu binaire associé au cache. */ +GBinContent *g_buffer_cache_get_content(const GBufferCache *); + /* Fournit la hauteur d'impression d'une ligne visualisée. */ gint g_buffer_cache_get_line_height(const GBufferCache *); diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c index 9b0a5a9..e3482aa 100644 --- a/src/glibext/gbufferline.c +++ b/src/glibext/gbufferline.c @@ -546,13 +546,16 @@ GObject *g_buffer_line_find_first_segment_creator(const GBufferLine *line, Buffe * * ******************************************************************************/ -void g_buffer_line_append_text(GBufferLine *line, BufferLineColumn column, const char *text, size_t length, RenderingTagType type, GObject *creator) +void g_buffer_line_append_text(GBufferLine *line, size_t column, const char *text, size_t length, RenderingTagType type, GObject *creator) { size_t index; /* Indice d'insertion */ content_origin *origin; /* Définition d'une origine */ assert(length > 0); + if (column == -1) + column = BLC_LAST_USED; + if (column == BLC_MAIN) column = BLC_ASSEMBLY;//line->main_column; diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h index e3d4894..11790fe 100644 --- a/src/glibext/gbufferline.h +++ b/src/glibext/gbufferline.h @@ -36,12 +36,12 @@ -#define G_TYPE_BUFFER_LINE (g_buffer_line_get_type()) -#define G_BUFFER_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_BUFFER_LINE, GBufferLine)) -#define G_BUFFER_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BUFFER_LINE, GBufferLineClass)) -#define G_IS_BUFFER_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_BUFFER_LINE)) -#define G_IS_BUFFER_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BUFFER_LINE)) -#define G_BUFFER_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BUFFER_LINE, GBufferLineClass)) +#define G_TYPE_BUFFER_LINE g_buffer_line_get_type() +#define G_BUFFER_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_BUFFER_LINE, GBufferLine)) +#define G_BUFFER_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BUFFER_LINE, GBufferLineClass)) +#define G_IS_BUFFER_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_BUFFER_LINE)) +#define G_IS_BUFFER_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BUFFER_LINE)) +#define G_BUFFER_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BUFFER_LINE, GBufferLineClass)) /* Représentation de fragments de texte en ligne (instance) */ @@ -124,7 +124,7 @@ void g_buffer_line_fill_content(GBufferLine *, const GBinContent *, const mrange GObject *g_buffer_line_find_first_segment_creator(const GBufferLine *, BufferLineColumn); /* Ajoute du texte à formater dans une ligne donnée. */ -void g_buffer_line_append_text(GBufferLine *, BufferLineColumn, const char *, size_t, RenderingTagType, GObject *); +void g_buffer_line_append_text(GBufferLine *, size_t, const char *, size_t, RenderingTagType, GObject *); /* Remplace du texte dans une ligne donnée. */ bool g_buffer_line_replace_text(GBufferLine *, const GObject *, const char *, size_t); diff --git a/src/glibext/linegen.c b/src/glibext/linegen.c index 67b348a..42915ee 100644 --- a/src/glibext/linegen.c +++ b/src/glibext/linegen.c @@ -90,18 +90,18 @@ size_t g_line_generator_count_lines(const GLineGenerator *generator) * x = position géographique sur la ligne concernée. * * index = indice de cette même ligne dans le tampon global.* * repeat = indice d'utilisations successives du générateur. * -* cursor = emplacement à constituer. [OUT] * * * * Description : Retrouve l'emplacement correspondant à une position donnée. * * * -* Retour : - * +* Retour : Emplacement constitué. * * * * Remarques : - * * * ******************************************************************************/ -void g_line_generator_compute_cursor(const GLineGenerator *generator, gint x, size_t index, size_t repeat, GLineCursor **cursor) +GLineCursor *g_line_generator_compute_cursor(const GLineGenerator *generator, gint x, size_t index, size_t repeat) { + GLineCursor *result; /* Emplacement à renvoyer */ GLineGeneratorIface *iface; /* Interface utilisée */ iface = G_LINE_GENERATOR_GET_IFACE(generator); @@ -111,7 +111,9 @@ void g_line_generator_compute_cursor(const GLineGenerator *generator, gint x, si assert(repeat < g_line_generator_count_lines(generator)); #endif - iface->compute(generator, x, index, repeat, cursor); + iface->compute(generator, x, index, repeat, &result); + + return result; } @@ -133,6 +135,7 @@ void g_line_generator_compute_cursor(const GLineGenerator *generator, gint x, si int g_line_generator_contains_cursor(const GLineGenerator *generator, size_t index, size_t repeat, const GLineCursor *cursor) { + int result; /* Bilan d'analyse à retourner */ GLineGeneratorIface *iface; /* Interface utilisée */ iface = G_LINE_GENERATOR_GET_IFACE(generator); @@ -142,7 +145,9 @@ int g_line_generator_contains_cursor(const GLineGenerator *generator, size_t ind assert(repeat < g_line_generator_count_lines(generator)); #endif - return iface->contains(generator, index, repeat, cursor); + result = iface->contains(generator, index, repeat, cursor); + + return result; } @@ -163,6 +168,7 @@ int g_line_generator_contains_cursor(const GLineGenerator *generator, size_t ind BufferLineFlags g_line_generator_get_flags(const GLineGenerator *generator, size_t index, size_t repeat) { + BufferLineFlags result; /* Fanions à retourner */ GLineGeneratorIface *iface; /* Interface utilisée */ iface = G_LINE_GENERATOR_GET_IFACE(generator); @@ -172,7 +178,9 @@ BufferLineFlags g_line_generator_get_flags(const GLineGenerator *generator, size assert(repeat < g_line_generator_count_lines(generator)); #endif - return iface->get_flags(generator, index, repeat); + result = iface->get_flags(generator, index, repeat); + + return result; } @@ -204,6 +212,6 @@ void g_line_generator_print(GLineGenerator *generator, GBufferLine *line, size_t assert(repeat < g_line_generator_count_lines(generator)); #endif - return iface->print(generator, line, index, repeat, content); + iface->print(generator, line, index, repeat, content); } diff --git a/src/glibext/linegen.h b/src/glibext/linegen.h index cb2e1fd..967e95e 100644 --- a/src/glibext/linegen.h +++ b/src/glibext/linegen.h @@ -34,7 +34,7 @@ -#define G_TYPE_LINE_GENERATOR (g_line_generator_get_type()) +#define G_TYPE_LINE_GENERATOR g_line_generator_get_type() #define G_LINE_GENERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_LINE_GENERATOR, GLineGenerator)) #define G_LINE_GENERATOR_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), G_TYPE_LINE_GENERATOR, GLineGeneratorIface)) #define GTK_IS_LINE_GENERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_LINE_GENERATOR)) @@ -56,7 +56,7 @@ GType g_line_generator_get_type(void) G_GNUC_CONST; size_t g_line_generator_count_lines(const GLineGenerator *); /* Retrouve l'emplacement correspondant à une position donnée. */ -void g_line_generator_compute_cursor(const GLineGenerator *, gint, size_t, size_t, GLineCursor **); +GLineCursor *g_line_generator_compute_cursor(const GLineGenerator *, gint, size_t, size_t); /* Détermine si le conteneur s'inscrit dans une plage donnée. */ int g_line_generator_contains_cursor(const GLineGenerator *, size_t, size_t, const GLineCursor *); diff --git a/src/gtkext/hexdisplay.c b/src/gtkext/hexdisplay.c index 685fc81..0f0bd30 100644 --- a/src/gtkext/hexdisplay.c +++ b/src/gtkext/hexdisplay.c @@ -321,10 +321,7 @@ static void gtk_hex_display_populate_cache(GtkHexDisplay *display) g_buffer_cache_truncate(display->cache, needed); else if (needed > count) - { - g_object_ref(G_OBJECT(display->generator)); g_buffer_cache_extend_with(display->cache, needed, G_LINE_GENERATOR(display->generator)); - } if (needed != count) gtk_widget_queue_resize(GTK_WIDGET(display)); |