2 * Copyright (C) 1994, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.4 1995-09-04 12:33:27 adam
8 * Various cleanup. YAZ util used instead.
10 * Revision 1.3 1995/02/06 10:12:55 adam
11 * Unused static function rm_SetElement was removed.
13 * Revision 1.2 1995/01/24 16:00:22 adam
14 * Added -ansi to CFLAGS.
15 * Some changes to the dfa module.
17 * Revision 1.1 1994/09/26 10:16:57 adam
18 * First version of dfa module in alex. This version uses yacc to parse
19 * regular expressions. This should be hand-made instead.
33 static Set mk_SetElement (SetType st, int n);
35 SetType mk_SetType (int chunk)
39 assert (chunk > 8 && chunk < 8000);
41 st = (SetType) imalloc (sizeof(*st));
44 st->alloclist = st->freelist = NULL;
50 int inf_SetType (SetType st, long *used, long *allocated)
56 for (s = st->alloclist; s; s = s->next)
57 *allocated += st->chunk;
58 return sizeof (SetElement);
61 SetType rm_SetType (SetType st)
64 for (s = st->alloclist; (s1 = s);)
73 Set mk_Set (SetType st)
79 static Set mk_SetElement (SetType st, int n)
85 assert (st->chunk > 8);
88 s = (Set) imalloc (sizeof(*s) * (1+st->chunk));
90 s->next = st->alloclist;
93 for (i=st->chunk; --i > 0; s++)
99 st->freelist = s->next;
105 static void rm_SetElement (SetType st, SetElement *p)
108 assert (st->used > 0);
109 p->next = st->freelist;
115 Set rm_Set (SetType st, Set s)
127 s->next = st->freelist;
130 assert (st->used >= 0);
135 Set add_Set (SetType st, Set s, int n)
140 while (p->next && p->next->value < n)
143 if (!(p->next && p->next->value == n))
145 new = mk_SetElement (st, n);
152 Set union_Set (SetType st, Set s1, Set s2)
158 for (p = &dummy; s1 && s2;)
159 if (s1->value < s2->value)
164 else if (s1->value > s2->value)
166 p = p->next = mk_SetElement (st, s2->value);
181 p = p->next = mk_SetElement (st, s2->value);
189 Set cp_Set (SetType st, Set s)
191 return merge_Set (st, s, NULL);
194 Set merge_Set (SetType st, Set s1, Set s2)
199 for (p = &dummy; s1 && s2; p = p->next)
200 if (s1->value < s2->value)
202 p->next = mk_SetElement (st, s1->value);
205 else if (s1->value > s2->value)
207 p->next = mk_SetElement (st, s2->value);
212 p->next = mk_SetElement (st, s1->value);
220 p = p->next = mk_SetElement (st, s1->value);
227 void pr_Set (SetType st, Set s)
232 printf (" %d", s->value);
238 unsigned hash_Set (SetType st, Set s)
249 int eq_Set (SetType st, Set s1, Set s2)
251 for (; s1 && s2; s1=s1->next, s2=s2->next)
252 if (s1->value != s2->value)