diff options
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/packed.c | 110 | ||||
-rw-r--r-- | src/common/packed.h | 6 |
2 files changed, 86 insertions, 30 deletions
diff --git a/src/common/packed.c b/src/common/packed.c index a8ce3c5..a10155d 100644 --- a/src/common/packed.c +++ b/src/common/packed.c @@ -241,7 +241,7 @@ bool extend_packed_buffer(packed_buffer *pbuf, const void *buf, size_t len, bool * * ******************************************************************************/ -bool extract_packed_buffer(packed_buffer *pbuf, void *buf, size_t len, bool ntoh) +bool peek_packed_buffer(packed_buffer *pbuf, void *buf, size_t len, bool ntoh) { bool result; /* Bilan à retourner */ uint16_t tmp16; /* Valeur intermédiaire 16b */ @@ -250,52 +250,102 @@ bool extract_packed_buffer(packed_buffer *pbuf, void *buf, size_t len, bool ntoh result = ((pbuf->pos + len - sizeof(uint32_t)) <= pbuf->used); + if (!result) + goto failed; + /* Conversion au formalisme du réseau */ if (!ntoh) goto skip_conversion; - if (result) + switch (len) { - switch (len) - { - case 1: - *((uint8_t *)buf) = *((uint8_t *)(pbuf->data + pbuf->pos)); - break; + case 1: + *((uint8_t *)buf) = *((uint8_t *)(pbuf->data + pbuf->pos)); + break; - case 2: - tmp16 = be16toh(*(uint16_t *)(pbuf->data + pbuf->pos)); - *((uint16_t *)buf) = tmp16; - break; + case 2: + tmp16 = be16toh(*(uint16_t *)(pbuf->data + pbuf->pos)); + *((uint16_t *)buf) = tmp16; + break; - case 4: - tmp32 = be32toh(*(uint32_t *)(pbuf->data + pbuf->pos)); - *((uint32_t *)buf) = tmp32; - break; + case 4: + tmp32 = be32toh(*(uint32_t *)(pbuf->data + pbuf->pos)); + *((uint32_t *)buf) = tmp32; + break; - case 8: - tmp64 = be64toh(*(uint64_t *)(pbuf->data + pbuf->pos)); - *((uint64_t *)buf) = tmp64; - break; + case 8: + tmp64 = be64toh(*(uint64_t *)(pbuf->data + pbuf->pos)); + *((uint64_t *)buf) = tmp64; + break; - default: + default: skip_conversion: - /** - * Dans ce cas de figure, c'est à l'appelant de s'assurer que la - * conversion a bien été réalisée. - */ - assert(!ntoh); + /** + * Dans ce cas de figure, c'est à l'appelant de s'assurer que la + * conversion a bien été réalisée. + */ + assert(!ntoh); + + memcpy(buf, pbuf->data + pbuf->pos, len); + break; - memcpy(buf, pbuf->data + pbuf->pos, len); - break; + } - } + failed: - pbuf->pos += len; + return result; - } +} + + +/****************************************************************************** +* * +* Paramètres : pbuf = paquet de données à consulter. * +* len = quantité de ces données. * +* * +* Description : Avance la tête de lecture dans les données d'un paquet. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void advance_packed_buffer(packed_buffer *pbuf, size_t len) +{ + pbuf->pos += len; + + assert((pbuf->pos - sizeof(uint32_t)) <= pbuf->used); + +} + + +/****************************************************************************** +* * +* Paramètres : pbuf = paquet de données à consulter. * +* buf = nouvelles données à définir. * +* len = quantité de ces données. * +* ntoh = indique si une conversion est à réaliser. * +* * +* Description : Récupère des données depuis un paquet après une réception. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool extract_packed_buffer(packed_buffer *pbuf, void *buf, size_t len, bool ntoh) +{ + bool result; /* Bilan à retourner */ + + result = peek_packed_buffer(pbuf, buf, len, ntoh); + + if (result) + advance_packed_buffer(pbuf, len); return result; diff --git a/src/common/packed.h b/src/common/packed.h index 4403ad0..019d21a 100644 --- a/src/common/packed.h +++ b/src/common/packed.h @@ -66,6 +66,12 @@ bool has_more_data_in_packed_buffer(const packed_buffer *); bool extend_packed_buffer(packed_buffer *, const void *, size_t, bool); /* Récupère des données depuis un paquet après une réception. */ +bool peek_packed_buffer(packed_buffer *, void *, size_t, bool); + +/* Avance la tête de lecture dans les données d'un paquet. */ +void advance_packed_buffer(packed_buffer *, size_t); + +/* Récupère des données depuis un paquet après une réception. */ bool extract_packed_buffer(packed_buffer *, void *, size_t, bool); /* Lit des données depuis un flux local. */ |