summaryrefslogtreecommitdiff
path: root/src/glibext
diff options
context:
space:
mode:
Diffstat (limited to 'src/glibext')
-rw-r--r--src/glibext/gbufferline.c96
-rw-r--r--src/glibext/gbufferline.h3
2 files changed, 99 insertions, 0 deletions
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c
index 5a7e53d..d9e974c 100644
--- a/src/glibext/gbufferline.c
+++ b/src/glibext/gbufferline.c
@@ -392,6 +392,102 @@ void g_buffer_line_fill_vmpa(GBufferLine *line, const vmpa2t *addr, MemoryDataSi
/******************************************************************************
* *
+* Paramètres : line = ligne à venir compléter. *
+* content = contenu binaire global à venir lire. *
+* range = localisation des données à venir lire et présenter.*
+* max = taille maximale de la portion binaire en octets. *
+* *
+* Description : Construit le tronc commun d'une ligne autour de son contenu. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_buffer_line_fill_content(GBufferLine *line, const GBinContent *content, const mrange_t *range, phys_t max)
+{
+ phys_t length; /* Taille de la couverture */
+ bool truncated; /* Indique si le code est coupé*/
+ size_t required; /* Taille de traitement requise*/
+ char static_buffer[64]; /* Petit tampon local rapide */
+ char *bin_code; /* Tampon utilisé pour le code */
+ vmpa2t pos; /* Boucle de parcours #1 */
+ phys_t i; /* Boucle de parcours #2 */
+ char *iter; /* Boucle de parcours #3 */
+ int ret; /* Progression dans l'écriture */
+ uint8_t byte; /* Octet à représenter */
+
+ static const char *charset = "0123456789abcdef";
+
+ /* Détermination du réceptacle */
+
+ length = get_mrange_length(range);
+
+ truncated = (max != VMPA_NO_PHYSICAL && length > max);
+
+ if (truncated)
+ {
+ length = max;
+ required = length * 3 + 4 /* "..." */ + 1;
+ }
+ else
+ required = length * 3 + 1;
+
+ if (required <= sizeof(static_buffer))
+ bin_code = static_buffer;
+ else
+ bin_code = (char *)calloc(required, sizeof(char));
+
+ /* Code brut */
+
+ copy_vmpa(&pos, get_mrange_addr(range));
+
+ for (i = 0, iter = bin_code; i < length; i++, iter += ret)
+ {
+ if (i == 0)
+ ret = 0;
+ else
+ {
+ iter[0] = ' ';
+ ret = 1;
+ }
+
+ if (!g_binary_content_read_u8(content, &pos, &byte))
+ {
+ iter[ret + 0] = '?';
+ iter[ret + 1] = '?';
+ }
+ else
+ {
+ iter[ret + 0] = charset[byte >> 4];
+ iter[ret + 1] = charset[byte & 0x0f];
+ }
+
+ ret += 2;
+
+ }
+
+ if (truncated)
+ {
+ strcpy(iter, "...");
+ iter += 3;
+ }
+ else
+ *iter = '\0';
+
+ /* Conclusion */
+
+ g_buffer_line_append_text(line, BLC_BINARY, bin_code, iter - bin_code, RTT_RAW_CODE, NULL);
+
+ if (bin_code != static_buffer)
+ free(bin_code);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : line = ligne à venir compléter. *
* psize = taille souhaitée de l'impression des positions. *
* vsize = taille souhaitée de l'impression des adresses. *
diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h
index 3095086..9478404 100644
--- a/src/glibext/gbufferline.h
+++ b/src/glibext/gbufferline.h
@@ -117,6 +117,9 @@ void g_buffer_line_fill_virt(GBufferLine *, MemoryDataSize, const vmpa2t *);
/* Construit le tronc commun d'une ligne autour de sa position. */
void g_buffer_line_fill_vmpa(GBufferLine *, const vmpa2t *, MemoryDataSize, MemoryDataSize);
+/* Construit le tronc commun d'une ligne autour de son contenu. */
+void g_buffer_line_fill_content(GBufferLine *, const GBinContent *, const mrange_t *, phys_t);
+
/* Construit le tronc commun d'une ligne autour de sa position. */
void g_buffer_line_fill_mrange(GBufferLine *, MemoryDataSize, MemoryDataSize);