summaryrefslogtreecommitdiff
path: root/src/common/bits.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2024-06-24 21:55:03 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2024-06-24 21:55:03 (GMT)
commit1e30e2c3822f55848e2306e59a2e66d7285f6b78 (patch)
tree7a0fd0bce0f27dceb19b0596cc7a00962c3435ad /src/common/bits.c
parentd49b837c891e0490167b51c4a9811cb2e8276588 (diff)
Create functions suitable for [un]setting only one bit.
Diffstat (limited to 'src/common/bits.c')
-rw-r--r--src/common/bits.c82
1 files changed, 78 insertions, 4 deletions
diff --git a/src/common/bits.c b/src/common/bits.c
index 37e3141..91872e1 100644
--- a/src/common/bits.c
+++ b/src/common/bits.c
@@ -442,6 +442,34 @@ void set_all_in_bit_field(bitfield_t *field)
* *
* Paramètres : field = champ de bits à modifier. *
* first = indice du premier bit à traiter. *
+* *
+* Description : Bascule à 0 une partie d'un champ de bits. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void reset_in_bit_field(bitfield_t *field, size_t first)
+{
+ size_t index; /* Cellule de tableau visée */
+ size_t remaining; /* Nombre de bits restants */
+
+ assert(first < field->length);
+
+ index = first / (sizeof(unsigned long) * 8);
+ remaining = first % (sizeof(unsigned long) * 8);
+
+ field->bits[index] &= ~(1ul << remaining);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : field = champ de bits à modifier. *
+* first = indice du premier bit à traiter. *
* count = nombre de bits à marquer. *
* *
* Description : Bascule à 0 une partie d'un champ de bits. *
@@ -452,7 +480,7 @@ void set_all_in_bit_field(bitfield_t *field)
* *
******************************************************************************/
-void reset_in_bit_field(bitfield_t *field, size_t first, size_t count)
+void reset_multi_in_bit_field(bitfield_t *field, size_t first, size_t count)
{
size_t last; /* Point d'arrêt de la boucle */
size_t i; /* Boucle de parcours */
@@ -479,6 +507,34 @@ void reset_in_bit_field(bitfield_t *field, size_t first, size_t count)
* *
* Paramètres : field = champ de bits à modifier. *
* first = indice du premier bit à traiter. *
+* *
+* Description : Bascule à 1 une partie d'un champ de bits. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void set_in_bit_field(bitfield_t *field, size_t first)
+{
+ size_t index; /* Cellule de tableau visée */
+ size_t remaining; /* Nombre de bits restants */
+
+ assert(first < field->length);
+
+ index = first / (sizeof(unsigned long) * 8);
+ remaining = first % (sizeof(unsigned long) * 8);
+
+ field->bits[index] |= (1ul << remaining);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : field = champ de bits à modifier. *
+* first = indice du premier bit à traiter. *
* count = nombre de bits à marquer. *
* *
* Description : Bascule à 1 une partie d'un champ de bits. *
@@ -489,7 +545,7 @@ void reset_in_bit_field(bitfield_t *field, size_t first, size_t count)
* *
******************************************************************************/
-void set_in_bit_field(bitfield_t *field, size_t first, size_t count)
+void set_multi_in_bit_field(bitfield_t *field, size_t first, size_t count)
{
size_t last; /* Point d'arrêt de la boucle */
size_t i; /* Boucle de parcours */
@@ -805,9 +861,25 @@ static bool test_state_within_bit_field(const bitfield_t *field, size_t first, c
unsigned long bitmask; /* Masque à appliquer */
unsigned long test; /* Valeur résultante du test */
- result = true;
+ /**
+ * Si un masque est à appliquer avec débordement, les bits débordés sont considérés
+ * comme initialisés à la valeur par défaut.
+ */
+
+ if ((first + mask->length) > field->length)
+ {
+ assert(mask->length > 0);
+
+ result = (state == field->default_state);
+ if (!result) goto done;
- assert((first + mask->length) <= field->length);
+ if (first >= field->length)
+ goto done;
+
+ }
+
+ else
+ result = true;
start = first / (sizeof(unsigned long) * 8);
offset = first % (sizeof(unsigned long) * 8);
@@ -849,6 +921,8 @@ static bool test_state_within_bit_field(const bitfield_t *field, size_t first, c
}
+ done:
+
return result;
}