62 lines
2.7 KiB
C
62 lines
2.7 KiB
C
/*
|
|
FILE NAME: bits.h
|
|
|
|
TITLE: Include file of package for work with bits
|
|
|
|
DESCRIPTION:
|
|
This is header file contains macros and the ANSI C prototype
|
|
definitions for the package for work with bits and bit strings
|
|
and C++ class for work with bits and bit strings. A bit is
|
|
given by address (start address) of byte from which counting
|
|
bits starts and its displacement which is any non negative
|
|
number of bit from the start address. The most significant bit
|
|
of the start address byte has number 0. The bit string is
|
|
given by its first bit and its length in bits.
|
|
|
|
*/
|
|
|
|
#ifndef __BITS__
|
|
#define __BITS__
|
|
|
|
#include "ammunition_limits.h"
|
|
|
|
/* This macro value returns bit vlaue (0 or 1) with given bit
|
|
displacement (0, 1, ...). The macro has side effects! Value of
|
|
`bit_displacement' must be nonegative and can be greater than
|
|
CHAR_BIT. */
|
|
|
|
#define BIT(start_byte, bit_displacement) \
|
|
((((const char *) (start_byte))[(bit_displacement) / CHAR_BIT] >> \
|
|
(CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT)) & \
|
|
1)
|
|
|
|
/* This macro value sets up new value (must be `0' or `1') of a given
|
|
bit (bit displacement starts with 0). The macro has side effects!
|
|
Value of `bit_displacement' must be nonegative and can be greater
|
|
than CHAR_BIT. */
|
|
|
|
#define SET_BIT(start_byte, bit_displacement, bit) \
|
|
(((char *) (start_byte))[(bit_displacement) / CHAR_BIT] = \
|
|
(((char *) (start_byte))[(bit_displacement) / CHAR_BIT] & \
|
|
~(1 << (CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT))) | \
|
|
((bit) << (CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT)))
|
|
|
|
__attribute__((always_inline)) static inline int
|
|
ammunition_is_zero_bit_string(const void *start_byte, int bit_displacement,
|
|
int bit_length);
|
|
__attribute__((always_inline)) static inline void
|
|
ammunition_bit_string_set(void *start_byte, int bit_displacement, int bit,
|
|
int bit_length);
|
|
__attribute__((always_inline)) static inline void
|
|
ammunition_bit_string_copy(void *to, int to_bit_displacement, const void *from,
|
|
int from_bit_displacement, int bit_length);
|
|
__attribute__((always_inline)) static inline void
|
|
ammunition_bit_string_move(void *to, int to_bit_displacement, const void *from,
|
|
int from_bit_displacement, int bit_length);
|
|
__attribute__((always_inline)) static inline int
|
|
ammunition_bit_string_comparison(const void *str1, int bit_displacement1,
|
|
const void *str2, int bit_displacement2,
|
|
int bit_length);
|
|
|
|
#endif /* #ifndef __BITS__ */
|