]> git.saurik.com Git - bison.git/blobdiff - lib/abitset.c
Merge remote-tracking branch 'origin/maint'
[bison.git] / lib / abitset.c
index 2d5ca293c7c4d516eafbe7d81ca0b0cfeb709480..be96862e0e0fc21a6af246ba83229809d2ab32de 100644 (file)
@@ -1,10 +1,13 @@
 /* Array bitsets.
-   Copyright (C) 2002 Free Software Foundation, Inc.
+
+   Copyright (C) 2002-2003, 2006, 2009-2012 Free Software Foundation,
+   Inc.
+
    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
 
-   This program is free software; you can redistribute it and/or modify
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
 
    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.
-*/
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+#include <config.h>
 
 #include "abitset.h"
 #include <stddef.h>
 
 #define ABITSET_N_WORDS(N) (((N) + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS)
 #define ABITSET_WORDS(X) ((X)->a.words)
-#define ABITSET_N_BITS(X) ((X)->a.n_bits)
 
 
-/* Return size in bits of bitset SRC.  */
 static bitset_bindex
-abitset_size (bitset src)
+abitset_resize (bitset src, bitset_bindex size)
 {
-  return ABITSET_N_BITS (src);
-}
+    /* These bitsets have a fixed size.  */
+    if (BITSET_SIZE_ (src) != size)
+      abort ();
 
