summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/bits.c36
-rw-r--r--src/common/bits.h3
2 files changed, 39 insertions, 0 deletions
diff --git a/src/common/bits.c b/src/common/bits.c
index 1ded7a2..0e5afc8 100644
--- a/src/common/bits.c
+++ b/src/common/bits.c
@@ -646,6 +646,42 @@ bool test_in_bit_field(const bitfield_t *field, size_t n)
/******************************************************************************
* *
+* Paramètres : field = champ de bits à consulter. *
+* n = indice du bit à traiter. *
+* *
+* Description : Détermine si un bit est à 1 dans un champ puis le définit. *
+* *
+* Retour : true si le bit correspondant était déjà à l'état haut. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool test_and_set_in_bit_field(bitfield_t *field, size_t n)
+{
+ bool result; /* Valeur retrouvée à renvoyer */
+ size_t index; /* Cellule de tableau visée */
+ size_t remaining; /* Nombre de bits restants */
+ unsigned long *bits; /* Accès mis en commun */
+
+ assert(n < field->length);
+
+ index = n / (sizeof(unsigned long) * 8);
+ remaining = n % (sizeof(unsigned long) * 8);
+
+ bits = field->bits + index;
+
+ result = *bits & (1ul << remaining);
+
+ *bits |= (1ul << remaining);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : field = champ de bits à modifier. *
* first = indice du premier bit à traiter. *
* count = nombre de bits à marquer. *
diff --git a/src/common/bits.h b/src/common/bits.h
index 8f67d3d..cd71681 100644
--- a/src/common/bits.h
+++ b/src/common/bits.h
@@ -81,6 +81,9 @@ void or_bit_field_at(bitfield_t *, const bitfield_t *, size_t);
/* Détermine si un bit est à 1 dans un champ de bits. */
bool test_in_bit_field(const bitfield_t *, size_t);
+/* Détermine si un bit est à 1 dans un champ puis le définit. */
+bool test_and_set_in_bit_field(bitfield_t *, size_t);
+
/* Détermine si un ensemble de bits est à 0 dans un champ. */
bool test_none_in_bit_field(const bitfield_t *, size_t, size_t);