]> git.saurik.com Git - bison.git/commitdiff
* lib/bbitset.h, lib/bitset.c, lib/bitset.h, lib/bitsetv.c,
authorAkim Demaille <akim@epita.fr>
Mon, 4 Mar 2002 14:15:01 +0000 (14:15 +0000)
committerAkim Demaille <akim@epita.fr>
Mon, 4 Mar 2002 14:15:01 +0000 (14:15 +0000)
* lib/bitsetv.h, lib/ebitset.c, lib/lbitset.c, lib/sbitset.c:
Update.
From Michael Hayes.

ChangeLog
THANKS
lib/bbitset.h
lib/bitset.c
lib/bitset.h
lib/bitsetv.c
lib/bitsetv.h
lib/ebitset.c
lib/lbitset.c
lib/sbitset.c

index 67f6f91f0c39e7ec93c3ff71f9e318a425cdef32..b2efa0386ab007da033abf72879cc74517146128 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2002-03-04  Akim Demaille  <akim@epita.fr>
+
+       * lib/bbitset.h, lib/bitset.c, lib/bitset.h, lib/bitsetv.c,
+       * lib/bitsetv.h, lib/ebitset.c, lib/lbitset.c, lib/sbitset.c:
+       Update.
+       From Michael Hayes.
+
 2002-03-04  Akim Demaille  <akim@epita.fr>
 
        * src/closure.c (closure): `r' is unused.
diff --git a/THANKS b/THANKS
index 9186c0ffec252004543ecdc9a96e0f8389f2bf39..efb67667c89d9ff68ed160858576a295164fce13 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -26,6 +26,7 @@ Kees Zeelenberg         kzlg@users.sourceforge.net
 Keith Browne            kbrowne@legato.com
 Laurent Mascherpa       laurent.mascherpa@epita.fr
 Marc Autret             autret_m@epita.fr
+Michael Hayes           m.hayes@elec.canterbury.ac.nz
 Mike Castle             dalgoda@ix.netcom.com
 Neil Booth              NeilB@earthling.net
 Nelson H. F. Beebe      beebe@math.utah.edu
index a20e285f08a651dca4846ed25ba9677ccb57eda0..53b56c020c5991e568368e22081049cf04ee35e3 100644 (file)
@@ -103,8 +103,7 @@ enum bitset_ops {BITSET_OP_ZERO, BITSET_OP_ONES,
                 BITSET_OP_COPY, BITSET_OP_NOT,
                 BITSET_OP_EMPTY_P, BITSET_OP_EQUAL_P,
                 BITSET_OP_SUBSET_P, BITSET_OP_DISJOINT_P,
-                BITSET_OP_AND, BITSET_OP_OR, BITSET_OP_XOR,
-                BITSET_OP_ANDN, BITSET_OP_ORN,
+                BITSET_OP_AND, BITSET_OP_OR, BITSET_OP_XOR, BITSET_OP_ANDN,
                 BITSET_OP_OR_AND, BITSET_OP_AND_OR, BITSET_OP_ANDN_OR};
 
 /* Return size in bits of bitset SRC.  */
@@ -181,10 +180,6 @@ enum bitset_ops {BITSET_OP_ZERO, BITSET_OP_ONES,
 #define BITSET_ANDN_(DST, SRC1, SRC2) BITSET_OP3_ (DST, SRC1, SRC2, \
   BITSET_OP_ANDN)
 
-/* DST = SRC1 | ~SRC2.  */
-#define BITSET_ORN_(DST, SRC1, SRC2) BITSET_OP3_ (DST, SRC1, SRC2, \
-  BITSET_OP_ORN)
-
 /* DST = (SRC1 & SRC2) | SRC3.  Return non-zero if
    DST != (SRC1 & SRC2) | SRC3.  */
 #define BITSET_AND_OR_(DST, SRC1, SRC2, SRC3)\
@@ -219,6 +214,11 @@ struct bbitset_struct
   bitset_windex cindex;                /* Cache word index.  */
   bitset_windex csize;         /* Cache size in words.  */
   bitset_word *cdata;          /* Cache data pointer.  */
+  /* Perhaps we could sacrifice another word to indicate
+     that the bitset is known to be zero, that a bit has been set
+     in the cache, and that a bit has been cleared in the cache.
+     This would speed up some of the searches but slightly slow down
+     bit set/reset operations of cached bits.  */
 };
 
 
index 23df17919f6e43d0cc4cab555efd596bbeab01a0..a8897fb72f4168674be89bfdf238fd7d6310b837 100644 (file)
@@ -345,6 +345,42 @@ bitset_last (src)
 }
 
 
+/* Return non-zero if BITNO in SRC is the only set bit.  */
+int
+bitset_only_set_p (src, bitno)
+     bitset src;
+     bitset_bindex bitno;
+{
+  bitset_bindex val[2];
+  bitset_bindex next = 0;
+
+  if (bitset_list (src, val, 2, &next) != 1)
+    return 0;
+  return val[0] == bitno;
+}
+
+
+/* Toggle bit BITNO in bitset BSET and return non-zero if now set.  */
+int
+bitset_toggle (bset, bitno)
+    bitset bset;
+    bitset_bindex bitno;
+{
+  /* This routine is for completeness.  It could be optimized if
+     required.  */
+  if (bitset_test (bset, bitno))
+    {
+      bitset_reset (bset, bitno);
+      return 0;
+    }
+  else
+    {
+      bitset_set (bset, bitno);
+      return 1;
+    }
+}
+
+
 /* Print contents of bitset BSET to FILE.   */
 static void
 bitset_print (file, bset, verbose)
@@ -545,18 +581,6 @@ bitset_andn (dst, src1, src2)
 }
 
 
-/* DST = SRC1 | ~SRC2.  Return non-zero if DST != SRC1 | ~SRC2.  */
-int
-bitset_orn (dst, src1, src2)
-     bitset dst;
-     bitset src1;
-     bitset src2;
-{
-  BITSET_CHECK3_ (dst, src1, src2);
-  return BITSET_ORN_ (dst, src1, src2);
-}
-
-
 int
 bitset_op4 (dst, src1, src2, src3, op)
      bitset dst;
@@ -569,7 +593,7 @@ bitset_op4 (dst, src1, src2, src3, op)
   bitset tmp;
 
   /* Create temporary bitset.  */
-  tmp = bitset_alloc (BITSET_TYPE_ (dst), 0);
+  tmp = bitset_alloc (0, BITSET_TYPE_ (dst));
 
   switch (op)
     {
index b96a7e6724902f00e1e800dd7b9d540054eeba70..62d4c651a2046cc11915b58b689873745d937488 100644 (file)
@@ -179,6 +179,9 @@ do                                                                  \
 #define bitset_test(SRC, BITNO) BITSET_TEST_ (SRC, BITNO)
 #endif
 
+/* Toggle bit BITNO in bitset BSET and return non-zero if now set.  */
+extern int bitset_toggle PARAMS ((bitset, bitset_bindex));
+
 /* DST = 0.  */
 extern int bitset_zero PARAMS ((bitset));
 
@@ -215,9 +218,6 @@ extern int bitset_xor PARAMS ((bitset, bitset, bitset));
 /* DST = SRC1 & ~SRC2.  Return non-zero if DST != SRC1 & ~SRC2.  */
 extern int bitset_andn PARAMS ((bitset, bitset, bitset));
 
-/* DST = SRC1 | ~SRC2.  Return non-zero if DST != SRC1 | ~SRC2.  */
-extern int bitset_orn PARAMS ((bitset, bitset, bitset));
-
 /* DST = (SRC1 | SRC2) & SRC3.  Return non-zero if
    DST != (SRC1 | SRC2) & SRC3.  */
 extern int bitset_or_and PARAMS ((bitset, bitset, bitset, bitset));
@@ -236,6 +236,9 @@ extern int bitset_next PARAMS ((bitset, bitset_bindex));
 /* Find previous bit set in BSET starting from and including BITNO.  */
 extern int bitset_prev PARAMS ((bitset, bitset_bindex));
 
+/* Return non-zero if BITNO in SRC is the only set bit.  */
+extern int bitset_only_set_p PARAMS ((bitset, bitset_bindex));
+
 /* Find list of up to NUM bits set in BSET starting from and including
    *NEXT.  Return with actual number of bits found and with *NEXT
    indicating where search stopped.  */
index b6eb77e84b909775ea0fdbaf4c8afa5e2c416074..be4bfa7da95514fa09377de5d8f6343c58f231de 100644 (file)
@@ -111,6 +111,37 @@ bitsetv_ones (bsetv)
 }
 
 
+/* Given a vector BSETV of N bitsets of size N, modify its contents to
+   be the transitive closure of what was given.  */
+void
+bitsetv_transitive_closure (bsetv)
+     bitset *bsetv;
+{
+  unsigned int i;
+  unsigned int j;
+
+  for (i = 0; bsetv[i]; i++)
+    for (j = 0; bsetv[j]; j++)
+      if (bitset_test (bsetv[j], i))
+        bitset_or (bsetv[j], bsetv[j], bsetv[i]);
+}
+
+
+/* Given a vector BSETV of N bitsets of size N, modify its contents to
+   be the reflexive transitive closure of what was given.  This is 
+   the same as transitive closure but with all bits on the diagonal
+   of the bit matrix set.  */
+void
+bitsetv_reflexive_transitive_closure (bitsetv bsetv)
+{
+  int i;
+
+  bitsetv_transitive_closure (bsetv);
+  for (i = 0; bsetv[i]; i++)
+    bitset_set (bsetv[i], i);
+}
+
+
 /* Dump the contents of a bitset vector BSETV with N_VECS elements to
    FILE.  */
 void
index 34617054e8168c1fd9da575dadeac96446098730..84a2c667fff49b29bb82e9dfa57683988539673a 100644 (file)
@@ -42,7 +42,21 @@ extern void bitsetv_zero PARAMS ((bitsetv));
 /* Set vector of bitsets.  */
 extern void bitsetv_ones PARAMS ((bitsetv));
 
+/* Given a vector BSETV of N bitsets of size N, modify its contents to
+   be the transitive closure of what was given.  */
+extern void bitsetv_transitive_closure PARAMS ((bitsetv));
+
+/* Given a vector BSETV of N bitsets of size N, modify its contents to
+   be the reflexive transitive closure of what was given.  This is 
+   the same as transitive closure but with all bits on the diagonal
+   of the bit matrix set.  */
+extern void bitsetv_reflexive_transitive_closure PARAMS ((bitsetv));
+
 /* Dump vector of bitsets.  */
 extern void bitsetv_dump PARAMS ((FILE *, const char *,
                                  const char *, bitsetv));
+
+/* Function to debug vector of bitsets from debugger.  */
+extern void debug_bitsetv PARAMS ((bitsetv));
+
 #endif  /* _BITSETV_H  */
index 9b1d91bf7962f1640b8aed321e074c2c57c3cece..3e84efa8ab8dc8787c21157dbca94e08b342398d 100644 (file)
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
+*/
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include "bbitset.h"
+#include "ebitset.h"
 #include "obstack.h"
 #include <stdlib.h>
 
@@ -311,9 +312,9 @@ ebitset_elt_zero_p (elt)
 
 
 static ebitset_elt *
-ebitset_elt_find (bset, index, mode)
+ebitset_elt_find (bset, windex, mode)
      bitset bset;
-     bitset_windex index;
+     bitset_windex windex;
      enum ebitset_find_mode mode;
 {
   ebitset_elt *elt;
@@ -321,15 +322,13 @@ ebitset_elt_find (bset, index, mode)
   unsigned int eindex;
   ebitset_elts *elts;
 
-  eindex = index / EBITSET_ELT_WORDS;
+  eindex = windex / EBITSET_ELT_WORDS;
 
   elts = EBITSET_ELTS (bset);
   size = EBITSET_SIZE (bset);
 
   if (eindex < size)
     {
-      ebitset_elt *elt;
-
       if ((elt = elts[eindex]))
        {
          if (EBITSET_WORDS (elt) == bset->b.cdata)
@@ -581,11 +580,11 @@ ebitset_set (dst, bitno)
      bitset dst;
      bitset_bindex bitno;
 {
-  bitset_windex index = bitno / BITSET_WORD_BITS;
+  bitset_windex windex = bitno / BITSET_WORD_BITS;
 
-  ebitset_elt_find (dst, index, EBITSET_CREATE);
+  ebitset_elt_find (dst, windex, EBITSET_CREATE);
 
-  dst->b.cdata[index - dst->b.cindex] |= (1 << (bitno % BITSET_WORD_BITS));
+  dst->b.cdata[windex - dst->b.cindex] |= (1 << (bitno % BITSET_WORD_BITS));
 }
 
 
@@ -595,15 +594,15 @@ ebitset_reset (dst, bitno)
      bitset dst;
      bitset_bindex bitno;
 {
-  bitset_windex index = bitno / BITSET_WORD_BITS;
+  bitset_windex windex = bitno / BITSET_WORD_BITS;
 
-  if (!ebitset_elt_find (dst, index, EBITSET_FIND))
+  if (!ebitset_elt_find (dst, windex, EBITSET_FIND))
     return;
 
-  dst->b.cdata[index - dst->b.cindex] &= ~(1 << (bitno % BITSET_WORD_BITS));
+  dst->b.cdata[windex - dst->b.cindex] &= ~(1 << (bitno % BITSET_WORD_BITS));
 
   /* If all the data is zero, perhaps we should remove it now... 
-     However, there could be a good chance that the element will be needed
+     However, there is a good chance that the element will be needed
      again soon.  */
 }
 
@@ -614,13 +613,13 @@ ebitset_test (src, bitno)
      bitset src;
      bitset_bindex bitno;
 {
-  bitset_windex index = bitno / BITSET_WORD_BITS;
+  bitset_windex windex = bitno / BITSET_WORD_BITS;
 
-  if (!ebitset_elt_find (src, index, EBITSET_FIND))
+  if (!ebitset_elt_find (src, windex, EBITSET_FIND))
     return 0;
 
   return (src->b.
-         cdata[index - src->b.cindex] >> (bitno % BITSET_WORD_BITS)) & 1;
+         cdata[windex - src->b.cindex] >> (bitno % BITSET_WORD_BITS)) & 1;
 }
 
 
@@ -646,11 +645,11 @@ ebitset_reverse_list (bset, list, num, next)
   bitset_bindex n_bits;
   bitset_bindex bitno;
   bitset_bindex rbitno;
-  unsigned int bitcnt;
-  bitset_bindex bitoff;
-  bitset_windex index;
-  unsigned int eindex;
+  unsigned int bcount;
+  bitset_bindex boffset;
   bitset_windex windex;
+  unsigned int eindex;
+  bitset_windex woffset;
   bitset_bindex count;
   bitset_windex size;
   bitset_word word;
@@ -670,18 +669,19 @@ ebitset_reverse_list (bset, list, num, next)
 
   bitno = n_bits - (rbitno + 1);
 
-  index = bitno / BITSET_WORD_BITS;
+  windex = bitno / BITSET_WORD_BITS;
   eindex = bitno / EBITSET_ELT_BITS;
-  windex = index - eindex * EBITSET_ELT_WORDS;
+  woffset = windex - eindex * EBITSET_ELT_WORDS;
 
   /* If num is 1, we could speed things up with a binary search
      of the word of interest.  */
 
   count = 0;
-  bitcnt = bitno % BITSET_WORD_BITS;
-  bitoff = index * BITSET_WORD_BITS;
+  bcount = bitno % BITSET_WORD_BITS;
+  boffset = windex * BITSET_WORD_BITS;
 
-  for (; eindex != ~0U; eindex--)
+  for (; eindex != ~0U; 
+       boffset = eindex * EBITSET_ELT_BITS - BITSET_WORD_BITS, eindex--) 
     {
       ebitset_elt *elt;
       bitset_word *srcp;
@@ -692,19 +692,19 @@ ebitset_reverse_list (bset, list, num, next)
 
       srcp = EBITSET_WORDS (elt);
 
-      for (; windex != ~0U; windex--, bitoff -= BITSET_WORD_BITS,
-            bitcnt = BITSET_WORD_BITS - 1)
+      for (; woffset != ~0U; woffset--, boffset -= BITSET_WORD_BITS,
+            bcount = BITSET_WORD_BITS - 1)
        {
-         word = srcp[windex] << (BITSET_WORD_BITS - 1 - bitcnt);
+         word = srcp[woffset] << (BITSET_WORD_BITS - 1 - bcount);
 
-         for (; word; bitcnt--)
+         for (; word; bcount--)
            {
              if (word & BITSET_MSB)
                {
-                 list[count++] = bitoff + bitcnt;
+                 list[count++] = boffset + bcount;
                  if (count >= num)
                    {
-                     *next = n_bits - (bitoff + bitcnt);
+                     *next = n_bits - (boffset + bcount);
                      return count;
                    }
                }
@@ -712,10 +712,10 @@ ebitset_reverse_list (bset, list, num, next)
            }
        }
 
-      windex = EBITSET_ELT_WORDS;
+      woffset = EBITSET_ELT_WORDS;
     }
 
-  *next = n_bits - (bitoff + 1);
+  *next = n_bits - (boffset + 1);
   return count;
 }
 
@@ -731,7 +731,7 @@ ebitset_list (bset, list, num, next)
      bitset_bindex *next;
 {
   bitset_bindex bitno;
-  bitset_windex index;
+  bitset_windex windex;
   unsigned int eindex;
   bitset_bindex count;
   bitset_windex size;
@@ -756,15 +756,15 @@ ebitset_list (bset, list, num, next)
       elt = elts[eindex];
       if (elt)
        {
-         bitset_windex windex;
+         bitset_windex woffset;
          bitset_word *srcp = EBITSET_WORDS (elt);
 
-         index = bitno / BITSET_WORD_BITS;
-         windex = eindex / EBITSET_ELT_WORDS;
+         windex = bitno / BITSET_WORD_BITS;
+         woffset = eindex / EBITSET_ELT_WORDS;
 
-         for (; (index - windex) < EBITSET_ELT_WORDS; index++)
+         for (; (windex - woffset) < EBITSET_ELT_WORDS; windex++)
            {
-             word = srcp[index - windex] >> (bitno % BITSET_WORD_BITS);
+             word = srcp[windex - woffset] >> (bitno % BITSET_WORD_BITS);
 
              for (; word; bitno++)
                {
@@ -779,7 +779,7 @@ ebitset_list (bset, list, num, next)
                    }
                  word >>= 1;
                }
-             bitno = (index + 1) * BITSET_WORD_BITS;
+             bitno = (windex + 1) * BITSET_WORD_BITS;
            }
        }
 
@@ -793,7 +793,6 @@ ebitset_list (bset, list, num, next)
   for (; eindex < size; eindex++)
     {
       int i;
-      ebitset_elt *elt;
       bitset_word *srcp;
 
       elt = elts[eindex];
@@ -801,15 +800,15 @@ ebitset_list (bset, list, num, next)
        continue;
 
       srcp = EBITSET_WORDS (elt);
-      index = eindex * EBITSET_ELT_WORDS;
+      windex = eindex * EBITSET_ELT_WORDS;
 
       if ((count + EBITSET_ELT_BITS) < num)
        {
          /* The coast is clear, plant boot!  */
 
-         for (i = 0; i < EBITSET_ELT_WORDS; i++, index++)
+         for (i = 0; i < EBITSET_ELT_WORDS; i++, windex++)
            {
-             bitno = index * BITSET_WORD_BITS;
+             bitno = windex * BITSET_WORD_BITS;
 
              word = srcp[i];
              if (word)
@@ -838,9 +837,9 @@ ebitset_list (bset, list, num, next)
          /* Tread more carefully since we need to check
             if array overflows.  */
 
-         for (i = 0; i < EBITSET_ELT_WORDS; i++, index++)
+         for (i = 0; i < EBITSET_ELT_WORDS; i++, windex++)
            {
-             bitno = index * BITSET_WORD_BITS;
+             bitno = windex * BITSET_WORD_BITS;
 
              for (word = srcp[i]; word; bitno++)
                {
@@ -953,9 +952,6 @@ ebitset_op2 (dst, src, op)
 
        for (j = 0; j < ssize; j++)
          {
-           ebitset_elt *selt;
-           ebitset_elt *delt;
-
            selt = j < ssize ? selts[j] : 0;
            delt = j < dsize ? delts[j] : 0;
 
@@ -992,20 +988,12 @@ ebitset_op2 (dst, src, op)
 
        for (j = 0; j < ssize; j++)
          {
-           ebitset_elt *selt;
-           ebitset_elt *delt;
-
            selt = j < ssize ? selts[j] : 0;
            delt = j < dsize ? delts[j] : 0;
 
-           if (!selt && !delt)
+           if (!selt || !delt)
              continue;
 
-           if (!selt)
-             selt = &ebitset_zero_elts[0];
-           if (!delt)
-             delt = &ebitset_zero_elts[0];
-
            for (i = 0; i < EBITSET_ELT_WORDS; i++)
              if ((EBITSET_WORDS (selt)[i] & EBITSET_WORDS (delt)[i]))
                return 0;
@@ -1175,19 +1163,6 @@ ebitset_op3 (dst, src1, src2, op)
            }
          break;
 
-       case BITSET_OP_ORN:
-         for (i = 0; i < EBITSET_ELT_WORDS; i++, dstp++)
-           {
-             bitset_word tmp = *srcp1++ | ~(*srcp2++);
-
-             if (*dstp != tmp)
-               {
-                 changed = 1;
-                 *dstp = tmp;
-               }
-           }
-         break;
-
        default:
          abort ();
        }
index 39e5b4e56ab8f89cff9a7e3d043638747d67986b..f426c3010527e4141fac33a815c9042a2a6e06ae 100644 (file)
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include "bbitset.h"
+#include "lbitset.h"
 #include "obstack.h"
 #include <stdlib.h>
 
@@ -82,7 +83,7 @@ struct bitset_struct
 enum lbitset_find_mode
   { LBITSET_FIND, LBITSET_CREATE, LBITSET_SUBST };
 
-static lbitset_elt lbitset_zero_elts[3];       /* Elements of all zero bits.  */
+static lbitset_elt lbitset_zero_elts[3]; /* Elements of all zero bits.  */
 
 /* Obstack to allocate bitset elements from.  */
 static struct obstack lbitset_obstack;
@@ -306,7 +307,7 @@ lbitset_elt_link (bset, elt)
      bitset bset;
      lbitset_elt *elt;
 {
-  bitset_windex index = elt->index;
+  bitset_windex windex = elt->index;
   lbitset_elt *ptr;
   lbitset_elt *current;
 
@@ -325,10 +326,10 @@ lbitset_elt_link (bset, elt)
 
   /* If this index is less than that of the current element, it goes
      somewhere before the current element.  */
-  else if (index < bset->b.cindex)
+  else if (windex < bset->b.cindex)
     {
       for (ptr = current;
-          ptr->prev && ptr->prev->index > index; ptr = ptr->prev)
+          ptr->prev && ptr->prev->index > windex; ptr = ptr->prev)
        continue;
 
       if (ptr->prev)
@@ -345,7 +346,7 @@ lbitset_elt_link (bset, elt)
   else
     {
       for (ptr = current;
-          ptr->next && ptr->next->index < index; ptr = ptr->next)
+          ptr->next && ptr->next->index < windex; ptr = ptr->next)
        continue;
 
       if (ptr->next)
@@ -359,16 +360,16 @@ lbitset_elt_link (bset, elt)
     }
 
   /* Set up so this is the first element searched.  */
-  bset->b.cindex = index;
+  bset->b.cindex = windex;
   bset->b.csize = LBITSET_ELT_WORDS;
   bset->b.cdata = elt->words;
 }
 
 
 static lbitset_elt *
-lbitset_elt_find (bset, index, mode)
+lbitset_elt_find (bset, windex, mode)
      bitset bset;
-     bitset_windex index;
+     bitset_windex windex;
      enum lbitset_find_mode mode;
 {
   lbitset_elt *elt;
@@ -378,7 +379,7 @@ lbitset_elt_find (bset, index, mode)
     {
       current = LBITSET_CURRENT (bset);
       /* Check if element is the cached element.  */
-      if ((index - bset->b.cindex) < bset->b.csize)
+      if ((windex - bset->b.cindex) < bset->b.csize)
        return current;
     }
   else
@@ -388,23 +389,23 @@ lbitset_elt_find (bset, index, mode)
 
   if (current)
     {
-      if (index < bset->b.cindex)
+      if (windex < bset->b.cindex)
        {
          for (elt = current;
-              elt->prev && elt->index > index; elt = elt->prev)
+              elt->prev && elt->index > windex; elt = elt->prev)
            continue;
        }
       else
        {
          for (elt = current;
-              elt->next && (elt->index + LBITSET_ELT_WORDS - 1) < index;
+              elt->next && (elt->index + LBITSET_ELT_WORDS - 1) < windex;
               elt = elt->next)
            continue;
        }
 
       /* `element' is the nearest to the one we want.  If it's not the one
         we want, the one we want does not exist.  */
