summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/packed.c110
-rw-r--r--src/common/packed.h6
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. */