]>
git.cameronkatri.com Git - pw-darwin.git/blob - pw/bitmap.c
2 * Copyright (c) 1996 by David L. Nugent <davidn@blaze.net.au>.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer as
10 * the first lines of this file unmodified.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 * must display the following acknowledgement:
16 * This product includes software developed by David L. Nugent.
17 * 4. The name of the author may not be used to endorse or promote products
18 * derived from this software without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE DAVID L. NUGENT ``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 DAVID L. NUGENT 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
44 int szmap
= (size
/ 8) + !!(size
% 8);
47 bm
.map
= malloc(szmap
);
49 memset(bm
.map
, 0, szmap
);
54 bm_dealloc(struct bitmap
* bm
)
61 bm_getmask(int *pos
, unsigned char *bmask
)
63 *bmask
= (unsigned char) (1 << (*pos
% 8));
68 bm_setbit(struct bitmap
* bm
, int pos
)
72 bm_getmask(&pos
, &bmask
);
73 bm
->map
[pos
] |= bmask
;
77 bm_clrbit(struct bitmap
* bm
, int pos
)
81 bm_getmask(&pos
, &bmask
);
82 bm
->map
[pos
] &= ~bmask
;
86 bm_isset(struct bitmap
* bm
, int pos
)
90 bm_getmask(&pos
, &bmask
);
91 return !!(bm
->map
[pos
] & bmask
);
95 bm_firstunset(struct bitmap
* bm
)
97 int szmap
= (bm
->size
/ 8) + !!(bm
->size
% 8);
101 while (pos
< szmap
) {
102 unsigned char bmv
= bm
->map
[pos
++];
103 unsigned char bmask
= 1;
105 while (bmask
& 0xff) {
106 if ((bmv
& bmask
) == 0)
116 bm_lastset(struct bitmap
* bm
)
118 int szmap
= (bm
->size
/ 8) + !!(bm
->size
% 8);
123 while (pos
< szmap
) {
124 unsigned char bmv
= bm
->map
[pos
++];
125 unsigned char bmask
= 1;
127 while (bmask
& 0xff) {
128 if ((bmv
& bmask
) != 0)