Files
oldlinux-files/study/linux-travel/minix-386/estdio21.tar/estdio21/bitset.h
2024-02-19 00:25:23 -05:00

96 lines
2.3 KiB
C

/* b i t s e t
*
* (C) Copyright C E Chew
*
* Feel free to copy, use and distribute this software provided:
*
* 1. you do not pretend that you wrote it
* 2. you leave this copyright notice intact.
*
* This implements a set of operators to manipulate bitsets
* is a machine independent way. It may be necessary for other
* machines to set up the constants at the front (such as the
* width of int, etc).
*
* To avoid double evaluation of the argument in some of the
* macros, define the data structure as follows:
*
* 1. the bitset is int []
* 2. the first int will be used as scratch int [0]
* 3. all the following elements will be used for the bitset proper
*
* Patchlevel 2.0
*
* Edit History:
*/
/* Declare the relative sizing of the components */
#define _BITELEMENT unsigned int
#define _BITSINCHAR CHAR_BIT
/* Determine how many bits there are in an elemental bitset */
#define _BITS (sizeof(_BITELEMENT)*_BITSINCHAR)
/* Declare the relative offsets of the pieces in the structure */
#define _BIT_SCRATCH_ 0
#define _BIT_SET_ 1
/* Define how to find a bit within a bitset */
#define _BITSIZE_(n) (((n)+_BITS-1)/_BITS)
#define _BITGROUP_(n) ((n)/_BITS)
#define _BITMASK_(n) (1<<((n)%_BITS))
/* Define how to find a bit within the data structure */
#define _BITSIZE(n) (_BITSIZE_(n)+_BIT_SET_)
#define _BITGROUP(n) (_BITGROUP_(n)+_BIT_SET_)
#define _BITMASK(n) (_BITMASK_(n))
/*
* Declare a bitset of length n bits
*/
#define bitstring(name, n) _BITELEMENT name[_BITSIZE(n)]
/*
* Clear all elements of the bitset
*/
#define bitempty(name, n) MEMSET((char *) &name[_BIT_SET_], 0, \
(size_t) (_BITSIZE_(n)*sizeof(_BITELEMENT)))
/*
* Set all elements of the bitset
*/
#define bitfill(name, n) (_BITFILL(&name[_BIT_SET_], ~0, \
_BITSIZE_(n)*sizeof(_BITELEMENT)))
/*
* Set one bit in the bitset
*/
#define bitset(name, n) (name[_BIT_SCRATCH_]=(n), \
name[_BITGROUP(name[_BIT_SCRATCH_])] |= \
_BITMASK(name[_BIT_SCRATCH_]))
/*
* Clear one bit in the bitset
*/
#define bitclear(name, n) (name[_BIT_SCRATCH_]=(n), \
name[_BITGROUP(name[_BIT_SCRATCH_])] &= \
~_BITMASK(name[_BIT_SCRATCH_]))
/*
* Test one bit in the bitset
*/
#define bittest(name, n) (name[_BIT_SCRATCH_]=(n), \
name[_BITGROUP(name[_BIT_SCRATCH_])] & \
_BITMASK(name[_BIT_SCRATCH_]))