IDZEBRA 2.2.8
bset.c
Go to the documentation of this file.
1/* This file is part of the Zebra server.
2 Copyright (C) Index Data
3
4Zebra is free software; you can redistribute it and/or modify it under
5the terms of the GNU General Public License as published by the Free
6Software Foundation; either version 2, or (at your option) any later
7version.
8
9Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
10WARRANTY; without even the implied warranty of MERCHANTABILITY or
11FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program; if not, write to the Free Software
16Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
18*/
19
20
21#if HAVE_CONFIG_H
22#include <config.h>
23#endif
24#include <stdio.h>
25#include <assert.h>
26
27#include <stdlib.h>
28#include <string.h>
29
30#include <idzebra/util.h>
31#include <bset.h>
32#include "imalloc.h"
33
34#define GET_BIT(s,m) (s[(m)/(sizeof(BSetWord)*8)]&(1<<(m&(sizeof(BSetWord)*8-1))))
35#define SET_BIT(s,m) (s[(m)/(sizeof(BSetWord)*8)]|=(1<<(m&(sizeof(BSetWord)*8-1))))
36
37BSetHandle *mk_BSetHandle (int size, int chunk)
38{
39 int wsize = 1+size/(sizeof(BSetWord)*8);
40 BSetHandle *sh;
41
42 if (chunk <= 1)
43 chunk = 32;
44 sh = (BSetHandle *) imalloc (sizeof(BSetHandle) +
45 chunk*sizeof(BSetWord)*wsize);
46
47 sh->size = size;
48 sh->wsize = wsize;
49 sh->chunk = chunk * wsize;
50 sh->offset = 0;
51 sh->setchain = NULL;
52 return sh;
53}
54
56{
57 BSetHandle *sh, *sh1;
58
59 assert (shp);
60 sh = *shp;
61 assert (sh);
62 while (sh)
63 {
64 sh1 = sh->setchain;
65 ifree (sh);
66 sh = sh1;
67 }
68}
69
70int inf_BSetHandle (BSetHandle *sh, long *used, long *allocated)
71{
72 int wsize;
73
74 assert (sh);
75 *used = 0;
76 *allocated = 0;
77 wsize = sh->wsize;
78 do
79 {
80 *used += sh->offset;
81 *allocated += sh->chunk;
82 } while ((sh = sh->setchain));
83 return wsize;
84}
85
87{
88 BSetHandle *sh, *sh1;
89 unsigned off;
90 assert (shp);
91 sh = *shp;
92 assert (sh);
93
94 off = sh->offset;
95 if ((off + sh->wsize) > sh->chunk)
96 {
97 sh1 = (BSetHandle *) imalloc (sizeof(BSetHandle) +
98 sh->chunk*sizeof(BSetWord));
99 sh1->size = sh->size;
100 sh1->wsize = sh->wsize;
101 sh1->chunk = sh->chunk;
102 off = sh1->offset = 0;
103 sh1->setchain = sh;
104 sh = *shp = sh1;
105 }
106 sh->offset = off + sh->wsize;
107 return sh->setarray + off;
108}
109
110void add_BSet (BSetHandle *sh, BSet dst, unsigned member)
111{
112 assert (dst);
113 assert (sh);
114 assert (member <= sh->size);
115 SET_BIT(dst, member);
116}
117
118unsigned test_BSet (BSetHandle *sh, BSet src, unsigned member)
119{
120 assert (src);
121 assert (sh);
122 assert (member <= sh->size);
123 return GET_BIT (src , member) != 0;
124}
125
127{
128 assert (sh);
129 assert (dst);
130 assert (src);
131 memcpy (dst, src, sh->wsize * sizeof(BSetWord));
132 return dst;
133}
134
135void res_BSet (BSetHandle *sh, BSet dst)
136{
137 assert (dst);
138 memset (dst, 0, sh->wsize * sizeof(BSetWord));
139}
140
141void union_BSet (BSetHandle *sh, BSet dst, BSet src)
142{
143 int i;
144 assert (sh);
145 assert (dst);
146 assert (src);
147 for (i=sh->wsize; --i >= 0;)
148 *dst++ |= *src++;
149}
150
151unsigned hash_BSet (BSetHandle *sh, BSet src)
152{
153 int i;
154 unsigned s = 0;
155 assert (sh);
156 assert (src);
157 for (i=sh->wsize; --i >= 0;)
158 s += *src++;
159 return s;
160}
161
162void com_BSet (BSetHandle *sh, BSet dst)
163{
164 int i;
165 assert (sh);
166 assert (dst);
167 for (i=sh->wsize; --i >= 0; dst++)
168 *dst = ~*dst;
169}
170
171int eq_BSet (BSetHandle *sh, BSet dst, BSet src)
172{
173 int i;
174 assert (sh);
175 assert (dst);
176 assert (src);
177 for (i=sh->wsize; --i >= 0;)
178 if (*dst++ != *src++)
179 return 0;
180 return 1;
181}
182
183int trav_BSet (BSetHandle *sh, BSet src, unsigned member)
184{
185 int i = sh->size - member;
186 BSetWord *sw = src+member/(sizeof(BSetWord)*8);
187 unsigned b = member & (sizeof(BSetWord)*8-1);
188 while(i >= 0)
189 if (b == 0 && *sw == 0)
190 {
191 member += sizeof(BSetWord)*8;
192 ++sw;
193 i -= sizeof(BSetWord)*8;
194 }
195 else if (*sw & (1<<b))
196 return member;
197 else
198 {
199 ++member;
200 --i;
201 if (++b == sizeof(BSetWord)*8)
202 {
203 b = 0;
204 ++sw;
205 }
206 }
207 return -1;
208}
209
210int travi_BSet (BSetHandle *sh, BSet src, unsigned member)
211{
212 int i = sh->size - member;
213 BSetWord *sw = src+member/(sizeof(BSetWord)*8);
214 unsigned b = member & (sizeof(BSetWord)*8-1);
215 while(i >= 0)
216 if (b == 0 && *sw == (BSetWord) ~ 0)
217 {
218 member += sizeof(BSetWord)*8;
219 ++sw;
220 i -= sizeof(BSetWord)*8;
221 }
222 else if ((*sw & (1<<b)) == 0)
223 return member;
224 else
225 {
226 ++member;
227 --i;
228 if (++b == sizeof(BSetWord)*8)
229 {
230 b = 0;
231 ++sw;
232 }
233 }
234 return -1;
235}
236
237
238void pr_BSet (BSetHandle *sh, BSet src)
239{
240 int i;
241 assert (sh);
242 assert (src);
243 for (i=0; (i=trav_BSet(sh,src,i)) != -1; i++)
244 printf (" %d", i);
245 putchar ('\n');
246}
247
248void pr_charBSet (BSetHandle *sh, BSet src, void (*f) (int))
249{
250 int i0, i1, i;
251
252 assert (sh);
253 assert (src);
254 i = trav_BSet (sh, src, 0);
255 while (i != -1)
256 {
257 i0 = i;
258 if (i == '-')
259 f ('\\');
260 f(i);
261 i1 = trav_BSet (sh, src, ++i);
262 if (i1 == i)
263 {
264 do
265 ++i;
266 while ((i1=trav_BSet (sh, src, i)) == i);
267 if (i != i0+2)
268 f ('-');
269 if (i-1 == '-')
270 f ('\\');
271 f(i-1);
272 }
273 i = i1;
274 }
275}
276
277
278/*
279 * Local variables:
280 * c-basic-offset: 4
281 * c-file-style: "Stroustrup"
282 * indent-tabs-mode: nil
283 * End:
284 * vim: shiftwidth=4 tabstop=8 expandtab
285 */
286
void pr_BSet(BSetHandle *sh, BSet src)
Definition bset.c:238
int trav_BSet(BSetHandle *sh, BSet src, unsigned member)
Definition bset.c:183
void add_BSet(BSetHandle *sh, BSet dst, unsigned member)
Definition bset.c:110
void union_BSet(BSetHandle *sh, BSet dst, BSet src)
Definition bset.c:141
unsigned hash_BSet(BSetHandle *sh, BSet src)
Definition bset.c:151
BSet cp_BSet(BSetHandle *sh, BSet dst, BSet src)
Definition bset.c:126
void pr_charBSet(BSetHandle *sh, BSet src, void(*f)(int))
Definition bset.c:248
unsigned test_BSet(BSetHandle *sh, BSet src, unsigned member)
Definition bset.c:118
void res_BSet(BSetHandle *sh, BSet dst)
Definition bset.c:135
BSetHandle * mk_BSetHandle(int size, int chunk)
Definition bset.c:37
BSet mk_BSet(BSetHandle **shp)
Definition bset.c:86
#define GET_BIT(s, m)
Definition bset.c:34
void rm_BSetHandle(BSetHandle **shp)
Definition bset.c:55
int inf_BSetHandle(BSetHandle *sh, long *used, long *allocated)
Definition bset.c:70
int eq_BSet(BSetHandle *sh, BSet dst, BSet src)
Definition bset.c:171
int travi_BSet(BSetHandle *sh, BSet src, unsigned member)
Definition bset.c:210
#define SET_BIT(s, m)
Definition bset.c:35
void com_BSet(BSetHandle *sh, BSet dst)
Definition bset.c:162
unsigned short BSetWord
Definition bset.h:27
BSetWord * BSet
Definition bset.h:28
void ifree(void *p)
Definition imalloc.c:93
void * imalloc(size_t size)
Definition imalloc.c:43
unsigned chunk
Definition bset.h:34
unsigned offset
Definition bset.h:33
unsigned wsize
Definition bset.h:32
unsigned size
Definition bset.h:31
struct BSetHandle_ * setchain
Definition bset.h:35
BSetWord setarray[1]
Definition bset.h:36