⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abitset.c

📁 bison 2.0 主要可以用来做语法分析用的
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Array bitsets.   Copyright (C) 2002, 2003 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   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   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.*/#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "abitset.h"#include <stddef.h>#include <stdlib.h>#include <string.h>/* This file implements fixed size bitsets stored as an array   of words.  Any unused bits in the last word must be zero.  */#define ABITSET_N_WORDS(N) (((N) + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS)#define ABITSET_WORDS(X) ((X)->a.words)static bitset_bindexabitset_resize (bitset src ATTRIBUTE_UNUSED,		bitset_bindex size ATTRIBUTE_UNUSED){    if (BITSET_SIZE_ (src) == size)	return size;    /* These bitsets have a fixed size.  */    abort ();}/* 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_bindexabitset_small_list (bitset src, bitset_bindex *list,		    bitset_bindex num, bitset_bindex *next){  bitset_bindex bitno;  bitset_bindex count;  bitset_windex size;  bitset_word word;  word = ABITSET_WORDS (src)[0];  /* Short circuit common case.  */  if (!word)    return 0;  size = BITSET_SIZE_ (src);  bitno = *next;  if (bitno >= size)    return 0;  word >>= bitno;  /* If num is 1, we could speed things up with a binary search     of the word of interest.  */  if (num >= BITSET_WORD_BITS)    {      for (count = 0; word; bitno++)	{	  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;	}    }  *next = bitno;  return count;}/* Set bit BITNO in bitset DST.  */static voidabitset_set (bitset dst ATTRIBUTE_UNUSED, bitset_bindex bitno ATTRIBUTE_UNUSED){  /* 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 ();}/* Reset bit BITNO in bitset DST.  */static voidabitset_reset (bitset dst ATTRIBUTE_UNUSED,	       bitset_bindex bitno ATTRIBUTE_UNUSED){  /* 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 boolabitset_test (bitset src ATTRIBUTE_UNUSED,	      bitset_bindex bitno ATTRIBUTE_UNUSED){  /* This should never occur for abitsets since we should always     hit the cache.  */  return false;}/* Find list of up to NUM bits set in BSET in reverse order, 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_bindexabitset_list_reverse (bitset src, bitset_bindex *list,		      bitset_bindex num, bitset_bindex *next){  bitset_bindex bitno;  bitset_bindex rbitno;  bitset_bindex count;  bitset_windex windex;  unsigned int bitcnt;  bitset_bindex bitoff;  bitset_word *srcp = ABITSET_WORDS (src);  bitset_bindex n_bits = BITSET_SIZE_ (src);  rbitno = *next;  /* If num is 1, we could speed things up with a binary search     of the word of interest.  */  if (rbitno >= n_bits)    return 0;  count = 0;  bitno = n_bits - (rbitno + 1);  windex = bitno / BITSET_WORD_BITS;  bitcnt = bitno % BITSET_WORD_BITS;  bitoff = windex * BITSET_WORD_BITS;  do    {      bitset_word word;      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;	}      bitoff -= BITSET_WORD_BITS;      bitcnt = BITSET_WORD_BITS - 1;    }  while (windex--);  *next = n_bits - (bitoff + 1);  return count;}/* 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_bindexabitset_list (bitset src, bitset_bindex *list,	      bitset_bindex num, bitset_bindex *next){  bitset_bindex bitno;  bitset_bindex count;  bitset_windex windex;  bitset_bindex bitoff;  bitset_windex size = src->b.csize;  bitset_word *srcp = ABITSET_WORDS (src);  bitset_word word;  bitno = *next;  count = 0;  if (!bitno)    {      /* Many bitsets are zero, so make this common case fast.  */      for (windex = 0; windex < size && !srcp[windex]; windex++)	continue;      if (windex >= size)	return 0;      /* If num is 1, we could speed things up with a binary search	 of the current word.  */      bitoff = windex * BITSET_WORD_BITS;    }  else    {      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++;	}      bitoff = windex * BITSET_WORD_BITS;    }  for (; windex < size; windex++, bitoff += BITSET_WORD_BITS)    {      if (!(word = srcp[windex]))	continue;      if ((count + BITSET_WORD_BITS) < num)	{	  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;	    }	}    }  *next = bitoff;  return count;}/* Ensure that any unused bits within the last word are clear.  */static inline voidabitset_unused_clear (bitset dst){  unsigned int last_bit;  last_bit = BITSET_SIZE_ (dst) % BITSET_WORD_BITS;  if (last_bit)    ABITSET_WORDS (dst)[dst->b.csize - 1] &=      ((bitset_word) 1 << last_bit) - 1;}static voidabitset_ones (bitset dst){  bitset_word *dstp = ABITSET_WORDS (dst);  size_t bytes;  bytes = sizeof (bitset_word) * dst->b.csize;  memset (dstp, -1, bytes);  abitset_unused_clear (dst);}static voidabitset_zero (bitset dst){  bitset_word *dstp = ABITSET_WORDS (dst);  size_t bytes;  bytes = sizeof (bitset_word) * dst->b.csize;  memset (dstp, 0, bytes);}static boolabitset_empty_p (bitset dst){  bitset_windex i;  bitset_word *dstp = ABITSET_WORDS (dst);  for (i = 0; i < dst->b.csize; i++)    if (dstp[i])      return false;  return true;}static voidabitset_copy1 (bitset dst, bitset src){  bitset_word *srcp = ABITSET_WORDS (src);  bitset_word *dstp = ABITSET_WORDS (dst);  bitset_windex size = dst->b.csize;  if (srcp == dstp)      return;  memcpy (dstp, srcp, sizeof (bitset_word) * size);}static voidabitset_not (bitset dst, bitset src){  bitset_windex i;  bitset_word *srcp = ABITSET_WORDS (src);  bitset_word *dstp = ABITSET_WORDS (dst);  bitset_windex size = dst->b.csize;  for (i = 0; i < size; i++)      *dstp++ = ~(*srcp++);  abitset_unused_clear (dst);}static boolabitset_equal_p (bitset dst, bitset src){  bitset_windex i;  bitset_word *srcp = ABITSET_WORDS (src);  bitset_word *dstp = ABITSET_WORDS (dst);  bitset_windex size = dst->b.csize;  for (i = 0; i < size; i++)      if (*srcp++ != *dstp++)	  return false;  return true;}static boolabitset_subset_p (bitset dst, bitset src){  bitset_windex i;  bitset_word *srcp = ABITSET_WORDS (src);  bitset_word *dstp = ABITSET_WORDS (dst);  bitset_windex size = dst->b.csize;  for (i = 0; i < size; i++, dstp++, srcp++)      if (*dstp != (*srcp | *dstp))	  return false;  return true;}static boolabitset_disjoint_p (bitset dst, bitset src){  bitset_windex i;  bitset_word *srcp = ABITSET_WORDS (src);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -