1 /* Functions to support expandable bitsets. 
   2    Copyright (C) 2002 Free Software Foundation, Inc. 
   3    Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). 
   5    This program is free software; you can redistribute it and/or modify 
   6    it under the terms of the GNU General Public License as published by 
   7    the Free Software Foundation; either version 2 of the License, or 
   8    (at your option) any later version. 
  10    This program is distributed in the hope that it will be useful, 
  11    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  13    GNU General Public License for more details. 
  15    You should have received a copy of the GNU General Public License 
  16    along with this program; if not, write to the Free Software 
  17    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
  28 /* This file implements expandable bitsets.  These bitsets can be of 
  29    arbitrary length and are more efficient than arrays of bits for 
  32    Empty elements are represented by a NULL pointer in the table of 
  33    element pointers.  An alternative is to point to a special zero 
  34    element.  Similarly, we could represent an all 1's element with 
  35    another special ones element pointer. 
  37    Bitsets are commonly empty so we need to ensure that this special 
  38    case is fast.  A zero bitset is indicated when cdata is 0.  This is 
  39    conservative since cdata may be non zero and the bitset may still 
  42    The bitset cache can be disabled either by setting cindex to 
  43    BITSET_WINDEX_MAX or by setting csize to 0.  Here 
  44    we use the former approach since cindex needs to be updated whenever 
  49 /* Number of words to use for each element.  */ 
  50 #define EBITSET_ELT_WORDS 2 
  52 /* Number of bits stored in each element.  */ 
  53 #define EBITSET_ELT_BITS \ 
  54   ((unsigned) (EBITSET_ELT_WORDS * BITSET_WORD_BITS)) 
  56 /* Ebitset element.  We use an array of bits.  */ 
  57 typedef struct ebitset_elt_struct
 
  61     bitset_word words
[EBITSET_ELT_WORDS
];       /* Bits that are set.  */ 
  62     struct ebitset_elt_struct 
*next
; 
  69 typedef ebitset_elt 
*ebitset_elts
; 
  72 /* Number of elements to initially allocate.  */ 
  74 #ifndef EBITSET_INITIAL_SIZE 
  75 #define EBITSET_INITIAL_SIZE 2 
  78 /* Minimum number of elements to grow table.  */ 
  80 #ifndef EBITSET_GROW_SIZE 
  81 #define EBITSET_GROW_SIZE 4 
  84 enum ebitset_find_mode
 
  85   { EBITSET_FIND
, EBITSET_CREATE
, EBITSET_SUBST 
}; 
  87 static ebitset_elt ebitset_zero_elts
[1]; /* Elements of all zero bits.  */ 
  89 /* Obstack to allocate bitset elements from.  */ 
  90 static struct obstack ebitset_obstack
; 
  91 static int ebitset_obstack_init 
= 0; 
  92 static ebitset_elt 
*ebitset_free_list
;  /* Free list of bitset elements.  */ 
  94 #define EBITSET_ELTS(BSET) ((BSET)->e.elts) 
  95 #define EBITSET_SIZE(BSET) ((BSET)->e.size) 
  97 #define EBITSET_NEXT(ELT) ((ELT)->u.next) 
  98 #define EBITSET_WORDS(ELT) ((ELT)->u.words) 
 100 /* Disable bitset cache and mark BSET as being zero.  */ 
 101 #define EBITSET_ZERO_SET(BSET) ((BSET)->b.cindex = BITSET_WINDEX_MAX, \ 
 104 #define EBITSET_CACHE_DISABLE(BSET)  ((BSET)->b.cindex = BITSET_WINDEX_MAX) 
 106 /* Disable bitset cache and mark BSET as being possibly non-zero.  */ 
 107 #define EBITSET_NONZERO_SET(BSET) \ 
 108  (EBITSET_CACHE_DISABLE (BSET), (BSET)->b.cdata = (bitset_word *)~0) 
 110 /* A conservative estimate of whether the bitset is zero. 
 111    This is non-zero only if we know for sure that the bitset is zero.  */ 
 112 #define EBITSET_ZERO_P(BSET) ((BSET)->b.cdata == 0) 
 114 /* Enable cache to point to element with table index EINDEX. 
 115    The element must exist.  */ 
 116 #define EBITSET_CACHE_SET(BSET, EINDEX) \ 
 117  ((BSET)->b.cindex = (EINDEX) * EBITSET_ELT_WORDS, \ 
 118   (BSET)->b.cdata = EBITSET_WORDS (EBITSET_ELTS (BSET) [EINDEX])) 
 121 /* Grow the expandable table for BSET by SIZE elements.  */ 
 123 ebitset_elts_grow (bitset bset
, bitset_windex size
) 
 125   bitset_windex oldsize
