2 * Copyright (C) 1994-1999, Index Data
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.7 1999-05-26 07:49:12 adam
10 * Revision 1.6 1999/02/02 14:50:13 adam
11 * Updated WIN32 code specific sections. Changed header.
13 * Revision 1.5 1996/10/29 13:57:29 adam
14 * Include of zebrautl.h instead of alexutil.h.
16 * Revision 1.4 1995/09/04 12:33:27 adam
17 * Various cleanup. YAZ util used instead.
19 * Revision 1.3 1995/02/06 10:12:55 adam
20 * Unused static function rm_SetElement was removed.
22 * Revision 1.2 1995/01/24 16:00:22 adam
23 * Added -ansi to CFLAGS.
24 * Some changes to the dfa module.
26 * Revision 1.1 1994/09/26 10:16:57 adam
27 * First version of dfa module in alex. This version uses yacc to parse
28 * regular expressions. This should be hand-made instead.
41 static Set mk_SetElement (SetType st, int n);
43 SetType mk_SetType (int chunk)
47 assert (chunk > 8 && chunk < 8000);
49 st = (SetType) imalloc (sizeof(*st));
52 st->alloclist = st->freelist = NULL;
58 int inf_SetType (SetType st, long *used, long *allocated)
64 for (s = st->alloclist; s; s = s->next)
65 *allocated += st->chunk;
66 return sizeof (SetElement);
69 SetType rm_SetType (SetType st)
72 for (s = st->alloclist; (s1 = s);)
81 Set mk_Set (SetType st)
87 static Set mk_SetElement (SetType st, int n)
93 assert (st->chunk > 8);
96 s = (Set) imalloc (sizeof(*s) * (1+st->chunk));
98 s->next = st->alloclist;
101 for (i=st->chunk; --i > 0; s++)
107 st->freelist = s->next;
113 static void rm_SetElement (SetType st, SetElement *p)
116 assert (st->used > 0);
117 p->next = st->freelist;
123 Set rm_Set (SetType st, Set s)
135 s->next = st->freelist;
138 assert (st->used >= 0);
143 Set add_Set (SetType st, Set s, int n)
146 Set p = &dummy, snew;
148 while (p->next && p->next->value < n)
151 if (!(p->next && p->next->value == n))
153 snew = mk_SetElement (st, n);
154 snew->next = p->next;
160 Set union_Set (SetType st, Set s1, Set s2)
166 for (p = &dummy; s1 && s2;)
167 if (s1->value < s2->value)
172 else if (s1->value > s2->value)
174 p = p->next = mk_SetElement (st, s2->value);
189 p = p->next = mk_SetElement (st, s2->value);
197 Set cp_Set (SetType st, Set s)
199 return merge_Set (st, s, NULL);
202 Set merge_Set (SetType st, Set s1, Set s2)
207 for (p = &dummy; s1 && s2; p = p->next)
208 if (s1->value < s2->value)
210 p->next = mk_SetElement (st, s1->value);
213 else if (s1->value > s2->value)
215 p->next = mk_SetElement (st, s2->value);
220 p->next = mk_SetElement (st, s1->value);
228 p = p->next = mk_SetElement (st, s1->value);
235 void pr_Set (SetType st, Set s)
240 printf (" %d", s->value);
246 unsigned hash_Set (SetType st, Set s)
257 int eq_Set (SetType st, Set s1, Set s2)
259 for (; s1 && s2; s1=s1->next, s2=s2->next)
260 if (s1->value != s2->value)