diff options
Diffstat (limited to 'src/analysis/contents/file.c')
-rw-r--r-- | src/analysis/contents/file.c | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/src/analysis/contents/file.c b/src/analysis/contents/file.c index 95cfd5d..e7bebd0 100644 --- a/src/analysis/contents/file.c +++ b/src/analysis/contents/file.c @@ -85,6 +85,9 @@ static void g_file_content_compute_checksum(GFileContent *, GChecksum *); /* Détermine le nombre d'octets lisibles. */ static phys_t g_file_content_compute_size(const GFileContent *); +/* Avance la tête de lecture d'une certaine quantité de données. */ +static bool g_file_content_seek(const GFileContent *, vmpa2t *, phys_t); + /* Donne accès à une portion des données représentées. */ static const bin_t *g_file_content_get_raw_access(const GFileContent *, vmpa2t *, phys_t); @@ -183,6 +186,8 @@ static void g_file_content_interface_init(GBinContentInterface *iface) iface->compute_size = (compute_size_fc)g_file_content_compute_size; + iface->seek = (seek_fc)g_file_content_seek; + iface->get_raw_access = (get_raw_access_fc)g_file_content_get_raw_access; iface->read_raw = (read_raw_fc)g_file_content_read_raw; @@ -479,31 +484,59 @@ static phys_t g_file_content_compute_size(const GFileContent *content) * * * Paramètres : content = contenu binaire à venir lire. * * addr = position de la tête de lecture. * -* length = quantité d'octets à lire. * +* length = quantité d'octets à provisionner. * * * -* Description : Donne accès à une portion des données représentées. * +* Description : Avance la tête de lecture d'une certaine quantité de données.* * * -* Retour : Pointeur vers les données à lire ou NULL en cas d'échec. * +* Retour : Bilan de l'opération : true en cas de succès, false sinon. * * * * Remarques : - * * * ******************************************************************************/ -static const bin_t *g_file_content_get_raw_access(const GFileContent *content, vmpa2t *addr, phys_t length) +static bool g_file_content_seek(const GFileContent *content, vmpa2t *addr, phys_t length) { phys_t offset; /* Emplacement de départ */ offset = get_phy_addr(addr); if (offset == VMPA_NO_PHYSICAL) - return NULL; + return false; if ((offset + length) >= get_mrange_length(&content->range)) - return NULL; + return false; advance_vmpa(addr, length); - return &content->data[offset]; + return true; + +} + + +/****************************************************************************** +* * +* Paramètres : content = contenu binaire à venir lire. * +* addr = position de la tête de lecture. * +* length = quantité d'octets à lire. * +* * +* Description : Donne accès à une portion des données représentées. * +* * +* Retour : Pointeur vers les données à lire ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static const bin_t *g_file_content_get_raw_access(const GFileContent *content, vmpa2t *addr, phys_t length) +{ + phys_t offset; /* Emplacement de départ */ + bool allowed; /* Capacité d'avancer ? */ + + offset = get_phy_addr(addr); + + allowed = g_file_content_seek(content, addr, length); + + return (allowed ? &content->data[offset] : NULL); } |