diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2024-06-24 21:55:03 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2024-06-24 21:55:03 (GMT) |
commit | 1e30e2c3822f55848e2306e59a2e66d7285f6b78 (patch) | |
tree | 7a0fd0bce0f27dceb19b0596cc7a00962c3435ad /src/common | |
parent | d49b837c891e0490167b51c4a9811cb2e8276588 (diff) |
Create functions suitable for [un]setting only one bit.
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/Makefile.am | 1 | ||||
-rw-r--r-- | src/common/bits.c | 82 | ||||
-rw-r--r-- | src/common/bits.h | 10 |
3 files changed, 86 insertions, 7 deletions
diff --git a/src/common/Makefile.am b/src/common/Makefile.am index 27ead1d..0a7475f 100644 --- a/src/common/Makefile.am +++ b/src/common/Makefile.am @@ -6,7 +6,6 @@ libcommon_la_SOURCES = \ array.h array.c \ asm.h asm.c \ bconst.h \ - bits.h bits.c \ compression.h compression.c \ cpp.h \ cpu.h cpu.c \ 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; } diff --git a/src/common/bits.h b/src/common/bits.h index a66c6f0..3898c73 100644 --- a/src/common/bits.h +++ b/src/common/bits.h @@ -65,10 +65,16 @@ void reset_all_in_bit_field(bitfield_t *); void set_all_in_bit_field(bitfield_t *); /* Bascule à 0 une partie d'un champ de bits. */ -void reset_in_bit_field(bitfield_t *, size_t, size_t); +void reset_in_bit_field(bitfield_t *, size_t); + +/* Bascule à 0 une partie d'un champ de bits. */ +void reset_multi_in_bit_field(bitfield_t *, size_t, size_t); + +/* Bascule à 1 une partie d'un champ de bits. */ +void set_in_bit_field(bitfield_t *, size_t); /* Bascule à 1 une partie d'un champ de bits. */ -void set_in_bit_field(bitfield_t *, size_t, size_t); +void set_multi_in_bit_field(bitfield_t *, size_t, size_t); /* Réalise une opération ET logique entre deux champs de bits. */ void and_bit_field(bitfield_t *, const bitfield_t *); |