-      if (elt && (index - elt->index) < LBITSET_ELT_WORDS)
+      if (elt && (windex - elt->index) < LBITSET_ELT_WORDS)
        {
          bset->b.cindex = elt->index;
          bset->b.csize = LBITSET_ELT_WORDS;
@@ -419,10 +420,10 @@ lbitset_elt_find (bset, index, mode)
       return 0;
 
     case LBITSET_CREATE:
-      index = (index / (unsigned) LBITSET_ELT_WORDS) * LBITSET_ELT_WORDS;
+      windex = (windex / (unsigned) LBITSET_ELT_WORDS) * LBITSET_ELT_WORDS;
 
       elt = lbitset_elt_calloc ();
-      elt->index = index;
+      elt->index = windex;
       lbitset_elt_link (bset, elt);
       return elt;
 
@@ -585,11 +586,11 @@ lbitset_set (dst, bitno)
      bitset dst;
      bitset_bindex bitno;
 {
-  bitset_windex index = bitno / BITSET_WORD_BITS;
+  bitset_windex windex = bitno / BITSET_WORD_BITS;
 
-  lbitset_elt_find (dst, index, LBITSET_CREATE);
+  lbitset_elt_find (dst, windex, LBITSET_CREATE);
 
-  dst->b.cdata[index - dst->b.cindex] |= (1 << (bitno % BITSET_WORD_BITS));
+  dst->b.cdata[windex - dst->b.cindex] |= (1 << (bitno % BITSET_WORD_BITS));
 }
 
 
@@ -599,12 +600,12 @@ lbitset_reset (dst, bitno)
      bitset dst;
      bitset_bindex bitno;
 {
-  bitset_windex index = bitno / BITSET_WORD_BITS;
+  bitset_windex windex = bitno / BITSET_WORD_BITS;
 
-  if (!lbitset_elt_find (dst, index, LBITSET_FIND))
+  if (!lbitset_elt_find (dst, windex, LBITSET_FIND))
     return;
 
-  dst->b.cdata[index - dst->b.cindex] &= ~(1 << (bitno % BITSET_WORD_BITS));
+  dst->b.cdata[windex - dst->b.cindex] &= ~(1 << (bitno % BITSET_WORD_BITS));
 
   /* If all the data is zero, perhaps we should unlink it now...  */
 }
@@ -616,13 +617,13 @@ lbitset_test (src, bitno)
      bitset src;
      bitset_bindex bitno;
 {
-  bitset_windex index = bitno / BITSET_WORD_BITS;
+  bitset_windex windex = bitno / BITSET_WORD_BITS;
 
-  if (!lbitset_elt_find (src, index, LBITSET_FIND))
+  if (!lbitset_elt_find (src, windex, LBITSET_FIND))
     return 0;
 
-  return (src->b.
-         cdata[index - src->b.cindex] >> (bitno % BITSET_WORD_BITS)) & 1;
+  return (src->b.cdata[windex - src->b.cindex] 
+         >> (bitno % BITSET_WORD_BITS)) & 1;
 }
 
 
@@ -646,9 +647,9 @@ lbitset_reverse_list (bset, list, num, next)
 {
   bitset_bindex rbitno;
   bitset_bindex bitno;
-  unsigned int bitcnt;
-  bitset_bindex bitoff;
-  bitset_windex index;
+  unsigned int bcount;
+  bitset_bindex boffset;
+  bitset_windex windex;
   bitset_bindex count;
   lbitset_elt *elt;
   bitset_word word;
@@ -666,10 +667,10 @@ lbitset_reverse_list (bset, list, num, next)
 
   bitno = n_bits - (rbitno + 1);
 
-  index = bitno / BITSET_WORD_BITS;
+  windex = bitno / BITSET_WORD_BITS;
 
   /* Skip back to starting element.  */
-  for (; elt && elt->index > index; elt = elt->prev)
+  for (; elt && elt->index > windex; elt = elt->prev)
     continue;
 
   if (!elt)
@@ -679,28 +680,28 @@ lbitset_reverse_list (bset, list, num, next)
      of the word of interest.  */
 
   count = 0;
-  bitcnt = bitno % BITSET_WORD_BITS;
-  bitoff = index * BITSET_WORD_BITS;
+  bcount = bitno % BITSET_WORD_BITS;
+  boffset = windex * BITSET_WORD_BITS;
 
   while (elt)
     {
       bitset_word *srcp = elt->words;
 
-      for (; (index - elt->index) < LBITSET_ELT_WORDS;
-          index--, bitoff -= BITSET_WORD_BITS,
-            bitcnt = BITSET_WORD_BITS - 1)
+      for (; (windex - elt->index) < LBITSET_ELT_WORDS;
+          windex--, boffset -= BITSET_WORD_BITS,
+            bcount = BITSET_WORD_BITS - 1)
        {
          word =
-           srcp[index - elt->index] << (BITSET_WORD_BITS - 1 - bitcnt);
+           srcp[windex - elt->index] << (BITSET_WORD_BITS - 1 - bcount);
 
-         for (; word; bitcnt--)
+         for (; word; bcount--)
            {
              if (word & BITSET_MSB)
                {
-                 list[count++] = bitoff + bitcnt;
+                 list[count++] = boffset + bcount;
                  if (count >= num)
                    {
-                     *next = n_bits - (bitoff + bitcnt);
+                     *next = n_bits - (boffset + bcount);
                      return count;
                    }
                }
@@ -711,12 +712,12 @@ lbitset_reverse_list (bset, list, num, next)
       elt = elt->prev;
       if (elt)
        {
-         index = elt->index + LBITSET_ELT_WORDS - 1;
-         bitoff = index * BITSET_WORD_BITS;
+         windex = elt->index + LBITSET_ELT_WORDS - 1;
+         boffset = windex * BITSET_WORD_BITS;
        }
     }
 
-  *next = n_bits - (bitoff + 1);
+  *next = n_bits - (boffset + 1);
   return count;
 }
 
@@ -732,7 +733,7 @@ lbitset_list (bset, list, num, next)
      bitset_bindex *next;
 {
   bitset_bindex bitno;
-  bitset_windex index;
+  bitset_windex windex;
   bitset_bindex count;
   lbitset_elt *elt;
   lbitset_elt *head;
@@ -751,26 +752,26 @@ lbitset_list (bset, list, num, next)
 
       /* Start with the first element.  */
       elt = head;
-      index = elt->index;
-      bitno = index * BITSET_WORD_BITS;
+      windex = elt->index;
+      bitno = windex * BITSET_WORD_BITS;
     }
   else
     {
-      index = bitno / BITSET_WORD_BITS;
+      windex = bitno / BITSET_WORD_BITS;
 
       /* Skip to starting element.  */
       for (elt = head;
-          elt && (elt->index + LBITSET_ELT_WORDS - 1) < index;
+          elt && (elt->index + LBITSET_ELT_WORDS - 1) < windex;
           elt = elt->next)
        continue;
 
       if (!elt)
        return 0;
 
-      if (index < elt->index)
+      if (windex < elt->index)
        {
-         index = elt->index;
-         bitno = index * BITSET_WORD_BITS;
+         windex = elt->index;
+         bitno = windex * BITSET_WORD_BITS;
        }
       else
        {
@@ -778,9 +779,9 @@ lbitset_list (bset, list, num, next)
 
          /* We are starting within an element.  */
 
-         for (; (index - elt->index) < LBITSET_ELT_WORDS; index++)
+         for (; (windex - elt->index) < LBITSET_ELT_WORDS; windex++)
            {
-             word = srcp[index - elt->index] >> (bitno % BITSET_WORD_BITS);
+             word = srcp[windex - elt->index] >> (bitno % BITSET_WORD_BITS);
 
              for (; word; bitno++)
                {
@@ -795,14 +796,14 @@ lbitset_list (bset, list, num, next)
                    }
                  word >>= 1;
                }
-             bitno = (index + 1) * BITSET_WORD_BITS;
+             bitno = (windex + 1) * BITSET_WORD_BITS;
            }
 
          elt = elt->next;
          if (elt)
            {
-             index = elt->index;
-             bitno = index * BITSET_WORD_BITS;
+             windex = elt->index;
+             bitno = windex * BITSET_WORD_BITS;
            }
        }
     }
@@ -841,8 +842,8 @@ lbitset_list (bset, list, num, next)
                  word >>= 1;
                }
            }
