Home | History | Annotate | Download | only in Parser
      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 }
     67