]> git.saurik.com Git - bison.git/blob - lib/bitsetv.c
3d8e368ac41bef92a12d3651005c04dbe08cee10
[bison.git] / lib / bitsetv.c
1 /* Bitset vectors.
2 Copyright (C) 2001 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
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
9 version.
10
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
14 for more details.
15
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, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA. */
20
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include <stdlib.h>
26 #include "bitsetv.h"
27
28
29 /* Create a vector of N_VECS bitsets, each of N_BITS, and of
30 type TYPE. */
31 bitset *
32 bitsetv_alloc (n_vecs, n_bits, type)
33 unsigned int n_vecs;
34 unsigned int n_bits;
35 enum bitset_type type;
36 {
37 unsigned int vector_bytes;
38 unsigned int bytes;
39 bitset *bsetv;
40 unsigned int i;
41
42 /* Determine number of bytes for each set. */
43 bytes = bitset_bytes (type, n_bits);
44
45 /* Allocate vector table at head of bitset array. */
46 vector_bytes = (n_vecs + 1) * sizeof (bitset);
47 bsetv = (bitset *) xcalloc (1, vector_bytes + bytes * n_vecs);
48
49 for (i = 0; i < n_vecs; i++)
50 {
51 bsetv[i] = (bitset) ((char *) bsetv + vector_bytes + i * bytes);
52
53 bitset_init (bsetv[i], n_bits, type);
54 }
55
56 /* Null terminate table. */
57 bsetv[i] = 0;
58 return bsetv;
59 }
60
61
62 /* Create a vector of N_VECS bitsets, each of N_BITS, and with
63 attribute hints specified by ATTR. */
64 bitset *
65 bitsetv_create (n_vecs, n_bits, attr)
66 unsigned int n_vecs;
67 unsigned int n_bits;
68 unsigned int attr;
69 {
70 enum bitset_type type;
71
72 type = bitset_type_choose (n_bits, attr);
73 return bitsetv_alloc (n_vecs, n_bits, type);
74 }
75
76
77 /* Free bitset vector BSETV. */
78 void
79 bitsetv_free (bsetv)
80 bitset *bsetv;
81 {
82 unsigned int i;
83
84 for (i = 0; bsetv[i]; i++)
85 BITSET_FREE_ (bsetv[i]);
86 free (bsetv);
87 }
88
89
90 /* Zero a vector of bitsets. */
91 void
92 bitsetv_zero (bsetv)
93 struct bitset_struct **bsetv;
94 {
95 unsigned int i;
96
97 for (i = 0; bsetv[i]; i++)
98 bitset_zero (bsetv[i]);
99 }
100
101
102 /* Set a vector of bitsets to ones. */
103 void
104 bitsetv_ones (bsetv)
105 bitset *bsetv;
106 {
107 unsigned int i;
108
109 for (i = 0; bsetv[i]; i++)
110 bitset_ones (bsetv[i]);
111 }
112
113
114 /* Given a vector BSETV of N bitsets of size N, modify its contents to
115 be the transitive closure of what was given. */
116 void
117 bitsetv_transitive_closure (bsetv)
118 bitset *bsetv;
119 {
120 unsigned int i;
121 unsigned int j;
122
123 for (i = 0; bsetv[i]; i++)
124 for (j = 0; bsetv[j]; j++)
125 if (bitset_test (bsetv[j], i))
126 bitset_or (bsetv[j], bsetv[j], bsetv[i]);
127 }
128
129
130 /* Given a vector BSETV of N bitsets of size N, modify its contents to
131 be the reflexive transitive closure of what was given. This is
132 the same as transitive closure but with all bits on the diagonal
133 of the bit matrix set. */
134 void
135 bitsetv_reflexive_transitive_closure (bitsetv bsetv)
136 {
137 int i;
138
139 bitsetv_transitive_closure (bsetv);
140 for (i = 0; bsetv[i]; i++)
141 bitset_set (bsetv[i], i);
142 }
143
144
145 /* Dump the contents of a bitset vector BSETV with N_VECS elements to
146 FILE. */
147 void
148 bitsetv_dump (file, title, subtitle, bsetv)
149 FILE *file;
150 const char *title, *subtitle;
151 bitset *bsetv;
152 {
153 unsigned int i;
154
155 fprintf (file, "%s\n", title);
156 for (i = 0; bsetv[i]; i++)
157 {
158 fprintf (file, "%s %d\n", subtitle, i);
159 bitset_dump (file, bsetv[i]);
160 }
161
162 fprintf (file, "\n");
163 }
164
165
166 void
167 debug_bitsetv (bsetv)
168 bitset *bsetv;
169 {
170 unsigned int i;
171
172 for (i = 0; bsetv[i]; i++)
173 {
174 fprintf (stderr, "%d: ", i);
175 debug_bitset (bsetv[i]);
176 }
177
178 fprintf (stderr, "\n");
179 }