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