+    return size;
+}
 
 /* Find list of up to NUM bits set in BSET starting from and including
  *NEXT and store in array LIST.  Return with actual number of bits
  found and with *NEXT indicating where search stopped.  */
 static bitset_bindex
 abitset_small_list (bitset src, bitset_bindex *list,
-                   bitset_bindex num, bitset_bindex *next)
+                    bitset_bindex num, bitset_bindex *next)
 {
   bitset_bindex bitno;
   bitset_bindex count;
@@ -60,7 +60,7 @@ abitset_small_list (bitset src, bitset_bindex *list,
   if (!word)
     return 0;
 
-  size = ABITSET_N_BITS (src);
+  size = BITSET_SIZE_ (src);
   bitno = *next;
   if (bitno >= size)
     return 0;
@@ -73,27 +73,27 @@ abitset_small_list (bitset src, bitset_bindex *list,
   if (num >= BITSET_WORD_BITS)
     {
       for (count = 0; word; bitno++)
-       {
-         if (word & 1)
-           list[count++] = bitno;
-         word >>= 1;
-       }
+        {
+          if (word & 1)
+            list[count++] = bitno;
+          word >>= 1;
+        }
     }
   else
     {
       for (count = 0; word; bitno++)
-       {
-         if (word & 1)
-           {
-             list[count++] = bitno;
-             if (count >= num)
-               {
-                 bitno++;
-                 break;
-               }
-           }
-         word >>= 1;
-       }
+        {
+          if (word & 1)
+            {
+              list[count++] = bitno;
+              if (count >= num)
+                {
+                  bitno++;
+                  break;
+                }
+            }
+          word >>= 1;
+        }
     }
 
   *next = bitno;
@@ -105,8 +105,9 @@ abitset_small_list (bitset src, bitset_bindex *list,
 static void
 abitset_set (bitset dst ATTRIBUTE_UNUSED, bitset_bindex bitno ATTRIBUTE_UNUSED)
 {
-  /* This should never occur for abitsets since we should always
-     hit the cache.  */
+  /* This should never occur for abitsets since we should always hit
+     the cache.  It is likely someone is trying to access outside the
+     bounds of the bitset.  */
   abort ();
 }
 
@@ -114,23 +115,22 @@ abitset_set (bitset dst ATTRIBUTE_UNUSED, bitset_bindex bitno ATTRIBUTE_UNUSED)
 /* Reset bit BITNO in bitset DST.  */
 static void
 abitset_reset (bitset dst ATTRIBUTE_UNUSED,
-              bitset_bindex bitno ATTRIBUTE_UNUSED)
+               bitset_bindex bitno ATTRIBUTE_UNUSED)
 {
-  /* This should never occur for abitsets since we should always
-     hit the cache.  */
-  abort ();
+  /* This should never occur for abitsets since we should always hit
+     the cache.  It is likely someone is trying to access outside the
+     bounds of the bitset.  Since the bit is zero anyway, let it pass.  */
 }
 
 
 /* Test bit BITNO in bitset SRC.  */
-static int
+static bool
 abitset_test (bitset src ATTRIBUTE_UNUSED,
-             bitset_bindex bitno ATTRIBUTE_UNUSED)
+              bitset_bindex bitno ATTRIBUTE_UNUSED)
 {
   /* This should never occur for abitsets since we should always
      hit the cache.  */
-  abort ();
-  return 0;
+  return false;
 }
 
 
@@ -140,7 +140,7 @@ abitset_test (bitset src ATTRIBUTE_UNUSED,
    stopped.  */
 static bitset_bindex
 abitset_list_reverse (bitset src, bitset_bindex *list,
-                     bitset_bindex num, bitset_bindex *next)
+                      bitset_bindex num, bitset_bindex *next)
 {
   bitset_bindex bitno;
   bitset_bindex rbitno;
@@ -149,7 +149,7 @@ abitset_list_reverse (bitset src, bitset_bindex *list,
   unsigned int bitcnt;
   bitset_bindex bitoff;
   bitset_word *srcp = ABITSET_WORDS (src);
-  bitset_bindex n_bits = ABITSET_N_BITS (src);
+  bitset_bindex n_bits = BITSET_SIZE_ (src);
 
   rbitno = *next;
 
@@ -173,18 +173,18 @@ abitset_list_reverse (bitset src, bitset_bindex *list,
 
       word = srcp[windex] << (BITSET_WORD_BITS - 1 - bitcnt);
       for (; word; bitcnt--)
-       {
-         if (word & BITSET_MSB)
-           {
-             list[count++] = bitoff + bitcnt;
-             if (count >= num)
-               {
-                 *next = n_bits - (bitoff + bitcnt);
-                 return count;
-               }
-           }
-         word <<= 1;
-       }
+        {
+          if (word & BITSET_MSB)
+            {
+              list[count++] = bitoff + bitcnt;
+              if (count >= num)
+                {
+                  *next = n_bits - (bitoff + bitcnt);
+                  return count;
+                }
+            }
+          word <<= 1;
+        }
       bitoff -= BITSET_WORD_BITS;
       bitcnt = BITSET_WORD_BITS - 1;
     }
@@ -200,7 +200,7 @@ abitset_list_reverse (bitset src, bitset_bindex *list,
  found and with *NEXT indicating where search stopped.  */
 static bitset_bindex
 abitset_list (bitset src, bitset_bindex *list,
-             bitset_bindex num, bitset_bindex *next)
+              bitset_bindex num, bitset_bindex *next)
 {
   bitset_bindex bitno;
   bitset_bindex count;
@@ -217,80 +217,80 @@ abitset_list (bitset src, bitset_bindex *list,
     {
       /* Many bitsets are zero, so make this common case fast.  */
       for (windex = 0; windex < size && !srcp[windex]; windex++)
-       continue;
+        continue;
       if (windex >= size)
-       return 0;
+        return 0;
 
       /* If num is 1, we could speed things up with a binary search
-        of the current word.  */
+         of the current word.  */
 
       bitoff = windex * BITSET_WORD_BITS;
     }
   else
     {
-      if (bitno >= ABITSET_N_BITS (src))
-       return 0;
+      if (bitno >= BITSET_SIZE_ (src))
+        return 0;
 
       windex = bitno / BITSET_WORD_BITS;
       bitno = bitno % BITSET_WORD_BITS;
 
       if (bitno)
-       {
-         /* Handle the case where we start within a word.
-            Most often, this is executed with large bitsets
-            with many set bits where we filled the array
-            on the previous call to this function.  */
-
-         bitoff = windex * BITSET_WORD_BITS;
-         word = srcp[windex] >> bitno;
-         for (bitno = bitoff + bitno; word; bitno++)
-           {
-             if (word & 1)
-               {
-                 list[count++] = bitno;
-                 if (count >= num)
-                   {
-                     *next = bitno + 1;
-                     return count;
-                   }
-               }
-             word >>= 1;
-           }
-         windex++;
-       }
+        {
+          /* Handle the case where we start within a word.
+             Most often, this is executed with large bitsets
+             with many set bits where we filled the array
+             on the previous call to this function.  */
+
+          bitoff = windex * BITSET_WORD_BITS;
+          word = srcp[windex] >> bitno;
+          for (bitno = bitoff + bitno; word; bitno++)
+            {
+              if (word & 1)
+                {
+                  list[count++] = bitno;
+                  if (count >= num)
+                    {
+                      *next = bitno + 1;
+                      return count;
+                    }
+                }
+              word >>= 1;
+            }
+          windex++;
+        }
       bitoff = windex * BITSET_WORD_BITS;
     }
 
   for (; windex < size; windex++, bitoff += BITSET_WORD_BITS)
     {
       if (!(word = srcp[windex]))
-       continue;
+        continue;
 
       if ((count + BITSET_WORD_BITS) < num)
-       {
-         for (bitno = bitoff; word; bitno++)
-           {
-             if (word & 1)
-               list[count++] = bitno;
-             word >>= 1;
-           }
-       }
+        {
+          for (bitno = bitoff; word; bitno++)
+            {
+              if (word & 1)
+                list[count++] = bitno;
+              word >>= 1;
+            }
+        }
       else
-       {
-         for (bitno = bitoff; word; bitno++)
-           {
-             if (word & 1)
-               {
-                 list[count++] = bitno;
-                 if (count >= num)
-                   {
-                     *next = bitno + 1;
-                     return count;
-                   }
-               }
-             word >>= 1;
-           }
-       }
+        {
+          for (bitno = bitoff; word; bitno++)
+            {
+              if (word & 1)
+                {
+                  list[count++] = bitno;
+                  if (count >= num)
+                    {
+                      *next = bitno + 1;
+                      return count;
+                    }
+                }
+              word >>= 1;
+            }
+        }
     }
 
   *next = bitoff;
@@ -304,7 +304,7 @@ abitset_unused_clear (bitset dst)
 {
   unsigned int last_bit;
 
-  last_bit = ABITSET_N_BITS (dst) % BITSET_WORD_BITS;
+  last_bit = BITSET_SIZE_ (dst) % BITSET_WORD_BITS;
   if (last_bit)
     ABITSET_WORDS (dst)[dst->b.csize - 1] &=
       ((bitset_word) 1 << last_bit) - 1;
@@ -336,7 +336,7 @@ abitset_zero (bitset dst)
 }
 
 
-static int
+static bool
 abitset_empty_p (bitset dst)
 {
   bitset_windex i;
@@ -344,9 +344,9 @@ abitset_empty_p (bitset dst)
 
   for (i = 0; i < dst->b.csize; i++)
     if (dstp[i])
-      return 0;
+      return false;
 
-  return 1;
+  return true;
 }
 
 
@@ -377,7 +377,7 @@ abitset_not (bitset dst, bitset src)
 }
 
 
-static int
+static bool
 abitset_equal_p (bitset dst, bitset src)
 {
   bitset_windex i;
@@ -387,12 +387,12 @@ abitset_equal_p (bitset dst, bitset src)
 
   for (i = 0; i < size; i++)
       if (*srcp++ != *dstp++)
-         return 0;
-  return 1;
+          return false;
+  return true;
 }
 
 
-static int
+static bool
 abitset_subset_p (bitset dst, bitset src)
 {
   bitset_windex i;
@@ -402,12 +402,12 @@ abitset_subset_p (bitset dst, bitset src)
 
   for (i = 0; i < size; i++, dstp++, srcp++)
       if (*dstp != (*srcp | *dstp))
-         return 0;
-  return 1;
+          return false;
+  return true;
 }
 
 
-static int
+static bool
 abitset_disjoint_p (bitset dst, bitset src)
 {
   bitset_windex i;
@@ -417,9 +417,9 @@ abitset_disjoint_p (bitset dst, bitset src)
 
   for (i = 0; i < size; i++)
       if (*srcp++ & *dstp++)
-         return 0;
+          return false;
 
-  return 1;
+  return true;
 }
 
 
@@ -437,11 +437,11 @@ abitset_and (bitset dst, bitset src1, bitset src2)
 }
 
 
-static int
+static bool
 abitset_and_cmp (bitset dst, bitset src1, bitset src2)
 {
   bitset_windex i;
-  int changed = 0;
+  bool changed = false;
   bitset_word *src1p = ABITSET_WORDS (src1);
   bitset_word *src2p = ABITSET_WORDS (src2);
   bitset_word *dstp = ABITSET_WORDS (dst);
@@ -452,10 +452,10 @@ abitset_and_cmp (bitset dst, bitset src1, bitset src2)
       bitset_word tmp = *src1p++ & *src2p++;
 
       if (*dstp != tmp)
-       {
-         changed = 1;
-         *dstp = tmp;
-       }
+        {
+          changed = true;
+          *dstp = tmp;
+        }
     }
   return changed;
 }
@@ -475,11 +475,11 @@ abitset_andn (bitset dst, bitset src1, bitset src2)
 }
 
 
-static int
+static bool
 abitset_andn_cmp (bitset dst, bitset src1, bitset src2)
 {
   bitset_windex i;
-  int changed = 0;
+  bool changed = false;
   bitset_word *src1p = ABITSET_WORDS (src1);
   bitset_word *src2p = ABITSET_WORDS (src2);
   bitset_word *dstp = ABITSET_WORDS (dst);
@@ -490,10 +490,10 @@ abitset_andn_cmp (bitset dst, bitset src1, bitset src2)
       bitset_word tmp = *src1p++ & ~(*src2p++);
 
       if (*dstp != tmp)
-       {
-         changed = 1;
-         *dstp = tmp;
-       }
+        {
+          changed = true;
+          *dstp = tmp;
+        }
     }
   return changed;
 }
@@ -513,11 +513,11 @@ abitset_or (bitset dst, bitset src1, bitset src2)
 }
 
 
