equal
deleted
inserted
replaced
|
1 |
|
2 /* Bitset primitives used by the parser generator */ |
|
3 |
|
4 #include "pgenheaders.h" |
|
5 #include "bitset.h" |
|
6 |
|
7 bitset |
|
8 newbitset(int nbits) |
|
9 { |
|
10 int nbytes = NBYTES(nbits); |
|
11 bitset ss = (char *)PyObject_MALLOC(sizeof(BYTE) * nbytes); |
|
12 |
|
13 if (ss == NULL) |
|
14 Py_FatalError("no mem for bitset"); |
|
15 |
|
16 ss += nbytes; |
|
17 while (--nbytes >= 0) |
|
18 *--ss = 0; |
|
19 return ss; |
|
20 } |
|
21 |
|
22 void |
|
23 delbitset(bitset ss) |
|
24 { |
|
25 PyObject_FREE(ss); |
|
26 } |
|
27 |
|
28 int |
|
29 addbit(bitset ss, int ibit) |
|
30 { |
|
31 int ibyte = BIT2BYTE(ibit); |
|
32 BYTE mask = BIT2MASK(ibit); |
|
33 |
|
34 if (ss[ibyte] & mask) |
|
35 return 0; /* Bit already set */ |
|
36 ss[ibyte] |= mask; |
|
37 return 1; |
|
38 } |
|
39 |
|
40 #if 0 /* Now a macro */ |
|
41 int |
|
42 testbit(bitset ss, int ibit) |
|
43 { |
|
44 return (ss[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0; |
|
45 } |
|
46 #endif |
|
47 |
|
48 int |
|
49 samebitset(bitset ss1, bitset ss2, int nbits) |
|
50 { |
|
51 int i; |
|
52 |
|
53 for (i = NBYTES(nbits); --i >= 0; ) |
|
54 if (*ss1++ != *ss2++) |
|
55 return 0; |
|
56 return 1; |
|
57 } |
|
58 |
|
59 void |
|
60 mergebitset(bitset ss1, bitset ss2, int nbits) |
|
61 { |
|
62 int i; |
|
63 |
|
64 for (i = NBYTES(nbits); --i >= 0; ) |
|
65 *ss1++ |= *ss2++; |
|
66 } |