; 
 126   bitset_windex newsize
; 
 128   oldsize 
= EBITSET_SIZE (bset
); 
 129   newsize 
= oldsize 
+ size
; 
 131   if (BITSET_SIZE_MAX 
/ sizeof (ebitset_elt 
*) < newsize
) 
 134   EBITSET_ELTS (bset
) = xrealloc (EBITSET_ELTS (bset
), 
 135                                   newsize 
* sizeof (ebitset_elt 
*)); 
 136   EBITSET_SIZE (bset
) = newsize
; 
 138   memset (EBITSET_ELTS (bset
) + oldsize
, 0, size 
* sizeof (ebitset_elt 
*)); 
 142 /* Allocate a ebitset element.  The bits are not cleared.  */ 
 143 static inline ebitset_elt 
* 
 144 ebitset_elt_alloc (void) 
 148   if (ebitset_free_list 
!= 0) 
 150       elt 
= ebitset_free_list
; 
 151       ebitset_free_list 
= EBITSET_NEXT (elt
); 
 155       if (!ebitset_obstack_init
) 
 157           ebitset_obstack_init 
= 1; 
 159           /* Let particular systems override the size of a chunk.  */ 
 161 #ifndef OBSTACK_CHUNK_SIZE 
 162 #define OBSTACK_CHUNK_SIZE 0 
 165           /* Let them override the alloc and free routines too.  */ 
 167 #ifndef OBSTACK_CHUNK_ALLOC 
 168 #define OBSTACK_CHUNK_ALLOC xmalloc 
 171 #ifndef OBSTACK_CHUNK_FREE 
 172 #define OBSTACK_CHUNK_FREE free 
 175 #if !defined(__GNUC__) || (__GNUC__ < 2) 
 176 #define __alignof__(type) 0 
 179           obstack_specify_allocation (&ebitset_obstack
, OBSTACK_CHUNK_SIZE
, 
 180                                       __alignof__ (ebitset_elt
), 
 181                                       (void *(*)PARAMS ((long))) 
 183                                       (void (*)PARAMS ((void *))) 
 187       /* Perhaps we should add a number of new elements to the free 
 189       elt 
= (ebitset_elt 
*) obstack_alloc (&ebitset_obstack
, 
 190                                            sizeof (ebitset_elt
)); 
 197 /* Allocate a ebitset element.  The bits are cleared.  */ 
 198 static inline ebitset_elt 
* 
 199 ebitset_elt_calloc (void) 
 203   elt 
= ebitset_elt_alloc (); 
 204   memset (EBITSET_WORDS (elt
), 0, sizeof (EBITSET_WORDS (elt
))); 
 210 ebitset_elt_free (ebitset_elt 
*elt
) 
 212   EBITSET_NEXT (elt
) = ebitset_free_list
; 
 213   ebitset_free_list 
= elt
; 
 217 /* Remove element with index EINDEX from bitset BSET.  */ 
 219 ebitset_elt_remove (bitset bset
, bitset_windex eindex
) 
 224   elts 
= EBITSET_ELTS (bset
); 
 229   ebitset_elt_free (elt
); 
 233 /* Add ELT into elts at index EINDEX of bitset BSET.  */ 
 235 ebitset_elt_add (bitset bset
, ebitset_elt 
*elt
, bitset_windex eindex
) 
 239   elts 
= EBITSET_ELTS (bset
); 
 240   /* Assume that the elts entry not allocated.  */ 
 245 /* Return nonzero if all bits in an element are zero.  */ 
 247 ebitset_elt_zero_p (ebitset_elt 
*elt
) 
 251   for (i 
= 0; i 
< EBITSET_ELT_WORDS
; i
++) 
 252     if (EBITSET_WORDS (elt
)[i
]) 
 260 ebitset_elt_find (bitset bset
, bitset_windex windex
, 
 261                   enum ebitset_find_mode mode
) 
 265   bitset_windex eindex
; 
 268   eindex 
= windex 
/ EBITSET_ELT_WORDS
; 
 270   elts 
= EBITSET_ELTS (bset
); 
 271   size 
= EBITSET_SIZE (bset
); 
 275       if ((elt 
= elts
[eindex
])) 
 277           if (EBITSET_WORDS (elt
) == bset
->b
.cdata
) 
 280           EBITSET_CACHE_SET (bset
, eindex
); 
 285   /* The element could not be found.  */ 
 297           extra 
= eindex 
- size 
+ 1; 
 299           /* We need to expand the table by EXTRA elements.  It may be 
 300              better with large bitsets to grow the number of 
 301              elements by some fraction of the current size otherwise 
 302              we can spend a lot of time slowly increasing the size of the 
 304           if (extra 
< EBITSET_GROW_SIZE
) 
 305             extra 
= EBITSET_GROW_SIZE
; 
 307           ebitset_elts_grow (bset
, extra
); 
 310       /* Create a new element.  */ 
 311       elt 
= ebitset_elt_calloc (); 
 312       ebitset_elt_add (bset
, elt
, eindex
); 
 313       EBITSET_CACHE_SET (bset
, eindex
); 
 317       return &ebitset_zero_elts
[0]; 
 325 static inline ebitset_elt 
* 
 326 ebitset_elt_last (bitset bset
) 
 330   elts 
= EBITSET_ELTS (bset
); 
 332   /* Assume that have at least one element in elts.  */ 
 333   return elts
[EBITSET_SIZE (bset
) - 1]; 
 337 /* Weed out the zero elements from the elts.  */ 
 338 static inline bitset_windex
 
 339 ebitset_weed (bitset bset
) 
 345   if (EBITSET_ZERO_P (bset
)) 
 348   elts 
= EBITSET_ELTS (bset
); 
 350   for (j 
= 0; j 
< EBITSET_SIZE (bset
); j
++) 
 352       ebitset_elt 
*elt 
= elts
[j
]; 
 356           if (elt 
&& ebitset_elt_zero_p (elt
)) 
 358               ebitset_elt_remove (bset
, j
); 
 369       /* All the bits are zero.  We could shrink the elts. 
 370          For now just mark BSET as known to be zero.  */ 
 371       EBITSET_ZERO_SET (bset
); 
 374     EBITSET_NONZERO_SET (bset
); 
 380 /* Set all bits in the bitset to zero.  */ 
 382 ebitset_zero (bitset bset
) 
 387   if (EBITSET_ZERO_P (bset
)) 
 390   elts 
= EBITSET_ELTS (bset
); 
 391   for (j 
= 0; j 
< EBITSET_SIZE (bset
); j
++) 
 393       ebitset_elt 
*elt 
= elts
[j
]; 
 396         ebitset_elt_remove (bset
, j
); 
 399   /* All the bits are zero.  We could shrink the elts. 
 400      For now just mark BSET as known to be zero.  */ 
 401   EBITSET_ZERO_SET (bset
); 
 406 ebitset_equal_p (bitset dst
, bitset src
) 
 418   if (EBITSET_SIZE (src
) != EBITSET_SIZE (dst
)) 
 421   selts 
= EBITSET_ELTS (src
); 
 422   delts 
= EBITSET_ELTS (dst
); 
 424   for (j 
= 0; j 
< EBITSET_SIZE (src
); j
++) 
 427       ebitset_elt 
*selt 
= selts
[j
]; 
 428       ebitset_elt 
*delt 
= delts
[j
]; 
 432       if ((selt 
&& !delt
) || (!selt 
&& delt
)) 
 435       for (i 
= 0; i 
< EBITSET_ELT_WORDS
; i
++) 
 436         if (EBITSET_WORDS (selt
)[i
] != EBITSET_WORDS (delt
)[i
]) 
 443 /* Copy bits from bitset SRC to bitset DST.  */ 
 445 ebitset_copy_ (bitset dst
, bitset src
) 
 456   if (EBITSET_SIZE (dst
) < EBITSET_SIZE (src
)) 
 457     ebitset_elts_grow (dst
, EBITSET_SIZE (src
) - EBITSET_SIZE (dst
)); 
 459   selts 
= EBITSET_ELTS (src
); 
 460   delts 
= EBITSET_ELTS (dst
); 
 461   for (j 
= 0; j 
< EBITSET_SIZE (src
); j
++) 
 463       ebitset_elt 
*selt 
= selts
[j
]; 
 469           tmp 
= ebitset_elt_alloc (); 
 471           memcpy (EBITSET_WORDS (tmp
), EBITSET_WORDS (selt
), 
 472                   sizeof (EBITSET_WORDS (selt
))); 
 475   EBITSET_NONZERO_SET (dst
); 
 479 /* Copy bits from bitset SRC to bitset DST.  Return non-zero if 
 480    bitsets different.  */ 
 482 ebitset_copy_cmp (bitset dst
, bitset src
) 
 487   if (EBITSET_ZERO_P (dst
)) 
 489       ebitset_copy_ (dst
, src
); 
 490       return !EBITSET_ZERO_P (src
); 
 493   if (ebitset_equal_p (dst
, src
)) 
 496   ebitset_copy_ (dst
, src
); 
 501 /* Return size in bits of bitset SRC.  */ 
 503 ebitset_size (bitset src
) 
 505   /* Return current size of bitset in bits.  */ 
 506   return EBITSET_SIZE (src
) * EBITSET_ELT_BITS
; 
 510 /* Set bit BITNO in bitset DST.  */ 
 512 ebitset_set (bitset dst
, bitset_bindex bitno
) 
 514   bitset_windex windex 
= bitno 
/ BITSET_WORD_BITS
; 
 516   ebitset_elt_find (dst
, windex
, EBITSET_CREATE
); 
 518   dst
->b
.cdata
[windex 
- dst
->b
.cindex
] |= 
 519     (bitset_word
) 1 << (bitno 
% BITSET_WORD_BITS
); 
 523 /* Reset bit BITNO in bitset DST.  */ 
 525 ebitset_reset (bitset dst
, bitset_bindex bitno
) 
 527   bitset_windex windex 
= bitno 
/ BITSET_WORD_BITS
; 
 529   if (!ebitset_elt_find (dst
, windex
, EBITSET_FIND
)) 
 532   dst
->b
.cdata
[windex 
- dst
->b
.cindex
] &= 
 533     ~((bitset_word
) 1 << (bitno 
% BITSET_WORD_BITS
)); 
 535   /* If all the data is zero, perhaps we should remove it now... 
 536      However, there is a good chance that the element will be needed 
 541 /* Test bit BITNO in bitset SRC.  */ 
 543 ebitset_test (bitset src
, bitset_bindex bitno
) 
 545   bitset_windex windex 
= bitno 
/ BITSET_WORD_BITS
; 
 547   if (!ebitset_elt_find (src
, windex
, EBITSET_FIND
)) 
 551           cdata
[windex 
- src
->b
.cindex
] >> (bitno 
% BITSET_WORD_BITS
)) & 1; 
 556 ebitset_free (bitset bset
) 
 559   free (EBITSET_ELTS (bset
)); 
 563 /* Find list of up to NUM bits set in BSET starting from and including 
 564  *NEXT and store in array LIST.  Return with actual number of bits 
 565  found and with *NEXT indicating where search stopped.  */ 
 567 ebitset_list_reverse (bitset bset
, bitset_bindex 
*list
, 
 568                       bitset_bindex num
, bitset_bindex 
*next
) 
 570   bitset_bindex n_bits