-static int
+static bool
 abitset_or_cmp (bitset dst, bitset src1, bitset src2)
 {
   bitset_windex i;
-  int changed = 0;
+  bool changed = false;
   bitset_word *src1p = ABITSET_WORDS (src1);
   bitset_word *src2p = ABITSET_WORDS (src2);
   bitset_word *dstp = ABITSET_WORDS (dst);
@@ -528,10 +528,10 @@ abitset_or_cmp (bitset dst, bitset src1, bitset src2)
       bitset_word tmp = *src1p++ | *src2p++;
 
       if (*dstp != tmp)
-       {
-         changed = 1;
-         *dstp = tmp;
-       }
+        {
+          changed = true;
+          *dstp = tmp;
+        }
     }
   return changed;
 }
@@ -551,11 +551,11 @@ abitset_xor (bitset dst, bitset src1, bitset src2)
 }
 
 
-static int
+static bool
 abitset_xor_cmp (bitset dst, bitset src1, bitset src2)
 {
   bitset_windex i;
-  int changed = 0;
+  bool changed = false;
   bitset_word *src1p = ABITSET_WORDS (src1);
   bitset_word *src2p = ABITSET_WORDS (src2);
   bitset_word *dstp = ABITSET_WORDS (dst);
@@ -566,10 +566,10 @@ abitset_xor_cmp (bitset dst, bitset src1, bitset src2)
       bitset_word tmp = *src1p++ ^ *src2p++;
 
       if (*dstp != tmp)
-       {
-         changed = 1;
-         *dstp = tmp;
-       }
+        {
+          changed = true;
+          *dstp = tmp;
+        }
     }
   return changed;
 }
