X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/d08290769c798befc27e9f8bbc3f1a3da12d1f08..867a3e0085abd0281d41a7a1a56dea143dadf4eb:/lib/bitset.c diff --git a/lib/bitset.c b/lib/bitset.c index a500d471..0cc3ee53 100644 --- a/lib/bitset.c +++ b/lib/bitset.c @@ -1,5 +1,5 @@ /* General bitsets. - Copyright (C) 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004, 2005 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 @@ -14,17 +14,19 @@ 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include +#include #include "bitset.h" #include "abitset.h" #include "lbitset.h" #include "ebitset.h" +#include "vbitset.h" #include "bitset_stats.h" #include "obstack.h" @@ -55,6 +57,10 @@ bitset_bytes (enum bitset_type type, bitset_bindex n_bits) bytes = ebitset_bytes (n_bits); break; + case BITSET_VARRAY: + bytes = vbitset_bytes (n_bits); + break; + default: abort (); } @@ -81,6 +87,9 @@ bitset_init (bitset bset, bitset_bindex n_bits, enum bitset_type type) case BITSET_TABLE: return ebitset_init (bset, n_bits); + case BITSET_VARRAY: + return vbitset_init (bset, n_bits); + default: abort (); } @@ -93,27 +102,30 @@ bitset_init (bitset bset, bitset_bindex n_bits, enum bitset_type type) enum bitset_type bitset_type_choose (bitset_bindex n_bits ATTRIBUTE_UNUSED, unsigned int attr) { - enum bitset_type type; - /* Check attributes. */ if (attr & BITSET_FIXED && attr & BITSET_VARIABLE) abort (); if (attr & BITSET_SPARSE && attr & BITSET_DENSE) abort (); - /* Choose the type of bitset. Note that sometimes we will be asked + /* Choose the type of bitset. Note that sometimes we will be asked for a zero length fixed size bitset. */ - type = BITSET_ARRAY; - /* Currently, the simple bitsets do not support a variable size. */ - if (attr & BITSET_VARIABLE || attr & BITSET_SPARSE) - { - type = BITSET_LIST; - if (attr & BITSET_DENSE || attr & BITSET_GREEDY) - type = BITSET_TABLE; - } - return type; + /* If no attributes selected, choose a good compromise. */ + if (!attr) + return BITSET_VARRAY; + + if (attr & BITSET_SPARSE) + return BITSET_LIST; + + if (attr & BITSET_FIXED) + return BITSET_ARRAY; + + if (attr & BITSET_GREEDY) + return BITSET_TABLE; + + return BITSET_VARRAY; } @@ -223,6 +235,14 @@ bitset_next (bitset src, bitset_bindex bitno) } +/* Return true if both bitsets are of the same type and size. */ +extern bool +bitset_compatible_p (bitset bset1, bitset bset2) +{ + return BITSET_COMPATIBLE_ (bset1, bset2); +} + + /* Find previous bit set in SRC starting from and including BITNO. Return BITSET_BINDEX_MAX if SRC empty. */ bitset_bindex @@ -276,7 +296,7 @@ bitset_print (FILE *file, bitset bset, bool verbose) if (verbose) fprintf (file, "n_bits = %lu, set = {", - (unsigned long) bitset_size (bset)); + (unsigned long int) bitset_size (bset)); pos = 30; BITSET_FOR_EACH (iter, bset, i, 0) @@ -287,7 +307,7 @@ bitset_print (FILE *file, bitset bset, bool verbose) pos = 0; } - fprintf (file, "%d ", i); + fprintf (file, "%lu ", (unsigned long int) i); pos += 1 + (i >= 10) + (i >= 100); }; @@ -304,7 +324,6 @@ bitset_dump (FILE *file, bitset bset) } - /* Release memory associated with bitsets. */ void bitset_release_memory (void) @@ -314,7 +333,6 @@ bitset_release_memory (void) } - /* Toggle bit BITNO in bitset BSET and the new value of the bit. */ bool bitset_toggle_ (bitset bset, bitset_bindex bitno) @@ -334,6 +352,14 @@ bitset_toggle_ (bitset bset, bitset_bindex bitno) } +/* Return number of bits in bitset SRC. */ +bitset_bindex +bitset_size_ (bitset src) +{ + return BITSET_NBITS_ (src); +} + + /* Return number of bits set in bitset SRC. */ bitset_bindex bitset_count_ (bitset src)