diff options
Diffstat (limited to 'src/common/leb128.c')
-rw-r--r-- | src/common/leb128.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/common/leb128.c b/src/common/leb128.c index c8d2ace..009aff6 100644 --- a/src/common/leb128.c +++ b/src/common/leb128.c @@ -24,6 +24,9 @@ #include "leb128.h" +#include "io.h" + + /****************************************************************************** * * @@ -113,6 +116,96 @@ bool read_leb128(leb128_t *target, const bin_t *data, phys_t *pos, phys_t len) /****************************************************************************** * * +* Paramètres : value = valeur à constituer. [OUT] * +* fd = flux ouvert en lecture à consulter. * +* * +* Description : Restaure un nombre non signé encodé au format LEB128. * +* * +* Retour : Bilan de l'opération : true en cas de succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool load_uleb128(uleb128_t *value, int fd) +{ + bool result; /* Bilan à retourner */ + unsigned int shift; /* Décalage à appliquer */ + uint8_t byte; /* Octet à transposer */ + + result = true; + + *value = 0; + + shift = 0; + + while (true) + { + /* Encodage sur trop d'octets ? */ + if (shift > (7 * sizeof(uleb128_t))) + { + result = false; + break; + } + + result = safe_read(fd, &byte, sizeof(uint8_t)); + if (!result) break; + + *value |= ((byte & 0x7f) << shift); + + if ((byte & 0x80) == 0x00) + break; + + shift += 7; + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : value = valeur à consigner. * +* fd = flux ouvert en écriture. * +* * +* Description : Sauvegarde un nombre non signé encodé au format LEB128. * +* * +* Retour : Bilan de l'opération : true en cas de succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool store_uleb128(const uleb128_t *value, int fd) +{ + bool result; /* Bilan à retourner */ + uleb128_t tmp; /* Valeur modifiable */ + uint8_t byte; /* Octet à transposer */ + + tmp = *value; + + do + { + byte = (tmp & 0x7f); + tmp >>= 7; + + if (tmp != 0) + byte |= 0x80; + + result = safe_write(fd, &byte, sizeof(uint8_t)); + + } + while (result && tmp != 0); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : value = valeur à consigner. * * pbuf = tampon de données à constituer. [OUT] * * * |