@@ -590,11 +590,11 @@ abitset_and_or (bitset dst, bitset src1, bitset src2, bitset src3)
 }
 
 
-static int
+static bool
 abitset_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
 {
   bitset_windex i;
-  int changed = 0;
+  bool changed = false;
   bitset_word *src1p = ABITSET_WORDS (src1);
   bitset_word *src2p = ABITSET_WORDS (src2);
   bitset_word *src3p = ABITSET_WORDS (src3);
@@ -606,10 +606,10 @@ abitset_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
       bitset_word tmp = (*src1p++ & *src2p++) | *src3p++;
 
       if (*dstp != tmp)
-       {
-         changed = 1;
-         *dstp = tmp;
-       }
+        {
+          changed = true;
+          *dstp = tmp;
+        }
     }
   return changed;
 }
@@ -630,11 +630,11 @@ abitset_andn_or (bitset dst, bitset src1, bitset src2, bitset src3)
 }
 
 
-static int
+static bool
 abitset_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
 {
   bitset_windex i;
-  int changed = 0;
+  bool changed = false;
   bitset_word *src1p = ABITSET_WORDS (src1);
   bitset_word *src2p = ABITSET_WORDS (src2);
   bitset_word *src3p = ABITSET_WORDS (src3);
@@ -646,10 +646,10 @@ abitset_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
       bitset_word tmp = (*src1p++ & ~(*src2p++)) | *src3p++;
 
       if (*dstp != tmp)
-       {
-         changed = 1;
-         *dstp = tmp;
-       }
+        {
+          changed = true;
+          *dstp = tmp;
+        }
     }
   return changed;
 }
