home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Garbo
/
Garbo.cdr
/
mac
/
source
/
netnwscd.sit
/
bits.c
next >
Wrap
Text File
|
1990-10-14
|
2KB
|
117 lines
/*
* Various bitmap routines.
*
* note: these are all low-efficiency routines. They could be much more
* clever by using look-up tables and traversing lists by more than
* one bit at a time.
* Copyright ⌐ Tom Bereiter, 1990
*/
#include "bits.h"
/* allocate cleared bitmap for 'n' bits */
bitmap_t *
bmalloc(unsigned long n) {
int i,sz;
bitmap_t *bm;
sz = ((n)+(BitsPerLong-1)) >> LogBitsPerLong;
bm = (bitmap_t *)NewPtr(sz * sizeof(bitmap_t));
for (i=0; i<sz; i++)
bm[i] = 0;
return (bm);
}
/*
* Set length bits at bit number bitnum in bitmap
*/
void
bfset(bmp, bitnum, length)
register bitmap_t *bmp;
register unsigned long bitnum;
register unsigned long length;
{
while ( length-- > 0 ) {
Bset(bmp, bitnum);
bitnum++;
}
}
/*
* Clear length bits at bit number bitnum in bitmap
*/
void
bfclr(bmp, bitnum, length)
register bitmap_t *bmp;
register unsigned long bitnum;
register unsigned long length;
{
while ( length-- > 0 ) {
Bclr(bmp, bitnum);
bitnum++;
}
}
/* find first set: starting at bitnum, limited by length */
unsigned long
bfffs(bm, bitnum, length)
register bitmap_t *bm;
register unsigned long bitnum;
register unsigned long length;
{
register unsigned long n = bitnum;
register bitmap_t *bmp = bm;
/* check to end of current long */
while (Btst(bm, n) == 0 && (n & (BitsPerLong-1)))
if (++n >= length)
return (unsigned long)-1;
/* chew by longs */
bmp += (n >> LogBitsPerLong);
while (*bmp == 0) {
bmp++;
n += BitsPerLong;
if (n >= length)
return (unsigned long)-1;
}
/* find position in long */
while (Btst(bm, n) == 0)
if (++n >= length)
return (unsigned long)-1;
return (n);
}
/* find first set: starting at bitnum, limited by length */
unsigned long
bfffc(bm, bitnum, length)
register bitmap_t *bm;
register unsigned long bitnum;
register unsigned long length;
{
register unsigned long n = bitnum;
register bitmap_t *bmp = bm;
/* check to end of current long */
while (Btst(bm, n) && (n & (BitsPerLong-1)))
if (++n >= length)
return (unsigned long)-1;
/* chew by longs */
bmp += (n >> LogBitsPerLong);
while (*bmp == ALLONES) {
bmp++;
n += BitsPerLong;
if (n >= length)
return (unsigned long)-1;
}
/* find position in long */
while (Btst(bm, n))
if (++n >= length)
return (unsigned long)-1;
return (n);
}