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