bitset.c 1.04 KB
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 11 12 13 14 15 16 17 18 19
    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;
Guido van Rossum's avatar
Guido van Rossum committed
20 21 22
}

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
    int ibyte = BIT2BYTE(ibit);
    BYTE mask = BIT2MASK(ibit);

    if (ss[ibyte] & mask)
        return 0; /* Bit already set */
    ss[ibyte] |= mask;
    return 1;
Guido van Rossum's avatar
Guido van Rossum committed
38 39 40 41
}

#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
    return (ss[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0;
Guido van Rossum's avatar
Guido van Rossum committed
45 46 47 48
}
#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
    int i;

    for (i = NBYTES(nbits); --i >= 0; )
        if (*ss1++ != *ss2++)
            return 0;
    return 1;
Guido van Rossum's avatar
Guido van Rossum committed
57 58 59
}

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
    int i;

    for (i = NBYTES(nbits); --i >= 0; )
        *ss1++ |= *ss2++;
Guido van Rossum's avatar
Guido van Rossum committed
66
}