home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / riscbsd / sources / src_tgz / src_tgz~ / src / include / bitstring.h < prev    next >
C/C++ Source or Header  |  1995-10-13  |  3KB  |  116 lines

  1. /*    $NetBSD: bitstring.h,v 1.4 1994/10/26 00:55:45 cgd Exp $    */
  2.  
  3. /*
  4.  * Copyright (c) 1989 The Regents of the University of California.
  5.  * All rights reserved.
  6.  *
  7.  * This code is derived from software contributed to Berkeley by
  8.  * Paul Vixie.
  9.  *
  10.  * Redistribution and use in source and binary forms are permitted
  11.  * provided that the above copyright notice and this paragraph are
  12.  * duplicated in all such forms and that any documentation,
  13.  * advertising materials, and other materials related to such
  14.  * distribution and use acknowledge that the software was developed
  15.  * by the University of California, Berkeley.  The name of the
  16.  * University may not be used to endorse or promote products derived
  17.  * from this software without specific prior written permission.
  18.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  19.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  20.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  21.  *
  22.  *    @(#)bitstring.h    5.2 (Berkeley) 4/4/90
  23.  */
  24.  
  25. #ifndef _BITSTRING_H_
  26. #define _BITSTRING_H_
  27.  
  28. /* modified for SV/AT and bitstring bugfix by M.R.Murphy, 11oct91
  29.  * bitstr_size changed gratuitously, but shorter
  30.  * bit_alloc   spelling error fixed
  31.  * the following were efficient, but didn't work, they've been made to
  32.  * work, but are no longer as efficient :-)
  33.  * bit_nclear, bit_nset, bit_ffc, bit_ffs
  34.  */
  35. typedef    unsigned char bitstr_t;
  36.  
  37. /* internal macros */
  38.                 /* byte of the bitstring bit is in */
  39. #define    _bit_byte(bit) \
  40.     ((bit) >> 3)
  41.  
  42.                 /* mask for the bit within its byte */
  43. #define    _bit_mask(bit) \
  44.     (1 << ((bit)&0x7))
  45.  
  46. /* external macros */
  47.                 /* bytes in a bitstring of nbits bits */
  48. #define    bitstr_size(nbits) \
  49.     (((nbits) + 7) >> 3)
  50.  
  51.                 /* allocate a bitstring */
  52. #define    bit_alloc(nbits) \
  53.     (bitstr_t *)calloc((size_t)bitstr_size(nbits), sizeof(bitstr_t))
  54.  
  55.                 /* allocate a bitstring on the stack */
  56. #define    bit_decl(name, nbits) \
  57.     (name)[bitstr_size(nbits)]
  58.  
  59.                 /* is bit N of bitstring name set? */
  60. #define    bit_test(name, bit) \
  61.     ((name)[_bit_byte(bit)] & _bit_mask(bit))
  62.  
  63.                 /* set bit N of bitstring name */
  64. #define    bit_set(name, bit) \
  65.     (name)[_bit_byte(bit)] |= _bit_mask(bit)
  66.  
  67.                 /* clear bit N of bitstring name */
  68. #define    bit_clear(name, bit) \
  69.     (name)[_bit_byte(bit)] &= ~_bit_mask(bit)
  70.  
  71.                 /* clear bits start ... stop in bitstring */
  72. #define    bit_nclear(name, start, stop) { \
  73.     register bitstr_t *_name = name; \
  74.     register int _start = start, _stop = stop; \
  75.     while (_start <= _stop) { \
  76.         bit_clear(_name, _start); \
  77.         _start++; \
  78.         } \
  79. }
  80.  
  81.                 /* set bits start ... stop in bitstring */
  82. #define    bit_nset(name, start, stop) { \
  83.     register bitstr_t *_name = name; \
  84.     register int _start = start, _stop = stop; \
  85.     while (_start <= _stop) { \
  86.         bit_set(_name, _start); \
  87.         _start++; \
  88.         } \
  89. }
  90.  
  91.                 /* find first bit clear in name */
  92. #define    bit_ffc(name, nbits, value) { \
  93.     register bitstr_t *_name = name; \
  94.     register int _bit, _nbits = nbits, _value = -1; \
  95.     for (_bit = 0; _bit < _nbits; ++_bit) \
  96.         if (!bit_test(_name, _bit)) { \
  97.             _value = _bit; \
  98.             break; \
  99.         } \
  100.     *(value) = _value; \
  101. }
  102.  
  103.                 /* find first bit set in name */
  104. #define    bit_ffs(name, nbits, value) { \
  105.     register bitstr_t *_name = name; \
  106.     register int _bit, _nbits = nbits, _value = -1; \
  107.     for (_bit = 0; _bit < _nbits; ++_bit) \
  108.         if (bit_test(_name, _bit)) { \
  109.             _value = _bit; \
  110.             break; \
  111.         } \
  112.     *(value) = _value; \
  113. }
  114.  
  115. #endif /* !_BITSTRING_H_ */
  116.