home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 15 / AACD15.ISO / AACD / Programming / Python2 / Python20_source / Parser / bitset.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-25  |  949 b   |  67 lines

  1.  
  2. /* Bitset primitives used by the parser generator */
  3.  
  4. #include "pgenheaders.h"
  5. #include "bitset.h"
  6.  
  7. bitset
  8. newbitset(int nbits)
  9. {
  10.     int nbytes = NBYTES(nbits);
  11.     bitset ss = PyMem_NEW(BYTE, nbytes);
  12.     
  13.     if (ss == NULL)
  14.         Py_FatalError("no mem for bitset");
  15.     
  16.     ss += nbytes;
  17.     while (--nbytes >= 0)
  18.         *--ss = 0;
  19.     return ss;
  20. }
  21.  
  22. void
  23. delbitset(bitset ss)
  24. {
  25.     PyMem_DEL(ss);
  26. }
  27.  
  28. int
  29. addbit(bitset ss, int ibit)
  30. {
  31.     int ibyte = BIT2BYTE(ibit);
  32.     BYTE mask = BIT2MASK(ibit);
  33.     
  34.     if (ss[ibyte] & mask)
  35.         return 0; /* Bit already set */
  36.     ss[ibyte] |= mask;
  37.     return 1;
  38. }
  39.  
  40. #if 0 /* Now a macro */
  41. int
  42. testbit(bitset ss, int ibit)
  43. {
  44.     return (ss[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0;
  45. }
  46. #endif
  47.  
  48. int
  49. samebitset(bitset ss1, bitset ss2, int nbits)
  50. {
  51.     int i;
  52.     
  53.     for (i = NBYTES(nbits); --i >= 0; )
  54.         if (*ss1++ != *ss2++)
  55.             return 0;
  56.     return 1;
  57. }
  58.  
  59. void
  60. mergebitset(bitset ss1, bitset ss2, int nbits)
  61. {
  62.     int i;
  63.     
  64.     for (i = NBYTES(nbits); --i >= 0; )
  65.         *ss1++ |= *ss2++;
  66. }
  67.