-         index++;
-         bitno = index * BITSET_WORD_BITS;
+         windex++;
+         bitno = windex * BITSET_WORD_BITS;
 
          word = srcp[1];
          if (word)
@@ -859,8 +860,8 @@ lbitset_list (bset, list, num, next)
                  word >>= 1;
                }
            }
-         index++;
-         bitno = index * BITSET_WORD_BITS;
+         windex++;
+         bitno = windex * BITSET_WORD_BITS;
 #else
          for (i = 0; i < LBITSET_ELT_WORDS; i++)
            {
@@ -884,8 +885,8 @@ lbitset_list (bset, list, num, next)
                      word >>= 1;
                    }
                }
-             index++;
-             bitno = index * BITSET_WORD_BITS;
+             windex++;
+             bitno = windex * BITSET_WORD_BITS;
            }
 #endif
        }
@@ -909,16 +910,16 @@ lbitset_list (bset, list, num, next)
                    }
                  word >>= 1;
                }
-             index++;
-             bitno = index * BITSET_WORD_BITS;
+             windex++;
+             bitno = windex * BITSET_WORD_BITS;
            }
        }
 
       elt = elt->next;
       if (elt)
        {
-         index = elt->index;
-         bitno = index * BITSET_WORD_BITS;
+         windex = elt->index;
+         bitno = windex * BITSET_WORD_BITS;
        }
     }
 