; 
 572   bitset_bindex rbitno
; 
 574   bitset_bindex boffset
; 
 575   bitset_windex windex
; 
 576   bitset_windex eindex
; 
 577   bitset_windex woffset
; 
 582   if (EBITSET_ZERO_P (bset
)) 
 585   size 
= EBITSET_SIZE (bset
); 
 586   n_bits 
= size 
* EBITSET_ELT_BITS
; 
 589   if (rbitno 
>= n_bits
) 
 592   elts 
= EBITSET_ELTS (bset
); 
 594   bitno 
= n_bits 
- (rbitno 
+ 1); 
 596   windex 
= bitno 
/ BITSET_WORD_BITS
; 
 597   eindex 
= bitno 
/ EBITSET_ELT_BITS
; 
 598   woffset 
= windex 
- eindex 
* EBITSET_ELT_WORDS
; 
 600   /* If num is 1, we could speed things up with a binary search 
 601      of the word of interest.  */ 
 604   bcount 
= bitno 
% BITSET_WORD_BITS
; 
 605   boffset 
= windex 
* BITSET_WORD_BITS
; 
 615           srcp 
= EBITSET_WORDS (elt
); 
 621               word 
= srcp
[woffset
] << (BITSET_WORD_BITS 
- 1 - bcount
); 
 623               for (; word
; bcount
--) 
 625                   if (word 
& BITSET_MSB
) 
 627                       list
