diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2014-08-20 20:48:19 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2014-08-20 20:48:19 (GMT) |
commit | b1738d682ea2bd7260438c543f30442cbc73a42c (patch) | |
tree | 84cb35f8fd1e565517e4e4a2b3993f2acb3eeffe /src/glibext/gbufferline.c | |
parent | 2425953ed7330c8f92ec7d04a5f248db1ed98a9d (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.c | 48 |
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); } |