2 * Copyright (C) 1994, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.5 1996-10-29 13:57:29 adam
8 * Include of zebrautl.h instead of alexutil.h.
10 * Revision 1.4 1995/09/04 12:33:27 adam
11 * Various cleanup. YAZ util used instead.
13 * Revision 1.3 1995/02/06 10:12:55 adam
14 * Unused static function rm_SetElement was removed.
16 * Revision 1.2 1995/01/24 16:00:22 adam
17 * Added -ansi to CFLAGS.
18 * Some changes to the dfa module.
20 * Revision 1.1 1994/09/26 10:16:57 adam
21 * First version of dfa module in alex. This version uses yacc to parse
22 * regular expressions. This should be hand-made instead.
35 static Set mk_SetElement (SetType st, int n);
37 SetType mk_SetType (int chunk)
41 assert (chunk > 8 && chunk < 8000);
43 st = (SetType) imalloc (sizeof(*st));
46 st->alloclist = st->freelist = NULL;
52 int inf_SetType (SetType st, long *used, long *allocated)
58 for (s = st->alloclist; s; s = s->next)
59 *allocated += st->chunk;
60 return sizeof (SetElement);
63 SetType rm_SetType (SetType st)
66 for (s = st->alloclist; (s1 = s);)
75 Set mk_Set (SetType st)
81 static Set mk_SetElement (SetType st, int n)
87 assert (st->chunk > 8);
90 s = (Set) imalloc (sizeof(*s) * (1+st->chunk));
92 s->next = st->alloclist;
95 for (i=st->chunk; --i > 0; s++)
101 st->freelist = s->next;
107 static void rm_SetElement (SetType st, SetElement *p)
110 assert (st->used > 0);
111 p->next = st->freelist;
117 Set rm_Set (SetType st, Set s)
129 s->next = st->freelist;
132 assert (st->used >= 0);
137 Set add_Set (SetType st, Set s, int n)
142 while (p->next && p->next->value < n)
145 if (!(p->next && p->next->value == n))
147 new = mk_SetElement (st, n);
154 Set union_Set (SetType st, Set s1, Set s2)
160 for (p = &dummy; s1 && s2;)
161 if (s1->value < s2->value)
166 else if (s1->value > s2->value)
168 p = p->next = mk_SetElement (st, s2->value);
183 p = p->next = mk_SetElement (st, s2->value);
191 Set cp_Set (SetType st, Set s)
193 return merge_Set (st, s, NULL);
196 Set merge_Set (SetType st, Set s1, Set s2)
201 for (p = &dummy; s1 && s2; p = p->next)
202 if (s1->value < s2->value)
204 p->next = mk_SetElement (st, s1->value);
207 else if (s1->value > s2->value)
209 p->next = mk_SetElement (st, s2->value);
214 p->next = mk_SetElement (st, s1->value);
222 p = p->next = mk_SetElement (st, s1->value);
229 void pr_Set (SetType st, Set s)
234 printf (" %d", s->value);
240 unsigned hash_Set (SetType st, Set s)
251 int eq_Set (SetType st, Set s1, Set s2)
253 for (; s1 && s2; s1=s1->next, s2=s2->next)
254 if (s1->value != s2->value)