You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.0 KiB

36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
  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. }