ref: 2fe3b28f86ed4aa291fb8a620b948abe9c6a1f84
dir: /sys/src/cmd/python/Parser/bitset.c/
/* 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++; }