From 56110edad1f4b419ff309e7cb6f2d320990b60d1 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Thu, 8 Feb 2024 23:10:16 +0100
Subject: Save an unused bit field operation created for tests.

---
 src/common/bits.c | 36 ++++++++++++++++++++++++++++++++++++
 src/common/bits.h |  3 +++
 2 files changed, 39 insertions(+)

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);
 
-- 
cgit v0.11.2-87-g4458