Back to index

python3.2  3.2.2
bitset.c
Go to the documentation of this file.
00001 
00002 /* Bitset primitives used by the parser generator */
00003 
00004 #include "pgenheaders.h"
00005 #include "bitset.h"
00006 
00007 bitset
00008 newbitset(int nbits)
00009 {
00010     int nbytes = NBYTES(nbits);
00011     bitset ss = (char *)PyObject_MALLOC(sizeof(BYTE) *  nbytes);
00012 
00013     if (ss == NULL)
00014         Py_FatalError("no mem for bitset");
00015 
00016     ss += nbytes;
00017     while (--nbytes >= 0)
00018         *--ss = 0;
00019     return ss;
00020 }
00021 
00022 void
00023 delbitset(bitset ss)
00024 {
00025     PyObject_FREE(ss);
00026 }
00027 
00028 int
00029 addbit(bitset ss, int ibit)
00030 {
00031     int ibyte = BIT2BYTE(ibit);
00032     BYTE mask = BIT2MASK(ibit);
00033 
00034     if (ss[ibyte] & mask)
00035         return 0; /* Bit already set */
00036     ss[ibyte] |= mask;
00037     return 1;
00038 }
00039 
00040 #if 0 /* Now a macro */
00041 int
00042 testbit(bitset ss, int ibit)
00043 {
00044     return (ss[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0;
00045 }
00046 #endif
00047 
00048 int
00049 samebitset(bitset ss1, bitset ss2, int nbits)
00050 {
00051     int i;
00052 
00053     for (i = NBYTES(nbits); --i >= 0; )
00054         if (*ss1++ != *ss2++)
00055             return 0;
00056     return 1;
00057 }
00058 
00059 void
00060 mergebitset(bitset ss1, bitset ss2, int nbits)
00061 {
00062     int i;
00063 
00064     for (i = NBYTES(nbits); --i >= 0; )
00065         *ss1++ |= *ss2++;
00066 }