annotate lib/bitsetv.c @ 40159:069b50a66104

bitsetv: allow free on NULL. * lib/bitsetv.c (bitsetv_free): Do nothing when the bitsetv is NULL.
author Akim Demaille <akim.demaille@gmail.com>
date Sun, 27 Jan 2019 18:49:36 +0100
parents b5d7b6ac3542
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
39975
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
1 /* Bitset vectors.
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
2
40057
b06060465f09 maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents: 39975
diff changeset
3 Copyright (C) 2001-2002, 2004-2006, 2009-2015, 2018-2019 Free Software
39975
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
4 Foundation, Inc.
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
5
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
6 This program is free software: you can redistribute it and/or modify
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
8 the Free Software Foundation, either version 3 of the License, or
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
9 (at your option) any later version.
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
10
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
11 This program is distributed in the hope that it will be useful,
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
14 GNU General Public License for more details.
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
15
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
18
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
19 #include <config.h>
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
20
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
21 #include "bitsetv.h"
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
22
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
23 #include <stdlib.h>
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
24
40067
b5d7b6ac3542 bitsetv: Fix module dependencies.
Bruno Haible <bruno@clisp.org>
parents: 40057
diff changeset
25 #include "xalloc.h"
b5d7b6ac3542 bitsetv: Fix module dependencies.
Bruno Haible <bruno@clisp.org>
parents: 40057
diff changeset
26
39975
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
27
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
28 /* Create a vector of N_VECS bitsets, each of N_BITS, and of
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
29 type TYPE. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
30 bitset *
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
31 bitsetv_alloc (bitset_bindex n_vecs, bitset_bindex n_bits,
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
32 enum bitset_type type)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
33 {
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
34 /* Determine number of bytes for each set. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
35 size_t bytes = bitset_bytes (type, n_bits);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
36
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
37 /* If size calculation overflows, memory is exhausted. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
38 if (BITSET_SIZE_MAX / (sizeof (bitset) + bytes) <= n_vecs)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
39 xalloc_die ();
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
40
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
41 /* Allocate vector table at head of bitset array. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
42 size_t vector_bytes = (n_vecs + 1) * sizeof (bitset) + bytes - 1;
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
43 vector_bytes -= vector_bytes % bytes;
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
44 bitset *bsetv = xcalloc (1, vector_bytes + bytes * n_vecs);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
45
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
46 bitset_bindex i = 0;
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
47 for (i = 0; i < n_vecs; i++)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
48 {
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
49 bsetv[i] = (bitset) (void *) ((char *) bsetv + vector_bytes + i * bytes);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
50
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
51 bitset_init (bsetv[i], n_bits, type);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
52 }
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
53
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
54 /* Null terminate table. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
55 bsetv[i] = 0;
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
56 return bsetv;
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
57 }
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
58
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
59
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
60 /* Create a vector of N_VECS bitsets, each of N_BITS, and with
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
61 attribute hints specified by ATTR. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
62 bitset *
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
63 bitsetv_create (bitset_bindex n_vecs, bitset_bindex n_bits, unsigned attr)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
64 {
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
65 enum bitset_type type = bitset_type_choose (n_bits, attr);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
66 return bitsetv_alloc (n_vecs, n_bits, type);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
67 }
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
68
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
69
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
70 /* Free bitset vector BSETV. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
71 void
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
72 bitsetv_free (bitsetv bsetv)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
73 {
40159
069b50a66104 bitsetv: allow free on NULL.
Akim Demaille <akim.demaille@gmail.com>
parents: 40067
diff changeset
74 if (bsetv)
069b50a66104 bitsetv: allow free on NULL.
Akim Demaille <akim.demaille@gmail.com>
parents: 40067
diff changeset
75 {
069b50a66104 bitsetv: allow free on NULL.
Akim Demaille <akim.demaille@gmail.com>
parents: 40067
diff changeset
76 for (bitset_bindex i = 0; bsetv[i]; i++)
069b50a66104 bitsetv: allow free on NULL.
Akim Demaille <akim.demaille@gmail.com>
parents: 40067
diff changeset
77 BITSET_FREE_ (bsetv[i]);
069b50a66104 bitsetv: allow free on NULL.
Akim Demaille <akim.demaille@gmail.com>
parents: 40067
diff changeset
78 free (bsetv);
069b50a66104 bitsetv: allow free on NULL.
Akim Demaille <akim.demaille@gmail.com>
parents: 40067
diff changeset
79 }
39975
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
80 }
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
81
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
82
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
83 /* Zero a vector of bitsets. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
84 void
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
85 bitsetv_zero (bitsetv bsetv)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
86 {
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
87 for (bitset_bindex i = 0; bsetv[i]; i++)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
88 bitset_zero (bsetv[i]);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
89 }
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
90
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
91
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
92 /* Set a vector of bitsets to ones. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
93 void
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
94 bitsetv_ones (bitsetv bsetv)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
95 {
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
96 for (bitset_bindex i = 0; bsetv[i]; i++)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
97 bitset_ones (bsetv[i]);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
98 }
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
99
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
100
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
101 /* Given a vector BSETV of N bitsets of size N, modify its contents to
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
102 be the transitive closure of what was given. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
103 void
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
104 bitsetv_transitive_closure (bitsetv bsetv)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
105 {
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
106 for (bitset_bindex i = 0; bsetv[i]; i++)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
107 for (bitset_bindex j = 0; bsetv[j]; j++)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
108 if (bitset_test (bsetv[j], i))
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
109 bitset_or (bsetv[j], bsetv[j], bsetv[i]);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
110 }
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
111
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
112
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
113 /* Given a vector BSETV of N bitsets of size N, modify its contents to
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
114 be the reflexive transitive closure of what was given. This is
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
115 the same as transitive closure but with all bits on the diagonal
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
116 of the bit matrix set. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
117 void
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
118 bitsetv_reflexive_transitive_closure (bitsetv bsetv)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
119 {
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
120 bitsetv_transitive_closure (bsetv);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
121 for (bitset_bindex i = 0; bsetv[i]; i++)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
122 bitset_set (bsetv[i], i);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
123 }
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
124
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
125
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
126 /* Dump the contents of a bitset vector BSETV with N_VECS elements to
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
127 FILE. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
128 void
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
129 bitsetv_dump (FILE *file, char const *title, char const *subtitle,
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
130 bitsetv bsetv)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
131 {
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
132 fprintf (file, "%s\n", title);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
133 for (bitset_windex i = 0; bsetv[i]; i++)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
134 {
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
135 fprintf (file, "%s %lu\n", subtitle, (unsigned long) i);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
136 bitset_dump (file, bsetv[i]);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
137 }
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
138
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
139 fprintf (file, "\n");
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
140 }
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
141
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
142
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
143 void
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
144 debug_bitsetv (bitsetv bsetv)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
145 {
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
146 for (bitset_windex i = 0; bsetv[i]; i++)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
147 {
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
148 fprintf (stderr, "%lu: ", (unsigned long) i);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
149 debug_bitset (bsetv[i]);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
150 }
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
151
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
152 fprintf (stderr, "\n");
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
153 }
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
154
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
155
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
156 /*--------------------------------------------------------.
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
157 | Display the MATRIX array of SIZE bitsets of size SIZE. |
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
158 `--------------------------------------------------------*/
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
159
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
160 void
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
161 bitsetv_matrix_dump (FILE *out, const char *title, bitsetv bset)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
162 {
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
163 bitset_bindex hsize = bitset_size (bset[0]);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
164
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
165 /* Title. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
166 fprintf (out, "%s BEGIN\n", title);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
167
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
168 /* Column numbers. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
169 fputs (" ", out);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
170 for (bitset_bindex i = 0; i < hsize; ++i)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
171 putc (i / 10 ? '0' + i / 10 : ' ', out);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
172 putc ('\n', out);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
173 fputs (" ", out);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
174 for (bitset_bindex i = 0; i < hsize; ++i)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
175 fprintf (out, "%d", (int) (i % 10));
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
176 putc ('\n', out);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
177
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
178 /* Bar. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
179 fputs (" .", out);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
180 for (bitset_bindex i = 0; i < hsize; ++i)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
181 putc ('-', out);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
182 fputs (".\n", out);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
183
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
184 /* Contents. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
185 for (bitset_bindex i = 0; bset[i]; ++i)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
186 {
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
187 fprintf (out, "%2lu|", (unsigned long) i);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
188 for (bitset_bindex j = 0; j < hsize; ++j)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
189 fputs (bitset_test (bset[i], j) ? "1" : " ", out);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
190 fputs ("|\n", out);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
191 }
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
192
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
193 /* Bar. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
194 fputs (" `", out);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
195 for (bitset_bindex i = 0; i < hsize; ++i)
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
196 putc ('-', out);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
197 fputs ("'\n", out);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
198
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
199 /* End title. */
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
200 fprintf (out, "%s END\n\n", title);
90954bfe8d66 bitsetv: new module
Akim Demaille <akim.demaille@gmail.com>
parents:
diff changeset
201 }