home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / mac / source / netnwscd.sit / bits.c next >
Text File  |  1990-10-14  |  2KB  |  117 lines

  1. /*
  2.  * Various bitmap routines.
  3.  *
  4.  *  note: these are all low-efficiency routines.  They could be much more 
  5.  *        clever by using look-up tables and traversing lists by more than
  6.  *        one bit at a time.
  7.  * Copyright ⌐ Tom Bereiter, 1990
  8.  */
  9.  
  10. #include "bits.h"
  11.  
  12. /* allocate cleared bitmap for 'n' bits */
  13. bitmap_t *
  14. bmalloc(unsigned long n) {
  15.     int i,sz;
  16.     bitmap_t *bm;
  17.     
  18.     sz = ((n)+(BitsPerLong-1)) >> LogBitsPerLong;
  19.     bm = (bitmap_t *)NewPtr(sz * sizeof(bitmap_t));
  20.     for (i=0; i<sz; i++)
  21.         bm[i] = 0;
  22.     return (bm);
  23. }
  24.  
  25. /*
  26.  * Set length bits at bit number bitnum in bitmap
  27.  */
  28. void
  29. bfset(bmp, bitnum, length)
  30.     register bitmap_t    *bmp;
  31.     register unsigned long    bitnum;
  32.     register unsigned long    length;
  33. {
  34.  
  35.     while ( length-- > 0 ) {
  36.         Bset(bmp, bitnum);
  37.         bitnum++;
  38.     }
  39. }
  40.  
  41. /*
  42.  * Clear length bits at bit number bitnum in bitmap
  43.  */
  44.  
  45. void
  46. bfclr(bmp, bitnum, length)
  47.     register bitmap_t    *bmp;
  48.     register unsigned long    bitnum;
  49.     register unsigned long    length;
  50. {
  51.     while ( length-- > 0 ) {
  52.         Bclr(bmp, bitnum);
  53.         bitnum++;
  54.     }
  55. }
  56.  
  57.  
  58. /* find first set: starting at bitnum, limited by length */
  59. unsigned long
  60. bfffs(bm, bitnum, length)
  61.     register bitmap_t    *bm;
  62.     register unsigned long    bitnum;
  63.     register unsigned long    length;
  64. {
  65.     register unsigned long n = bitnum;
  66.     register bitmap_t    *bmp = bm;
  67.     
  68.     /* check to end of current long */
  69.     while (Btst(bm, n) == 0 && (n & (BitsPerLong-1)))
  70.         if (++n >= length)
  71.             return (unsigned long)-1;
  72.  
  73.     /* chew by longs */
  74.     bmp += (n >> LogBitsPerLong);
  75.     while (*bmp == 0) {
  76.         bmp++;
  77.         n += BitsPerLong;
  78.         if (n >= length)
  79.             return (unsigned long)-1;
  80.     }
  81.     /* find position in long */
  82.     while (Btst(bm, n) == 0)
  83.         if (++n >= length)
  84.             return (unsigned long)-1;
  85.     return (n);
  86. }
  87.  
  88. /* find first set: starting at bitnum, limited by length */
  89. unsigned long
  90. bfffc(bm, bitnum, length)
  91.     register bitmap_t    *bm;
  92.     register unsigned long    bitnum;
  93.     register unsigned long    length;
  94. {
  95.     register unsigned long n = bitnum;
  96.     register bitmap_t    *bmp = bm;
  97.  
  98.     /* check to end of current long */
  99.     while (Btst(bm, n) && (n & (BitsPerLong-1)))
  100.         if (++n >= length)
  101.             return (unsigned long)-1;
  102.  
  103.     /* chew by longs */
  104.     bmp += (n >> LogBitsPerLong);
  105.     while (*bmp == ALLONES) {
  106.         bmp++;
  107.         n += BitsPerLong;
  108.         if (n >= length)
  109.             return (unsigned long)-1;
  110.     }
  111.     /* find position in long */
  112.     while (Btst(bm, n))
  113.         if (++n >= length)
  114.             return (unsigned long)-1;
  115.     return (n);
  116. }
  117.