[count
++] = boffset 
+ bcount
; 
 630                           *next 
= n_bits 
- (boffset 
+ bcount
); 
 636               boffset 
-= BITSET_WORD_BITS
; 
 637               bcount 
= BITSET_WORD_BITS 
- 1; 
 642       woffset 
= EBITSET_ELT_WORDS 
- 1; 
 643       boffset 
= eindex 
* EBITSET_ELT_BITS 
- BITSET_WORD_BITS
; 
 647   *next 
= n_bits 
- (boffset 
+ 1); 
 652 /* Find list of up to NUM bits set in BSET starting from and including 
 653  *NEXT and store in array LIST.  Return with actual number of bits 
 654  found and with *NEXT indicating where search stopped.  */ 
 656 ebitset_list (bitset bset
, bitset_bindex 
*list
, 
 657               bitset_bindex num
, bitset_bindex 
*next
) 
 660   bitset_windex windex
; 
 661   bitset_windex eindex
; 
 668   if (EBITSET_ZERO_P (bset
)) 
 674   elts 
= EBITSET_ELTS (bset
); 
 675   size 
= EBITSET_SIZE (bset
); 
 676   eindex 
= bitno 
/ EBITSET_ELT_BITS
; 
 678   if (bitno 
% EBITSET_ELT_BITS
) 
 680       /* We need to start within an element.  This is not very common.  */ 
 685           bitset_windex woffset
