summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/Makefile.am1
-rw-r--r--src/common/bits.c82
-rw-r--r--src/common/bits.h10
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 *);