/Parser/bitset.c

http://unladen-swallow.googlecode.com/ · C · 66 lines · 52 code · 13 blank · 1 comment · 9 complexity · eac35f096816dd44570f9fc1d07709e0 MD5 · raw file

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