]> git.saurik.com Git - bison.git/blob - lib/bitsetv.c
* lib/bitset.c, lib/bitset.h, lib/bitsetv.c, lib/bitsetv.h,
[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 /* Dump the contents of a bitset vector BSETV with N_VECS elements to
115 FILE. */
116 void
117 bitsetv_dump (file, title, subtitle, bsetv)
118 FILE *file;
119 const char *title, *subtitle;
120 bitset *bsetv;
121 {
122 unsigned int i;
123
124 fprintf (file, "%s\n", title);
125 for (i = 0; bsetv[i]; i++)
126 {
127 fprintf (file, "%s %d\n", subtitle, i);
128 bitset_dump (file, bsetv[i]);
129 }
130
131 fprintf (file, "\n");
132 }
133
134
135 void
136 debug_bitsetv (bsetv)
137 bitset *bsetv;
138 {
139 unsigned int i;
140
141 for (i = 0; bsetv[i]; i++)
142 {
143 fprintf (stderr, "%d: ", i);
144 debug_bitset (bsetv[i]);
145 }
146
147 fprintf (stderr, "\n");
148 }