; 
 686           bitset_word 
*srcp 
= EBITSET_WORDS (elt
); 
 688           windex 
= bitno 
/ BITSET_WORD_BITS
; 
 689           woffset 
= eindex 
* EBITSET_ELT_WORDS
; 
 691           for (; (windex 
- woffset
) < EBITSET_ELT_WORDS
; windex
++) 
 693               word 
= srcp
[windex 
- woffset
] >> (bitno 
% BITSET_WORD_BITS
); 
 695               for (; word
; bitno
++) 
 699                       list
[count
++] = bitno
; 
 708               bitno 
= (windex 
+ 1) * BITSET_WORD_BITS
; 
 712       /* Skip to next element.  */ 
 716   /* If num is 1, we could speed things up with a binary search 
 717      of the word of interest.  */ 
 719   for (; eindex 
< size
; eindex
++) 
 728       srcp 
= EBITSET_WORDS (elt
); 
 729       windex 
= eindex 
* EBITSET_ELT_WORDS
; 
 731       if ((count 
+ EBITSET_ELT_BITS
) < num
) 
 733           /* The coast is clear, plant boot!  */ 
 735           for (i 
= 0; i 
< EBITSET_ELT_WORDS
; i
++, windex
++) 
 737               bitno 
= windex 
* BITSET_WORD_BITS
; 
 742                   if (!(word 
& 0xffff)) 
 752                   for (; word
; bitno
++) 
 755                         list
