summaryrefslogtreecommitdiff
path: root/src/glibext/gbufferline.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-08-20 20:48:19 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-08-20 20:48:19 (GMT)
commitb1738d682ea2bd7260438c543f30442cbc73a42c (patch)
tree84cb35f8fd1e565517e4e4a2b3993f2acb3eeffe /src/glibext/gbufferline.c
parent2425953ed7330c8f92ec7d04a5f248db1ed98a9d (diff)
Rewritten some parts of code to increase the binary processing speed.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@391 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext/gbufferline.c')
-rw-r--r--src/glibext/gbufferline.c48
1 files changed, 42 insertions, 6 deletions
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c
index fbca259..6e06fe4 100644
--- a/src/glibext/gbufferline.c
+++ b/src/glibext/gbufferline.c
@@ -419,12 +419,17 @@ void g_buffer_line_fill_for_instr(GBufferLine *line, MemoryDataSize psize, Memor
{
size_t len; /* Taille de l'élément inséré */
VMPA_BUFFER(address); /* Adresse au format texte */
- char *bin_code; /* Tampon du code binaire */
+ size_t required; /* Taille de traitement requise*/
+ char static_buffer[64]; /* Petit tampon local rapide */
+ char *bin_code; /* Tampon utilisé pour le code */
off_t start; /* Début de traitement */
off_t end; /* Limite de traitement */
off_t i; /* Boucle de parcours #1 */
char *iter; /* Boucle de parcours #2 */
int ret; /* Progression dans l'écriture */
+ bin_t byte; /* Octet à représenter */
+
+ static const char *charset = "0123456789abcdef";
/* Adresse physique puis virtuelle */
@@ -434,25 +439,56 @@ void g_buffer_line_fill_for_instr(GBufferLine *line, MemoryDataSize psize, Memor
vmpa2_virt_to_string(line->addr, vsize, address, &len);
g_buffer_line_insert_text(line, BLC_VIRTUAL, address, len, RTT_RAW);
- /* Code brut */
+ /* Détermination du réceptacle */
+
+ required = length * 3 + 3;
+
+ if (required <= sizeof(static_buffer))
+ bin_code = static_buffer;
+ else
+ bin_code = (char *)calloc(required, sizeof(char));
- bin_code = (char *)calloc(length * 3 + 3, sizeof(char));
+ /* Code brut */
start = get_phy_addr(line->addr);
end = start + length;
for (i = start, iter = bin_code; i < end; i++, iter += ret)
{
+ byte = content[i];
+
+ iter[0] = charset[byte >> 4];
+ iter[1] = charset[byte & 0x0f];
+
if ((i + 1) < end)
- ret = snprintf(iter, 4, "%02hhx ", content[i]);
+ {
+ iter[2] = ' ';
+ ret = 3;
+ }
+
else
- ret = snprintf(iter, 6, "%02hhx%s", content[i], full ? "" : "...");
+ {
+ if (full)
+ {
+ iter[2] = '\0';
+ ret = 2;
+ }
+ else
+ {
+ strcpy(iter + 2, "...");
+ ret = 5;
+ }
+
+ }
}
+ /* Conclusion */
+
g_buffer_line_insert_text(line, BLC_BINARY, bin_code, iter - bin_code, RTT_RAW_CODE);
- free(bin_code);
+ if (bin_code != static_buffer)
+ free(bin_code);
}