source: trunk/third/rx/rx/rxbitset.c @ 10430

Revision 10430, 6.4 KB checked in by ghudson, 27 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r10429, which included commits to RCS files with non-trunk default branches.
Line 
1/*      Copyright (C) 1995, 1996 Tom Lord
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU Library General Public License as published by
5 * the Free Software Foundation; either version 2, or (at your option)
6 * any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 * GNU Library General Public License for more details.
12 *
13 * You should have received a copy of the GNU Library General Public License
14 * along with this software; see the file COPYING.  If not, write to
15 * the Free Software Foundation, 59 Temple Place - Suite 330,
16 * Boston, MA 02111-1307, USA.
17 */
18
19
20/*
21 * Tom Lord (lord@cygnus.com, lord@gnu.ai.mit.edu)
22 */
23
24
25#include "rxall.h"
26#include "rxbitset.h"
27
28
29#ifdef __STDC__
30int
31rx_bitset_is_equal (int size, rx_Bitset a, rx_Bitset b)
32#else
33int
34rx_bitset_is_equal (size, a, b)
35     int size;
36     rx_Bitset a;
37     rx_Bitset b;
38#endif
39{
40  int x;
41  RX_subset s;
42
43  if (size == 0)
44    return 1;
45
46  s = b[0];
47  b[0] = ~a[0];
48
49  for (x = rx_bitset_numb_subsets(size) - 1; a[x] == b[x]; --x)
50    ;
51
52  b[0] = s;
53  return !x && (s == a[0]);
54}
55
56
57#ifdef __STDC__
58int
59rx_bitset_is_subset (int size, rx_Bitset a, rx_Bitset b)
60#else
61int
62rx_bitset_is_subset (size, a, b)
63     int size;
64     rx_Bitset a;
65     rx_Bitset b;
66#endif
67{
68  int x;
69  x = rx_bitset_numb_subsets(size) - 1;
70  while (x-- && ((a[x] & b[x]) == a[x]));
71  return x == -1;
72}
73
74
75#ifdef __STDC__
76int
77rx_bitset_empty (int size, rx_Bitset set)
78#else
79int
80rx_bitset_empty (size, set)
81     int size;
82     rx_Bitset set;
83#endif
84{
85  int x;
86  RX_subset s;
87  s = set[0];
88  set[0] = 1;
89  for (x = rx_bitset_numb_subsets(size) - 1; !set[x]; --x)
90    ;
91  set[0] = s;
92  return !s;
93}
94
95#ifdef __STDC__
96void
97rx_bitset_null (int size, rx_Bitset b)
98#else
99void
100rx_bitset_null (size, b)
101     int size;
102     rx_Bitset b;
103#endif
104{
105  rx_bzero ((char *)b, rx_sizeof_bitset(size));
106}
107
108
109#ifdef __STDC__
110void
111rx_bitset_universe (int size, rx_Bitset b)
112#else
113void
114rx_bitset_universe (size, b)
115     int size;
116     rx_Bitset b;
117#endif
118{
119  int x = rx_bitset_numb_subsets (size);
120  while (x--)
121    *b++ = ~(RX_subset)0;
122}
123
124
125#ifdef __STDC__
126void
127rx_bitset_complement (int size, rx_Bitset b)
128#else
129void
130rx_bitset_complement (size, b)
131     int size;
132     rx_Bitset b;
133#endif
134{
135  int x = rx_bitset_numb_subsets (size);
136  while (x--)
137    {
138      *b = ~*b;
139      ++b;
140    }
141}
142
143
144#ifdef __STDC__
145void
146rx_bitset_assign (int size, rx_Bitset a, rx_Bitset b)
147#else
148void
149rx_bitset_assign (size, a, b)
150     int size;
151     rx_Bitset a;
152     rx_Bitset b;
153#endif
154{
155  int x;
156  for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
157    a[x] = b[x];
158}
159
160
161#ifdef __STDC__
162void
163rx_bitset_union (int size, rx_Bitset a, rx_Bitset b)
164#else
165void
166rx_bitset_union (size, a, b)
167     int size;
168     rx_Bitset a;
169     rx_Bitset b;
170#endif
171{
172  int x;
173  for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
174    a[x] |= b[x];
175}
176
177
178#ifdef __STDC__
179void
180rx_bitset_intersection (int size,
181                        rx_Bitset a, rx_Bitset b)
182#else
183void
184rx_bitset_intersection (size, a, b)
185     int size;
186     rx_Bitset a;
187     rx_Bitset b;
188#endif
189{
190  int x;
191  for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
192    a[x] &= b[x];
193}
194
195
196#ifdef __STDC__
197void
198rx_bitset_difference (int size, rx_Bitset a, rx_Bitset b)
199#else
200void
201rx_bitset_difference (size, a, b)
202     int size;
203     rx_Bitset a;
204     rx_Bitset b;
205#endif
206{
207  int x;
208  for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
209    a[x] &=  ~ b[x];
210}
211
212
213#ifdef __STDC__
214void
215rx_bitset_revdifference (int size,
216                         rx_Bitset a, rx_Bitset b)
217#else
218void
219rx_bitset_revdifference (size, a, b)
220     int size;
221     rx_Bitset a;
222     rx_Bitset b;
223#endif
224{
225  int x;
226  for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
227    a[x] = ~a[x] & b[x];
228}
229
230#ifdef __STDC__
231void
232rx_bitset_xor (int size, rx_Bitset a, rx_Bitset b)
233#else
234void
235rx_bitset_xor (size, a, b)
236     int size;
237     rx_Bitset a;
238     rx_Bitset b;
239#endif
240{
241  int x;
242  for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
243    a[x] ^= b[x];
244}
245
246
247#ifdef __STDC__
248unsigned long
249rx_bitset_hash (int size, rx_Bitset b)
250#else
251unsigned long
252rx_bitset_hash (size, b)
253     int size;
254     rx_Bitset b;
255#endif
256{
257  int x;
258  unsigned long answer;
259
260  answer = 0;
261
262  for (x = 0; x < size; ++x)
263    {
264      if (RX_bitset_member (b, x))
265        answer += (answer << 3) + x;
266    }
267  return answer;
268}
269
270
271RX_subset rx_subset_singletons [RX_subset_bits] =
272{
273  0x1,
274  0x2,
275  0x4,
276  0x8,
277  0x10,
278  0x20,
279  0x40,
280  0x80,
281  0x100,
282  0x200,
283  0x400,
284  0x800,
285  0x1000,
286  0x2000,
287  0x4000,
288  0x8000,
289  0x10000,
290  0x20000,
291  0x40000,
292  0x80000,
293  0x100000,
294  0x200000,
295  0x400000,
296  0x800000,
297  0x1000000,
298  0x2000000,
299  0x4000000,
300  0x8000000,
301  0x10000000,
302  0x20000000,
303  0x40000000,
304  0x80000000
305};
306
307
308/*
309 * (define l (let loop ((x 0) (l '())) (if (eq? x 256) l (loop (+ x 1) (cons x l)))))
310 * (define lb (map (lambda (n) (number->string n 2)) l))
311 * (define lc (map string->list lb))
312 * (define ln (map (lambda (l) (map (lambda (c) (if (eq? c #\1) 1 0)) l)) lc))
313 * (define lt (map (lambda (l) (apply + l)) ln))
314 */
315
316static int char_pops[256] =
317{
318  0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
319  1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
320  1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
321  2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
322  1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
323  2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
324  2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
325  3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
326  1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
327  2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
328  2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
329  3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
330  2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
331  3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
332  3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
333  4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
334};
335
336#define RX_char_population(C) (char_pops[C])
337
338#ifdef __STDC__
339int
340rx_bitset_population (int size, rx_Bitset a)
341#else
342int
343rx_bitset_population (size, a)
344     int size;
345     rx_Bitset a;
346#endif
347{
348  int x;
349  int total;
350  unsigned char s;
351
352  if (size == 0)
353    return 0;
354
355  total = 0;
356  x = sizeof (RX_subset) * rx_bitset_numb_subsets(size) - 1;
357  while (x >= 0)
358    {
359      s = ((unsigned char *)a)[x];
360      --x;
361      total = total + RX_char_population (s);
362    }
363  return total;
364}     
Note: See TracBrowser for help on using the repository browser.