summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/glibext/Makefile.am1
-rw-r--r--src/glibext/gbuffercache-int.h96
-rw-r--r--src/glibext/gbuffercache.c111
-rw-r--r--src/glibext/gbuffercache.h15
-rw-r--r--src/glibext/gbufferline.c5
-rw-r--r--src/glibext/gbufferline.h14
-rw-r--r--src/glibext/linegen.c22
-rw-r--r--src/glibext/linegen.h4
-rw-r--r--src/gtkext/hexdisplay.c3
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));