2 * Copyright (C) 1994-1999, Index Data
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.6 1999-02-02 14:50:13 adam
8 * Updated WIN32 code specific sections. Changed header.
10 * Revision 1.5 1996/10/29 13:57:29 adam
11 * Include of zebrautl.h instead of alexutil.h.
13 * Revision 1.4 1995/09/04 12:33:27 adam
14 * Various cleanup. YAZ util used instead.
16 * Revision 1.3 1995/02/06 10:12:55 adam
17 * Unused static function rm_SetElement was removed.
19 * Revision 1.2 1995/01/24 16:00:22 adam
20 * Added -ansi to CFLAGS.
21 * Some changes to the dfa module.
23 * Revision 1.1 1994/09/26 10:16:57 adam
24 * First version of dfa module in alex. This version uses yacc to parse
25 * regular expressions. This should be hand-made instead.
38 static Set mk_SetElement (SetType st, int n);
40 SetType mk_SetType (int chunk)
44 assert (chunk > 8 && chunk < 8000);
46 st = (SetType) imalloc (sizeof(*st));
49 st->alloclist = st->freelist = NULL;
55 int inf_SetType (SetType st, long *used, long *allocated)
61 for (s = st->alloclist; s; s = s->next)
62 *allocated += st->chunk;
63 return sizeof (SetElement);
66 SetType rm_SetType (SetType st)
69 for (s = st->alloclist; (s1 = s);)
78 Set mk_Set (SetType st)
84 static Set mk_SetElement (SetType st, int n)
90 assert (st->chunk > 8);
93 s = (Set) imalloc (sizeof(*s) * (1+st->chunk));
95 s->next = st->alloclist;
98 for (i=st->chunk; --i > 0; s++)
104 st->freelist = s->next;
110 static void rm_SetElement (SetType st, SetElement *p)
113 assert (st->used > 0);
114 p->next = st->freelist;
120 Set rm_Set (SetType st, Set s)
132 s->next = st->freelist;
135 assert (st->used >= 0);
140 Set add_Set (SetType st, Set s, int n)
145 while (p->next && p->next->value < n)
148 if (!(p->next && p->next->value == n))
150 new = mk_SetElement (st, n);
157 Set union_Set (SetType st, Set s1, Set s2)
163 for (p = &dummy; s1 && s2;)
164 if (s1->value < s2->value)
169 else if (s1->value > s2->value)
171 p = p->next = mk_SetElement (st, s2->value);
186 p = p->next = mk_SetElement (st, s2->value);
194 Set cp_Set (SetType st, Set s)
196 return merge_Set (st, s, NULL);
199 Set merge_Set (SetType st, Set s1, Set s2)
204 for (p = &dummy; s1 && s2; p = p->next)
205 if (s1->value < s2->value)
207 p->next = mk_SetElement (st, s1->value);
210 else if (s1->value > s2->value)
212 p->next = mk_SetElement (st, s2->value);
217 p->next = mk_SetElement (st, s1->value);
225 p = p->next = mk_SetElement (st, s1->value);
232 void pr_Set (SetType st, Set s)
237 printf (" %d", s->value);
243 unsigned hash_Set (SetType st, Set s)
254 int eq_Set (SetType st, Set s1, Set s2)
256 for (; s1 && s2; s1=s1->next, s2=s2->next)
257 if (s1->value != s2->value)