bitset.c 977 Bytes
Newer Older
1

Guido van Rossum's avatar
Guido van Rossum committed
2
/* Bitset primitives used by the parser generator */
Guido van Rossum's avatar
Guido van Rossum committed
3

Guido van Rossum's avatar
Guido van Rossum committed
4
#include "pgenheaders.h"
Guido van Rossum's avatar
Guido van Rossum committed
5 6 7
#include "bitset.h"

bitset
Thomas Wouters's avatar
Thomas Wouters committed
8
newbitset(int nbits)
Guido van Rossum's avatar
Guido van Rossum committed
9 10
{
	int nbytes = NBYTES(nbits);
11
	bitset ss = (char *)PyObject_MALLOC(sizeof(BYTE) *  nbytes);
Guido van Rossum's avatar
Guido van Rossum committed
12 13
	
	if (ss == NULL)
14
		Py_FatalError("no mem for bitset");
Guido van Rossum's avatar
Guido van Rossum committed
15 16 17 18 19 20 21 22
	
	ss += nbytes;
	while (--nbytes >= 0)
		*--ss = 0;
	return ss;
}

void
Thomas Wouters's avatar
Thomas Wouters committed
23
delbitset(bitset ss)
Guido van Rossum's avatar
Guido van Rossum committed
24
{
25
	PyObject_FREE(ss);
Guido van Rossum's avatar
Guido van Rossum committed
26 27 28
}

int
Thomas Wouters's avatar
Thomas Wouters committed
29
addbit(bitset ss, int ibit)
Guido van Rossum's avatar
Guido van Rossum committed
30 31 32 33 34 35 36 37 38 39 40 41
{
	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
Thomas Wouters's avatar
Thomas Wouters committed
42
testbit(bitset ss, int ibit)
Guido van Rossum's avatar
Guido van Rossum committed
43 44 45 46 47 48
{
	return (ss[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0;
}
#endif

int
Thomas Wouters's avatar
Thomas Wouters committed
49
samebitset(bitset ss1, bitset ss2, int nbits)
Guido van Rossum's avatar
Guido van Rossum committed
50 51 52 53 54 55 56 57 58 59
{
	int i;
	
	for (i = NBYTES(nbits); --i >= 0; )
		if (*ss1++ != *ss2++)
			return 0;
	return 1;
}

void
Thomas Wouters's avatar
Thomas Wouters committed
60
mergebitset(bitset ss1, bitset ss2, int nbits)
Guido van Rossum's avatar
Guido van Rossum committed
61 62 63 64 65 66
{
	int i;
	
	for (i = NBYTES(nbits); --i >= 0; )
		*ss1++ |= *ss2++;
}