summaryrefslogtreecommitdiff
path: root/src/common/bits.h
blob: d9c83c8df6b229c550e0de77f473f497f2c0a06b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133

/* Chrysalide - Outil d'analyse de fichiers binaires
 * bits.h - prototypes pour la manipulation d'un champ de bits quelconque
 *
 * Copyright (C) 2015-2018 Cyrille Bagard
 *
 *  This file is part of Chrysalide.
 *
 *  Chrysalide is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  Chrysalide is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Chrysalide.  If not, see <http://www.gnu.org/licenses/>.
 */


#ifndef _COMMON_BITS_H
#define _COMMON_BITS_H


#include <stdbool.h>
#include <sys/types.h>


#include "datatypes.h"



/* Champ de bits simple */
typedef struct _bitfield_t bitfield_t;


/* Crée un champ de bits initialisé. */
bitfield_t *create_bit_field(size_t, bool);

/* Crée une copie d'un champ de bits classique. */
bitfield_t *dup_bit_field(const bitfield_t *);

/* Supprime de la mémoire un champ de bits donné. */
void delete_bit_field(bitfield_t *);

/* Copie un champ de bits dans un autre. */
void copy_bit_field(bitfield_t *, const bitfield_t *);

/* Réduit ou étend la taille d'un champ en évitant l'allocation. */
void truncate_bit_field(bitfield_t **, size_t);

/* Redimensionne un champ de bits. */
void resize_bit_field(bitfield_t **, size_t);

/* Indique la taille d'un champ de bits donné. */
size_t get_bit_field_size(const bitfield_t *);

/* Compare deux champs de bits entre eux. */
int compare_bit_fields(const bitfield_t *, const bitfield_t *);

/* Bascule à 0 un champ de bits dans son intégralité. */
void reset_all_in_bit_field(bitfield_t *);

/* Bascule à 1 un champ de bits dans son intégralité. */
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);

/* 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_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 *);

/* Réalise une opération OU logique entre deux champs de bits. */
void or_bit_field(bitfield_t *, const bitfield_t *);

/* Réalise une opération OU logique entre deux champs de bits. */
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);

/* Détermine si un ensemble de bits est à 1 dans un champ. */
bool test_all_in_bit_field(const bitfield_t *, size_t, size_t);

/* Teste l'état à 0 de bits selon un masque de bits. */
bool test_zeros_within_bit_field(const bitfield_t *, size_t, const bitfield_t *);

/* Teste l'état à 1 de bits selon un masque de bits. */
bool test_ones_within_bit_field(const bitfield_t *, size_t, const bitfield_t *);

/* Recherche un prochain bit défini dans un champ de bits. */
size_t find_next_set_in_bit_field(const bitfield_t *, const size_t *);

/* Recherche l'indice idéal pour placer un champ dans un autre. */
size_t find_interleaving_index_for_acism(const bitfield_t *, const bitfield_t *, size_t *);

/* Détermine le nombre de bits à 1 dans un champ. */
size_t popcount_for_bit_field(const bitfield_t *);

#if 0

/* Imprime sur la sortie standard la valeur représentée. */
void output_bit_field(const bitfield_t *);

#endif

/* Restaure un champ de bits depuis un flux ouvert. */
bitfield_t *load_bit_field(int, const size_t *, const bool *, SourceEndian);

/* Sauvegarde un champ de bits dans un flux ouvert. */
bool store_bit_field(const bitfield_t *, int, bool, bool, SourceEndian);



#endif  /* _COMMON_BITS_H */