diff options
Diffstat (limited to 'src/glibext')
-rw-r--r-- | src/glibext/gbufferline.c | 96 | ||||
-rw-r--r-- | src/glibext/gbufferline.h | 3 |
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); |