--- /dev/null
+\r
+/* Bitset primitives used by the parser generator */\r
+\r
+#include "pgenheaders.h"\r
+#include "bitset.h"\r
+\r
+bitset\r
+newbitset(int nbits)\r
+{\r
+ int nbytes = NBYTES(nbits);\r
+ bitset ss = (char *)PyObject_MALLOC(sizeof(BYTE) * nbytes);\r
+\r
+ if (ss == NULL)\r
+ Py_FatalError("no mem for bitset");\r
+\r
+ ss += nbytes;\r
+ while (--nbytes >= 0)\r
+ *--ss = 0;\r
+ return ss;\r
+}\r
+\r
+void\r
+delbitset(bitset ss)\r
+{\r
+ PyObject_FREE(ss);\r
+}\r
+\r
+int\r
+addbit(bitset ss, int ibit)\r
+{\r
+ int ibyte = BIT2BYTE(ibit);\r
+ BYTE mask = BIT2MASK(ibit);\r
+\r
+ if (ss[ibyte] & mask)\r
+ return 0; /* Bit already set */\r
+ ss[ibyte] |= mask;\r
+ return 1;\r
+}\r
+\r
+#if 0 /* Now a macro */\r
+int\r
+testbit(bitset ss, int ibit)\r
+{\r
+ return (ss[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0;\r
+}\r
+#endif\r
+\r
+int\r
+samebitset(bitset ss1, bitset ss2, int nbits)\r
+{\r
+ int i;\r
+\r
+ for (i = NBYTES(nbits); --i >= 0; )\r
+ if (*ss1++ != *ss2++)\r
+ return 0;\r
+ return 1;\r
+}\r
+\r
+void\r
+mergebitset(bitset ss1, bitset ss2, int nbits)\r
+{\r
+ int i;\r
+\r
+ for (i = NBYTES(nbits); --i >= 0; )\r
+ *ss1++ |= *ss2++;\r
+}\r