summaryrefslogtreecommitdiff
path: root/src/glibext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-07-24 18:43:55 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-07-24 18:43:55 (GMT)
commit156d2e2f6beda2302552ac79678494d914fda05b (patch)
tree021825960b7ac3315a336fc085a4f1d07c05df39 /src/glibext
parent21537636cd8318cf5a720211619ad3c3023b52e9 (diff)
Replaced all remaining raw accesses to binary contents with the GBinContent wrapper in binary formats.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@555 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext')
-rw-r--r--src/glibext/gbincontent.c53
-rw-r--r--src/glibext/gbincontent.h6
-rw-r--r--src/glibext/gbufferline.c38
-rw-r--r--src/glibext/gbufferline.h3
4 files changed, 71 insertions, 29 deletions
diff --git a/src/glibext/gbincontent.c b/src/glibext/gbincontent.c
index 4ea0b03..0230e70 100644
--- a/src/glibext/gbincontent.c
+++ b/src/glibext/gbincontent.c
@@ -363,30 +363,64 @@ static const binary_part *g_binary_content_find_part(const GBinContent *content,
* Paramètres : content = contenu binaire à venir lire. *
* addr = position de la tête de lecture. *
* length = quantité d'octets à lire. *
-* out = réceptacle disponible pour ces données. [OUT] *
* *
-* Description : Fournit une portion des données représentées. *
+* Description : Donne accès à une portion des données représentées. *
* *
-* Retour : Bilan de l'opération. *
+* Retour : Pointeur vers les données à lire ou NULL en cas d'échec. *
* *
* Remarques : - *
* *
******************************************************************************/
-bool g_binary_content_get_raw(const GBinContent *content, vmpa2t *addr, phys_t length, bin_t *out)
+const bin_t *g_binary_content_get_raw_access(const GBinContent *content, vmpa2t *addr, phys_t length)
{
- bool result;
- phys_t offset;
+ phys_t offset; /* Emplacement de départ */
/* FIXME */
offset = get_phy_addr(addr);
- memcpy(out, &content->parts[0].data[offset], length);
+ if ((offset + length) >= get_mrange_length(&content->parts[0].range))
+ return NULL;
advance_vmpa(addr, length);
- return true;
+ return &content->parts[0].data[offset];
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : content = contenu binaire à venir lire. *
+* addr = position de la tête de lecture. *
+* length = quantité d'octets à lire. *
+* out = réceptacle disponible pour ces données. [OUT] *
+* *
+* Description : Fournit une portion des données représentées. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_binary_content_get_raw(const GBinContent *content, vmpa2t *addr, phys_t length, bin_t *out)
+{
+ bool result; /* Bilan à remonter */
+ const bin_t *data; /* Pointeur vers données utiles*/
+
+ data = g_binary_content_get_raw_access(content, addr, length);
+
+ if (data != NULL)
+ {
+ result = true;
+ memcpy(out, data, length);
+ }
+ else
+ result = false;
+
+ return result;
}
@@ -447,7 +481,6 @@ bool g_binary_content_read_u4(const GBinContent *content, vmpa2t *addr, bool *lo
* *
* Paramètres : content = contenu binaire à venir lire. *
* addr = position de la tête de lecture. *
-* endian = ordre des bits dans la source. *
* val = lieu d'enregistrement de la lecture. [OUT] *
* *
* Description : Lit un nombre non signé sur un octet. *
@@ -458,7 +491,7 @@ bool g_binary_content_read_u4(const GBinContent *content, vmpa2t *addr, bool *lo
* *
******************************************************************************/
-bool g_binary_content_read_u8(const GBinContent *content, vmpa2t *addr, SourceEndian endian, uint8_t *val)
+bool g_binary_content_read_u8(const GBinContent *content, vmpa2t *addr, uint8_t *val)
{
phys_t start; /* Tête de lecture relative */
const binary_part *part; /* Zone de mémoire effective */
diff --git a/src/glibext/gbincontent.h b/src/glibext/gbincontent.h
index 9dd7264..b1e9ec1 100644
--- a/src/glibext/gbincontent.h
+++ b/src/glibext/gbincontent.h
@@ -62,6 +62,8 @@ const gchar *g_binary_content_get_cheksum(GBinContent *);
/* Détermine le nombre d'octets lisibles. */
phys_t g_binary_content_compute_size(const GBinContent *);
+/* Donne accès à une portion des données représentées. */
+const bin_t *g_binary_content_get_raw_access(const GBinContent *, vmpa2t *, phys_t);
/* Fournit une portion des données représentées. */
bool g_binary_content_get_raw(const GBinContent *, vmpa2t *, phys_t, bin_t *);
@@ -72,7 +74,7 @@ bool g_binary_content_get_raw(const GBinContent *, vmpa2t *, phys_t, bin_t *);
bool g_binary_content_read_u4(const GBinContent *, vmpa2t *, bool *, SourceEndian, uint8_t *);
/* Lit un nombre non signé sur un octet. */
-bool g_binary_content_read_u8(const GBinContent *, vmpa2t *, SourceEndian, uint8_t *);
+bool g_binary_content_read_u8(const GBinContent *, vmpa2t *, uint8_t *);
/* Lit un nombre non signé sur deux octets. */
bool g_binary_content_read_u16(const GBinContent *, vmpa2t *, SourceEndian, uint16_t *);
@@ -85,7 +87,7 @@ bool g_binary_content_read_u64(const GBinContent *, vmpa2t *, SourceEndian, uint
#define g_binary_content_read_s4(c, a, l, e, v) g_binary_content_read_u4(c, a, l, e, (uint8_t *)v)
-#define g_binary_content_read_s8(c, a, e, v) g_binary_content_read_u8(c, a, e, (uint8_t *)v)
+#define g_binary_content_read_s8(c, a, v) g_binary_content_read_u8(c, a, (uint8_t *)v)
#define g_binary_content_read_s16(c, a, e, v) g_binary_content_read_u16(c, a, e, (uint16_t *)v)
#define g_binary_content_read_s32(c, a, e, v) g_binary_content_read_u32(c, a, e, (uint32_t *)v)
#define g_binary_content_read_s64(c, a, e, v) g_binary_content_read_u64(c, a, e, (uint64_t *)v)
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c
index 238bfb3..859b6ac 100644
--- a/src/glibext/gbufferline.c
+++ b/src/glibext/gbufferline.c
@@ -621,8 +621,7 @@ void g_buffer_line_fill_mrange(GBufferLine *line, MemoryDataSize psize, MemoryDa
* 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. *
-* content = contenu binaire global. *
-* length = taille de l'extrait de code à afficher. *
+* content = contenu binaire global à venir lire. *
* full = la portion est assez courte pour être entière ? *
* *
* Description : Construit le tronc commun d'une ligne d'instruction. *
@@ -633,17 +632,17 @@ void g_buffer_line_fill_mrange(GBufferLine *line, MemoryDataSize psize, MemoryDa
* *
******************************************************************************/
-void g_buffer_line_fill_for_instr(GBufferLine *line, MemoryDataSize psize, MemoryDataSize vsize, const bin_t *content, off_t length, bool full)
+void g_buffer_line_fill_for_instr(GBufferLine *line, MemoryDataSize psize, MemoryDataSize vsize, const GBinContent *content, bool full)
{
+ phys_t length; /* Taille de la couverture */
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 */
+ 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 */
- bin_t byte; /* Octet à représenter */
+ uint8_t byte; /* Octet à représenter */
static const char *charset = "0123456789abcdef";
@@ -653,6 +652,8 @@ void g_buffer_line_fill_for_instr(GBufferLine *line, MemoryDataSize psize, Memor
/* Détermination du réceptacle */
+ length = get_mrange_length(&line->range);
+
required = length * 3 + 3;
if (required <= sizeof(static_buffer))
@@ -662,17 +663,22 @@ void g_buffer_line_fill_for_instr(GBufferLine *line, MemoryDataSize psize, Memor
/* Code brut */
- start = get_phy_addr(get_mrange_addr(&line->range));
- end = start + length;
+ copy_vmpa(&pos, get_mrange_addr(&line->range));
- for (i = start, iter = bin_code; i < end; i++, iter += ret)
+ for (i = 0, iter = bin_code; i < length; i++, iter += ret)
{
- byte = content[i];
-
- iter[0] = charset[byte >> 4];
- iter[1] = charset[byte & 0x0f];
+ if (!g_binary_content_read_u8(content, &pos, &byte))
+ {
+ iter[0] = '?';
+ iter[1] = '?';
+ }
+ else
+ {
+ iter[0] = charset[byte >> 4];
+ iter[1] = charset[byte & 0x0f];
+ }
- if ((i + 1) < end)
+ if ((i + 1) < length)
{
iter[2] = ' ';
ret = 3;
diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h
index 3a47ee7..e9e6fae 100644
--- a/src/glibext/gbufferline.h
+++ b/src/glibext/gbufferline.h
@@ -29,6 +29,7 @@
#include <stdbool.h>
+#include "gbincontent.h"
#include "gbuffersegment.h"
#include "../arch/archbase.h"
#include "../arch/vmpa.h"
@@ -109,7 +110,7 @@ const mrange_t *g_buffer_line_get_range(const GBufferLine *);
void g_buffer_line_fill_mrange(GBufferLine *, MemoryDataSize, MemoryDataSize);
/* Construit le tronc commun d'une ligne d'instruction. */
-void g_buffer_line_fill_for_instr(GBufferLine *, MemoryDataSize, MemoryDataSize, const bin_t *, off_t, bool);
+void g_buffer_line_fill_for_instr(GBufferLine *, MemoryDataSize, MemoryDataSize, const GBinContent *, bool);
/* Ajoute un fragment de texte à une colonne de ligne. */
void g_buffer_line_add_segment(GBufferLine *, BufferLineColumn, GBufferSegment *) __attribute__ ((deprecated));