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