summaryrefslogtreecommitdiff
path: root/src/glibext/gbufferline.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2017-03-02 14:33:09 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2017-03-02 14:33:09 (GMT)
commitb3471e0c9ce6cc1becc9f56832fb4b93b337cb21 (patch)
treed32db80f05296ec918ad24d93634ea7d3832e49e /src/glibext/gbufferline.c
parent027305c2447b05de2c576e3f5ee32ced400f439f (diff)
Filled rendering lines with relative binary contents.
Diffstat (limited to 'src/glibext/gbufferline.c')
-rw-r--r--src/glibext/gbufferline.c96
1 files changed, 96 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. *