1 /*
   2  * Copyright (c) 1989, 1993
   3  *      The Regents of the University of California.  All rights reserved.
   4  *
   5  * This code is derived from software contributed to Berkeley by
   6  * Paul Vixie.
   7  *
   8  * Redistribution and use in source and binary forms, with or without
   9  * modification, are permitted provided that the following conditions
  10  * are met:
  11  * 1. Redistributions of source code must retain the above copyright
  12  *    notice, this list of conditions and the following disclaimer.
  13  * 2. Redistributions in binary form must reproduce the above copyright
  14  *    notice, this list of conditions and the following disclaimer in the
  15  *    documentation and/or other materials provided with the distribution.
  16  * 3. Neither the name of the University nor the names of its contributors
  17  *    may be used to endorse or promote products derived from this software
  18  *    without specific prior written permission.
  19  *
  20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30  * SUCH DAMAGE.
  31  */
  32 
  33 #ifndef _BITSTRING_H
  34 #define _BITSTRING_H
  35 
  36 typedef unsigned char bitstr_t;
  37 
  38 /* byte of the bitstring bit is in */
  39 #define _bit_byte(bit) \
  40         ((bit) >> 3)
  41 /* mask for the bit within its byte */
  42 #define _bit_mask(bit) \
  43         (1 << ((bit)&0x7))
  44 /* bytes in a bitstring of nbits bits */
  45 #define bitstr_size(nbits) \
  46         (((nbits) + 7) >> 3)
  47 /* is bit N of bitstring name set? */
  48 #define bit_test(name, bit) \
  49         ((name)[_bit_byte(bit)] & _bit_mask(bit))
  50 /* set bit N of bitstring name */
  51 #define bit_set(name, bit) \
  52         ((name)[_bit_byte(bit)] |= _bit_mask(bit))
  53 /* find first bit set in name */
  54 #define bit_ffs(name, nbits, value) { \
  55         bitstr_t *_name = name; \
  56         int _byte, _nbits = nbits; \
  57         int _stopbyte = _bit_byte(_nbits), _value = -1; \
  58         for (_byte = 0; _byte <= _stopbyte; ++_byte) \
  59                 if (_name[_byte]) { \
  60                         _value = _byte << 3; \
  61                         for (_stopbyte = _name[_byte]; !(_stopbyte&0x1); \
  62                             ++_value, _stopbyte >>= 1); \
  63                                 break; \
  64                 } \
  65                 *(value) = _value; \
  66         }
  67 
  68 #endif  /* _BITSTRING_H */