home *** CD-ROM | disk | FTP | other *** search
- /*
- * 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);
- }
-