@@ -670,11 +670,11 @@ abitset_or_and (bitset dst, bitset src1, bitset src2, bitset src3)
 }
 
 
-static int
+static bool
 abitset_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
 {
   bitset_windex i;
-  int changed = 0;
+  bool changed = false;
   bitset_word *src1p = ABITSET_WORDS (src1);
   bitset_word *src2p = ABITSET_WORDS (src2);
   bitset_word *src3p = ABITSET_WORDS (src3);
@@ -686,10 +686,10 @@ abitset_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3)
       bitset_word tmp = (*src1p++ | *src2p++) & *src3p++;
 
       if (*dstp != tmp)
-       {
-         changed = 1;
-         *dstp = tmp;
-       }
+        {
+          changed = true;
+          *dstp = tmp;
+        }
     }
   return changed;
 }
@@ -711,7 +711,8 @@ struct bitset_vtable abitset_small_vtable = {
   abitset_reset,
   bitset_toggle_,
   abitset_test,
-  abitset_size,
+  abitset_resize,
+  bitset_size_,
   bitset_count_,
   abitset_empty_p,
   abitset_ones,
@@ -748,7 +749,8 @@ struct bitset_vtable abitset_vtable = {
   abitset_reset,
   bitset_toggle_,
   abitset_test,
-  abitset_size,
+  abitset_resize,
+  bitset_size_,
   bitset_count_,
   abitset_empty_p,
   abitset_ones,
@@ -809,7 +811,7 @@ abitset_init (bitset bset, bitset_bindex n_bits)
   bitset_windex size;
 
   size = ABITSET_N_WORDS (n_bits);
-  ABITSET_N_BITS (bset) = n_bits;
+  BITSET_NBITS_ (bset) = n_bits;
 
   /* Use optimized routines if bitset fits within a single word.
      There is probably little merit if using caching since