]>
git.saurik.com Git - bison.git/blob - lib/bitsetv.c
2 Copyright (C) 2001, 2002, 2004, 2005 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 2, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING. If not, write to the Free
18 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
29 /* Create a vector of N_VECS bitsets, each of N_BITS, and of
32 bitsetv_alloc (bitset_bindex n_vecs
, bitset_bindex n_bits
,
33 enum bitset_type type
)
40 /* Determine number of bytes for each set. */
41 bytes
= bitset_bytes (type
, n_bits
);
43 /* If size calculation overflows, memory is exhausted. */
44 if (BITSET_SIZE_MAX
/ (sizeof (bitset
) + bytes
) <= n_vecs
)
47 /* Allocate vector table at head of bitset array. */
48 vector_bytes
= (n_vecs
+ 1) * sizeof (bitset
) + bytes
- 1;
49 vector_bytes
-= vector_bytes
% bytes
;
50 bsetv
= xcalloc (1, vector_bytes
+ bytes
* n_vecs
);
52 for (i
= 0; i
< n_vecs
; i
++)
54 bsetv
[i
] = (bitset
) (void *) ((char *) bsetv
+ vector_bytes
+ i
* bytes
);
56 bitset_init (bsetv
[i
], n_bits
, type
);
59 /* Null terminate table. */
65 /* Create a vector of N_VECS bitsets, each of N_BITS, and with
66 attribute hints specified by ATTR. */
68 bitsetv_create (bitset_bindex n_vecs
, bitset_bindex n_bits
, unsigned int attr
)
70 enum bitset_type type
;
72 type
= bitset_type_choose (n_bits
, attr
);
73 return bitsetv_alloc (n_vecs
, n_bits
, type
);
77 /* Free bitset vector BSETV. */
79 bitsetv_free (bitsetv bsetv
)
83 for (i
= 0; bsetv
[i
]; i
++)
84 BITSET_FREE_ (bsetv
[i
]);
89 /* Zero a vector of bitsets. */
91 bitsetv_zero (bitsetv bsetv
)
95 for (i
= 0; bsetv
[i
]; i
++)
96 bitset_zero (bsetv
[i
]);
100 /* Set a vector of bitsets to ones. */
102 bitsetv_ones (bitsetv bsetv
)
106 for (i
= 0; bsetv
[i
]; i
++)
107 bitset_ones (bsetv
[i
]);
111 /* Given a vector BSETV of N bitsets of size N, modify its contents to
112 be the transitive closure of what was given. */
114 bitsetv_transitive_closure (bitsetv bsetv
)
119 for (i
= 0; bsetv
[i
]; i
++)
120 for (j
= 0; bsetv
[j
]; j
++)
121 if (bitset_test (bsetv
[j
], i
))
122 bitset_or (bsetv
[j
], bsetv
[j
], bsetv
[i
]);
126 /* Given a vector BSETV of N bitsets of size N, modify its contents to
127 be the reflexive transitive closure of what was given. This is
128 the same as transitive closure but with all bits on the diagonal
129 of the bit matrix set. */
131 bitsetv_reflexive_transitive_closure (bitsetv bsetv
)
135 bitsetv_transitive_closure (bsetv
);
136 for (i
= 0; bsetv
[i
]; i
++)
137 bitset_set (bsetv
[i
], i
);
141 /* Dump the contents of a bitset vector BSETV with N_VECS elements to
144 bitsetv_dump (FILE *file
, char const *title
, char const *subtitle
,
149 fprintf (file
, "%s\n", title
);
150 for (i
= 0; bsetv
[i
]; i
++)
152 fprintf (file
, "%s %lu\n", subtitle
, (unsigned long int) i
);
153 bitset_dump (file
, bsetv
[i
]);
161 debug_bitsetv (bitsetv bsetv
)
165 for (i
= 0; bsetv
[i
]; i
++)
167 fprintf (stderr
, "%lu: ", (unsigned long int) i
);
168 debug_bitset (bsetv
[i
]);
171 fputc ('\n', stderr
);