[count
++] = bitno
; 
 763           /* Tread more carefully since we need to check 
 764              if array overflows.  */ 
 766           for (i 
= 0; i 
< EBITSET_ELT_WORDS
; i
++, windex
++) 
 768               bitno 
= windex 
* BITSET_WORD_BITS
; 
 770               for (word 
= srcp
[i
]; word
; bitno
++) 
 774                       list
[count
++] = bitno
; 
 793 ebitset_ones (bitset dst
) 
 799   for (j 
= 0; j 
< EBITSET_SIZE (dst
); j
++) 
 801       /* Create new elements if they cannot be found.  Perhaps 
 802          we should just add pointers to a ones element.  */ 
 804         ebitset_elt_find (dst
, j 
* EBITSET_ELT_WORDS
, EBITSET_CREATE
); 
 805       memset (EBITSET_WORDS (elt
), -1, sizeof (EBITSET_WORDS (elt
))); 
 807   EBITSET_NONZERO_SET (dst
); 
 812 ebitset_empty_p (bitset dst
) 
 814   return !ebitset_weed (dst
); 
 819 ebitset_not (bitset dst
, bitset src
) 
 826   for (j 
= 0; j 
< EBITSET_SIZE (src
); j
++) 
 828       /* Create new elements for dst if they cannot be found 
 829              or substitute zero elements if src elements not found.  */ 
 831         ebitset_elt_find (dst
, j 
* EBITSET_ELT_WORDS
, EBITSET_SUBST
); 
 833         ebitset_elt_find (dst
, j 
* EBITSET_ELT_WORDS
, EBITSET_CREATE
); 
 835       for (i 
= 0; i 
< EBITSET_ELT_WORDS
; i
++) 
 836         EBITSET_WORDS (delt
)[i
] = ~EBITSET_WORDS (selt
)[i
]; 
 838   EBITSET_NONZERO_SET (dst
); 
 842 /* Return 1 if DST == DST | SRC.  */ 
 844 ebitset_subset_p (bitset dst
, bitset src
) 
 852   selts 
= EBITSET_ELTS (src
); 
 853   delts 
= EBITSET_ELTS (dst
); 
 855   ssize 
= EBITSET_SIZE (src
); 
 856   dsize 
= EBITSET_SIZE (dst
); 
 858   for (j 
= 0; j 
< ssize
; j
++) 
 864       selt 
= j 
< ssize 
? selts
[j
] : 0; 
 865       delt 
= j 
< dsize 
? delts
[j
] : 0; 
 871         selt 
= &ebitset_zero_elts
[0]; 
 873         delt 
= &ebitset_zero_elts
[0]; 
 875       for (i 
= 0; i 
< EBITSET_ELT_WORDS
; i
++) 
 876         if (EBITSET_WORDS (delt
)[i
] 
 877             != (EBITSET_WORDS (selt
)[i
] | EBITSET_WORDS (delt
)[i
])) 
 884 /* Return 1 if DST & SRC == 0.  */ 
 886 ebitset_disjoint_p (bitset dst
, bitset src
) 
 894   selts 