@@ -933,7 +934,7 @@ lbitset_op1 (dst, op)
      enum bitset_ops op;
 {
   unsigned int i;
-  bitset_windex index;
+  bitset_windex windex;
   lbitset_elt *elt;
 
   switch (op)
@@ -950,8 +951,8 @@ lbitset_op1 (dst, op)
       if (!elt)
        return 0;
 
-      index = elt->index;
-      for (i = 0; i < index; i += LBITSET_ELT_WORDS)
+      windex = elt->index;
+      for (i = 0; i < windex; i += LBITSET_ELT_WORDS)
        {
          /* Create new elements if they cannot be found.  */
          elt = lbitset_elt_find (dst, i, LBITSET_CREATE);
@@ -984,7 +985,7 @@ lbitset_op2 (dst, src, op)
   lbitset_elt *delt;
   unsigned int i;
   unsigned int j;
-  bitset_windex index;
+  bitset_windex windex;
 
   switch (op)
     {
@@ -1000,8 +1001,8 @@ lbitset_op2 (dst, src, op)
       if (!elt)
        return 0;
 
-      index = elt->index;
-      for (i = 0; i < index; i += LBITSET_ELT_WORDS)
+      windex = elt->index;
+      for (i = 0; i < windex; i += LBITSET_ELT_WORDS)
        {
          /* Create new elements for dst if they cannot be found
             or substitute zero elements if src elements not found.  */
@@ -1065,6 +1066,9 @@ lbitset_op2 (dst, src, op)
                  lbitset_zero_elts[1].next = selt;
                  selt = &lbitset_zero_elts[1];
                }
+             /* Since the elements are different, there is no
+                intersection of these elements.  */
+             continue;
            }
 
          for (j = 0; j < LBITSET_ELT_WORDS; j++)
@@ -1091,9 +1095,9 @@ lbitset_op3 (dst, src1, src2, op)
   lbitset_elt *selt1 = LBITSET_HEAD (src1);
   lbitset_elt *selt2 = LBITSET_HEAD (src2);
   lbitset_elt *delt = LBITSET_HEAD (dst);
-  bitset_windex index1;
-  bitset_windex index2;
-  bitset_windex index;
+  bitset_windex windex1;
+  bitset_windex windex2;
+  bitset_windex windex;
   lbitset_elt *stmp1;
   lbitset_elt *stmp2;
   lbitset_elt *dtmp;
@@ -1137,50 +1141,50 @@ lbitset_op3 (dst, src1, src2, op)
   LBITSET_HEAD (dst) = 0;
   dst->b.csize = 0;
 
-  index1 = (selt1) ? selt1->index : BITSET_INDEX_MAX;
-  index2 = (selt2) ? selt2->index : BITSET_INDEX_MAX;
+  windex1 = (selt1) ? selt1->index : BITSET_INDEX_MAX;
+  windex2 = (selt2) ? selt2->index : BITSET_INDEX_MAX;
 
   while (selt1 || selt2)
     {
       /* Figure out whether we need to substitute zero elements for
         missing links.  */
-      if (index1 == index2)
+      if (windex1 == windex2)
        {
-         index = index1;
+         windex = windex1;
          stmp1 = selt1;
          stmp2 = selt2;
          selt1 = selt1->next;
-         index1 = (selt1) ? selt1->index : BITSET_INDEX_MAX;
+         windex1 = (selt1) ? selt1->index : BITSET_INDEX_MAX;
          selt2 = selt2->next;
-         index2 = (selt2) ? selt2->index : BITSET_INDEX_MAX;
+         windex2 = (selt2) ? selt2->index : BITSET_INDEX_MAX;
        }
-      else if (index1 < index2)
+      else if (windex1 < windex2)
        {
-         index = index1;
+         windex = windex1;
          stmp1 = selt1;
          stmp2 = &lbitset_zero_elts[0];
          selt1 = selt1->next;
-         index1 = (selt1) ? selt1->index : BITSET_INDEX_MAX;
+         windex1 = (selt1) ? selt1->index : BITSET_INDEX_MAX;
        }
       else
        {
-         index = index2;
+         windex = windex2;
          stmp1 = &lbitset_zero_elts[0];
          stmp2 = selt2;
          selt2 = selt2->next;
-         index2 = (selt2) ? selt2->index : BITSET_INDEX_MAX;
+         windex2 = (selt2) ? selt2->index : BITSET_INDEX_MAX;
        }
 
       /* Find the appropriate element from DST.  Begin by discarding
         elements that we've skipped.  */
-      while (delt && delt->index < index)
+      while (delt && delt->index < windex)
        {
          changed = 1;
          dtmp = delt;
          delt = delt->next;
          lbitset_elt_free (dtmp);
        }
-      if (delt && delt->index == index)
+      if (delt && delt->index == windex)
        {
          dtmp = delt;
          delt = delt->next;
@@ -1247,26 +1251,13 @@ lbitset_op3 (dst, src1, src2, op)
            }
          break;
 
-       case BITSET_OP_ORN:
-         for (i = 0; i < LBITSET_ELT_WORDS; i++, dstp++)
-           {
-             bitset_word tmp = *srcp1++ | ~(*srcp2++);
-
-             if (*dstp != tmp)
-               {
-                 changed = 1;
-                 *dstp = tmp;
-               }
-           }
-         break;
-
        default:
          abort ();
        }
 
       if (!lbitset_elt_zero_p (dtmp))
        {
-         dtmp->index = index;
+         dtmp->index = windex;
          /* Perhaps this could be optimised...  */
          lbitset_elt_link (dst, dtmp);
        }
index 2e42e9b0e62010bc5d9cdf5fb79a29b47c8460eb..97d13335cd4659ad2e6dffbdb06ec102818e41ee 100644 (file)
@@ -14,7 +14,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
+*/
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -184,7 +185,7 @@ sbitset_reverse_list (src, list, num, next)
   bitset_bindex bitno;
   bitset_bindex rbitno;
   bitset_bindex count;
-  bitset_windex index;
+  bitset_windex windex;
   unsigned int bitcnt;
   bitset_bindex bitoff;
   bitset_word word;
@@ -203,14 +204,14 @@ sbitset_reverse_list (src, list, num, next)
 
   bitno = n_bits - (rbitno + 1);
 
-  index = bitno / BITSET_WORD_BITS;
+  windex = bitno / BITSET_WORD_BITS;
   bitcnt = bitno % BITSET_WORD_BITS;
-  bitoff = index * BITSET_WORD_BITS;
+  bitoff = windex * BITSET_WORD_BITS;
 
-  for (; index != ~0U; index--, bitoff -= BITSET_WORD_BITS,
+  for (; windex != ~0U; windex--, bitoff -= BITSET_WORD_BITS,
         bitcnt = BITSET_WORD_BITS - 1)
     {
-      word = srcp[index] << (BITSET_WORD_BITS - 1 - bitcnt);
+      word = srcp[windex] << (BITSET_WORD_BITS - 1 - bitcnt);
       for (; word; bitcnt--)
        {
          if (word & BITSET_MSB)
@@ -243,7 +244,7 @@ sbitset_list (src, list, num, next)
 {
   bitset_bindex bitno;
   bitset_bindex count;
-  bitset_windex index;
+  bitset_windex windex;
   bitset_bindex bitoff;
   bitset_windex size = src->b.csize;
   bitset_word *srcp = SBITSET_WORDS (src);
@@ -255,22 +256,22 @@ sbitset_list (src, list, num, next)
   if (!bitno)
     {
       /* Many bitsets are zero, so make this common case fast.  */
-      for (index = 0; index < size && !srcp[index]; index++)
+      for (windex = 0; windex < size && !srcp[windex]; windex++)
        continue;
-      if (index >= size)
+      if (windex >= size)
        return 0;
 
       /* If num is 1, we could speed things up with a binary search
         of the current word.  */
 
-      bitoff = index * BITSET_WORD_BITS;
+      bitoff = windex * BITSET_WORD_BITS;
     }
   else
     {
       if (bitno >= SBITSET_N_BITS (src))
        return 0;
 
-      index = bitno / BITSET_WORD_BITS;
+      windex = bitno / BITSET_WORD_BITS;
       bitno = bitno % BITSET_WORD_BITS;
 
       if (bitno)
@@ -280,8 +281,8 @@ sbitset_list (src, list, num, next)
             with many set bits where we filled the array
             on the previous call to this function.  */
 
-         bitoff = index * BITSET_WORD_BITS;
-         word = srcp[index] >> bitno;
+         bitoff = windex * BITSET_WORD_BITS;
+         word = srcp[windex] >> bitno;
          for (bitno = bitoff + bitno; word; bitno++)
            {
              if (word & 1)
@@ -295,14 +296,14 @@ sbitset_list (src, list, num, next)
                }
              word >>= 1;
            }
-         index++;
+         windex++;
        }
-      bitoff = index * BITSET_WORD_BITS;
+      bitoff = windex * BITSET_WORD_BITS;
     }
 
-  for (; index < size; index++, bitoff += BITSET_WORD_BITS)
+  for (; windex < size; windex++, bitoff += BITSET_WORD_BITS)
     {
-      if (!(word = srcp[index]))
+      if (!(word = srcp[windex]))
        continue;
 
       if ((count + BITSET_WORD_BITS) < num)
@@ -519,20 +520,6 @@ sbitset_op3 (dst, src1, src2, op)
        }
       break;
 
-    case BITSET_OP_ORN:
-      for (i = 0; i < size; i++, dstp++)
-       {
-         bitset_word tmp = *src1p++ | ~(*src2p++);
-
-         if (*dstp != tmp)
-           {
-             changed = 1;
-             *dstp = tmp;
-           }
-       }
-      sbitset_unused_clear (dst);
-      break;
-
     default:
       abort ();
     }