/* 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++; | |
} |