= EBITSET_ELTS (src
); 
 895   delts 
= EBITSET_ELTS (dst
); 
 897   ssize 
= EBITSET_SIZE (src
); 
 898   dsize 
= EBITSET_SIZE (dst
); 
 900   for (j 
= 0; j 
< ssize
; j
++) 
 906       selt 
= j 
< ssize 
? selts
[j
] : 0; 
 907       delt 
= j 
< dsize 
? delts
[j
] : 0; 
 912       for (i 
= 0; i 
< EBITSET_ELT_WORDS
; i
++) 
 913         if ((EBITSET_WORDS (selt
)[i
] & EBITSET_WORDS (delt
)[i
])) 
 922 ebitset_op3_cmp (bitset dst
, bitset src1
, bitset src2
, enum bitset_ops op
) 
 924   bitset_windex ssize1
; 
 925   bitset_windex ssize2
; 
 928   ebitset_elts 
*selts1
; 
 929   ebitset_elts 
*selts2
; 
 938   ssize1 
= EBITSET_SIZE (src1
); 
 939   ssize2 
= EBITSET_SIZE (src2
); 
 940   dsize 
= EBITSET_SIZE (dst
); 
 946     ebitset_elts_grow (dst
, size 
- dsize
); 
 948   selts1 
= EBITSET_ELTS (src1
); 
 949   selts2 
= EBITSET_ELTS (src2
); 
 950   delts 
= EBITSET_ELTS (dst
); 
 952   for (j 
= 0; j 
< size
; j
++) 
 958       selt1 
= j 
< ssize1 
? selts1
[j
] : 0; 
 959       selt2 
= j 
< ssize2 
? selts2
[j
] : 0; 
 960       delt 
= j 
< dsize 
? delts
[j
] : 0; 
 962       if (!selt1 
&& !selt2
) 
 967               ebitset_elt_remove (dst
, j
); 
 973         selt1 
= &ebitset_zero_elts
[0]; 
 975         selt2 
= &ebitset_zero_elts
[0]; 
 977         delt 
= ebitset_elt_calloc (); 
 981       srcp1 
= EBITSET_WORDS (selt1
); 
 982       srcp2 
= EBITSET_WORDS (selt2
); 
 983       dstp 
= EBITSET_WORDS (delt
); 
 987           for (i 
= 0; i 
< EBITSET_ELT_WORDS
; i
++, dstp
++) 
 989               bitset_word tmp 
