|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: * Copyright (c) 1989, 1993
27: * The Regents of the University of California. All rights reserved.
28: *
29: * This code is derived from software contributed to Berkeley by
30: * Paul Vixie.
31: *
32: * Redistribution and use in source and binary forms, with or without
33: * modification, are permitted provided that the following conditions
34: * are met:
35: * 1. Redistributions of source code must retain the above copyright
36: * notice, this list of conditions and the following disclaimer.
37: * 2. Redistributions in binary form must reproduce the above copyright
38: * notice, this list of conditions and the following disclaimer in the
39: * documentation and/or other materials provided with the distribution.
40: * 3. All advertising materials mentioning features or use of this software
41: * must display the following acknowledgement:
42: * This product includes software developed by the University of
43: * California, Berkeley and its contributors.
44: * 4. Neither the name of the University nor the names of its contributors
45: * may be used to endorse or promote products derived from this software
46: * without specific prior written permission.
47: *
48: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58: * SUCH DAMAGE.
59: *
60: * @(#)bitstring.h 8.1 (Berkeley) 7/19/93
61: */
62:
63: #ifndef _BITSTRING_H_
64: #define _BITSTRING_H_
65:
66: typedef unsigned char bitstr_t;
67:
68: /* internal macros */
69: /* byte of the bitstring bit is in */
70: #define _bit_byte(bit) \
71: ((bit) >> 3)
72:
73: /* mask for the bit within its byte */
74: #define _bit_mask(bit) \
75: (1 << ((bit)&0x7))
76:
77: /* external macros */
78: /* bytes in a bitstring of nbits bits */
79: #define bitstr_size(nbits) \
80: ((((nbits) - 1) >> 3) + 1)
81:
82: /* allocate a bitstring */
83: #define bit_alloc(nbits) \
84: (bitstr_t *)calloc(1, \
85: (unsigned int)bitstr_size(nbits) * sizeof(bitstr_t))
86:
87: /* allocate a bitstring on the stack */
88: #define bit_decl(name, nbits) \
89: (name)[bitstr_size(nbits)]
90:
91: /* is bit N of bitstring name set? */
92: #define bit_test(name, bit) \
93: ((name)[_bit_byte(bit)] & _bit_mask(bit))
94:
95: /* set bit N of bitstring name */
96: #define bit_set(name, bit) \
97: (name)[_bit_byte(bit)] |= _bit_mask(bit)
98:
99: /* clear bit N of bitstring name */
100: #define bit_clear(name, bit) \
101: (name)[_bit_byte(bit)] &= ~_bit_mask(bit)
102:
103: /* clear bits start ... stop in bitstring */
104: #define bit_nclear(name, start, stop) { \
105: register bitstr_t *_name = name; \
106: register int _start = start, _stop = stop; \
107: register int _startbyte = _bit_byte(_start); \
108: register int _stopbyte = _bit_byte(_stop); \
109: if (_startbyte == _stopbyte) { \
110: _name[_startbyte] &= ((0xff >> (8 - (_start&0x7))) | \
111: (0xff << ((_stop&0x7) + 1))); \
112: } else { \
113: _name[_startbyte] &= 0xff >> (8 - (_start&0x7)); \
114: while (++_startbyte < _stopbyte) \
115: _name[_startbyte] = 0; \
116: _name[_stopbyte] &= 0xff << ((_stop&0x7) + 1); \
117: } \
118: }
119:
120: /* set bits start ... stop in bitstring */
121: #define bit_nset(name, start, stop) { \
122: register bitstr_t *_name = name; \
123: register int _start = start, _stop = stop; \
124: register int _startbyte = _bit_byte(_start); \
125: register int _stopbyte = _bit_byte(_stop); \
126: if (_startbyte == _stopbyte) { \
127: _name[_startbyte] |= ((0xff << (_start&0x7)) & \
128: (0xff >> (7 - (_stop&0x7)))); \
129: } else { \
130: _name[_startbyte] |= 0xff << ((_start)&0x7); \
131: while (++_startbyte < _stopbyte) \
132: _name[_startbyte] = 0xff; \
133: _name[_stopbyte] |= 0xff >> (7 - (_stop&0x7)); \
134: } \
135: }
136:
137: /* find first bit clear in name */
138: #define bit_ffc(name, nbits, value) { \
139: register bitstr_t *_name = name; \
140: register int _byte, _nbits = nbits; \
141: register int _stopbyte = _bit_byte(_nbits), _value = -1; \
142: for (_byte = 0; _byte <= _stopbyte; ++_byte) \
143: if (_name[_byte] != 0xff) { \
144: _value = _byte << 3; \
145: for (_stopbyte = _name[_byte]; (_stopbyte&0x1); \
146: ++_value, _stopbyte >>= 1); \
147: break; \
148: } \
149: *(value) = _value; \
150: }
151:
152: /* find first bit set in name */
153: #define bit_ffs(name, nbits, value) { \
154: register bitstr_t *_name = name; \
155: register int _byte, _nbits = nbits; \
156: register int _stopbyte = _bit_byte(_nbits), _value = -1; \
157: for (_byte = 0; _byte <= _stopbyte; ++_byte) \
158: if (_name[_byte]) { \
159: _value = _byte << 3; \
160: for (_stopbyte = _name[_byte]; !(_stopbyte&0x1); \
161: ++_value, _stopbyte >>= 1); \
162: break; \
163: } \
164: *(value) = _value; \
165: }
166:
167: #endif /* !_BITSTRING_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.