= *srcp1
++ | *srcp2
++; 
1000           for (i 
= 0; i 
< EBITSET_ELT_WORDS
; i
++, dstp
++) 
1002               bitset_word tmp 
= *srcp1
++ & *srcp2
++; 
1013           for (i 
= 0; i 
< EBITSET_ELT_WORDS
; i
++, dstp
++) 
1015               bitset_word tmp 
= *srcp1
++ ^ *srcp2
++; 
1025         case BITSET_OP_ANDN
: 
1026           for (i 
= 0; i 
< EBITSET_ELT_WORDS
; i
++, dstp
++) 
1028               bitset_word tmp 
= *srcp1
++ & ~(*srcp2
++); 
1042       if (!ebitset_elt_zero_p (delt
)) 
1044           ebitset_elt_add (dst
, delt
, j
); 
1048           ebitset_elt_free (delt
); 
1052   /* If we have elements of DST left over, free them all.  */ 
1053   for (; j 
< dsize
; j
++) 
1062         ebitset_elt_remove (dst
, j
); 
1065   EBITSET_NONZERO_SET (dst
); 
1071 ebitset_and_cmp (bitset dst
, bitset src1
, bitset src2
) 
1075   if (EBITSET_ZERO_P (src2
)) 
1078       changed 
= EBITSET_ZERO_P (dst
); 
1082   else if (EBITSET_ZERO_P (src1
)) 
1085       changed 
= EBITSET_ZERO_P (dst
); 
1089   return ebitset_op3_cmp (dst
, src1
, src2
, BITSET_OP_AND
); 
1094 ebitset_and (bitset dst
, bitset src1
, bitset src2
) 
1096   ebitset_and_cmp (dst
, src1
, src2
); 
1101 ebitset_andn_cmp (bitset dst
, bitset src1
, bitset src2
) 
1105   if (EBITSET_ZERO_P (src2
)) 
1107       return ebitset_copy_cmp (dst
, src1
); 
1109   else if (EBITSET_ZERO_P (src1
)) 
1112       changed 
= EBITSET_ZERO_P (dst
); 
1116   return ebitset_op3_cmp (dst
, src1
, src2
, BITSET_OP_ANDN
); 
1121 ebitset_andn (bitset dst
, bitset src1
, bitset src2
) 
1123   ebitset_andn_cmp (dst
, src1
, src2
); 
1128 ebitset_or_cmp (bitset dst
, bitset src1
, bitset src2
) 
1130   if (EBITSET_ZERO_P (src2
)) 
1132       return ebitset_copy_cmp (dst
, src1
); 
1134   else if (EBITSET_ZERO_P (src1
)) 
1136       return ebitset_copy_cmp (dst
, src2
); 
1138   return ebitset_op3_cmp (dst
, src1
, src2
, BITSET_OP_OR
); 
1143 ebitset_or (bitset dst
, bitset src1
, bitset src2
) 
1145   ebitset_or_cmp (dst
, src1
, src2
); 
1150 ebitset_xor_cmp (bitset dst
, bitset src1
, bitset src2
) 
1152   if (EBITSET_ZERO_P (src2
)) 
1154       return ebitset_copy_cmp (dst
, src1
); 
1156   else if (EBITSET_ZERO_P (src1
)) 
1158       return ebitset_copy_cmp (dst
, src2
); 
1160   return ebitset_op3_cmp (dst
, src1
, src2
, BITSET_OP_XOR
); 
1165 ebitset_xor (bitset dst
, bitset src1
, bitset src2
) 
1167   ebitset_xor_cmp (dst
, src1
, src2
); 
1172 ebitset_copy (bitset dst
, bitset src
) 
1174   if (BITSET_COMPATIBLE_ (dst
, src
)) 
1175       ebitset_copy_ (dst
, src
); 
1177       bitset_copy_ (dst
, src
); 
1181 /* Vector of operations for linked-list bitsets.  */ 
1182 struct bitset_vtable ebitset_vtable 
= { 
1208   bitset_andn_or_cmp_
, 
1212   ebitset_list_reverse
, 
1218 /* Return size of initial structure.  */ 
1220 ebitset_bytes (bitset_bindex n_bits ATTRIBUTE_UNUSED
) 
1222   return sizeof (struct ebitset_struct
); 
1226 /* Initialize a bitset.  */ 
1229 ebitset_init (bitset bset
, bitset_bindex n_bits
) 
1233   bset
->b
.vtable 
= &ebitset_vtable
; 
1235   bset
->b
.csize 
= EBITSET_ELT_WORDS
; 
1237   EBITSET_ZERO_SET (bset
); 
1239   size 
= n_bits 
? (n_bits 
+ EBITSET_ELT_BITS 
- 1) / EBITSET_ELT_BITS
 
1240     : EBITSET_INITIAL_SIZE
; 
1242   EBITSET_SIZE (bset
) = 0; 
1243   EBITSET_ELTS (bset
) = 0; 
1244   ebitset_elts_grow (bset
, size
); 
1251 ebitset_release_memory (void) 
1253   ebitset_free_list 
= 0; 
1254   if (ebitset_obstack_init
) 
1256       ebitset_obstack_init 
= 0; 
1257       obstack_free (&ebitset_obstack
, NULL
);