2 * Copyright (C) 1994, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.2 1995-01-24 16:00:22 adam
8 * Added -ansi to CFLAGS.
9 * Some changes to the dfa module.
11 * Revision 1.1 1994/09/26 10:16:57 adam
12 * First version of dfa module in alex. This version uses yacc to parse
13 * regular expressions. This should be hand-made instead.
27 static void rm_SetElement (SetType st, SetElement *p);
28 static Set mk_SetElement (SetType st, int n);
30 SetType mk_SetType (int chunk)
34 assert (chunk > 8 && chunk < 8000);
36 st = (SetType) imalloc (sizeof(*st));
39 st->alloclist = st->freelist = NULL;
45 int inf_SetType (SetType st, long *used, long *allocated)
51 for (s = st->alloclist; s; s = s->next)
52 *allocated += st->chunk;
53 return sizeof (SetElement);
56 SetType rm_SetType (SetType st)
59 for (s = st->alloclist; (s1 = s);)
68 Set mk_Set (SetType st)
74 static Set mk_SetElement (SetType st, int n)
80 assert (st->chunk > 8);
83 s = (Set) imalloc (sizeof(*s) * (1+st->chunk));
85 s->next = st->alloclist;
88 for (i=st->chunk; --i > 0; s++)
94 st->freelist = s->next;
99 static void rm_SetElement (SetType st, SetElement *p)
102 assert (st->used > 0);
103 p->next = st->freelist;
108 Set rm_Set (SetType st, Set s)
120 s->next = st->freelist;
123 assert (st->used >= 0);
128 Set add_Set (SetType st, Set s, int n)
133 while (p->next && p->next->value < n)
136 if (!(p->next && p->next->value == n))
138 new = mk_SetElement (st, n);
145 Set union_Set (SetType st, Set s1, Set s2)
151 for (p = &dummy; s1 && s2;)
152 if (s1->value < s2->value)
157 else if (s1->value > s2->value)
159 p = p->next = mk_SetElement (st, s2->value);
174 p = p->next = mk_SetElement (st, s2->value);
182 Set cp_Set (SetType st, Set s)
184 return merge_Set (st, s, NULL);
187 Set merge_Set (SetType st, Set s1, Set s2)
192 for (p = &dummy; s1 && s2; p = p->next)
193 if (s1->value < s2->value)
195 p->next = mk_SetElement (st, s1->value);
198 else if (s1->value > s2->value)
200 p->next = mk_SetElement (st, s2->value);
205 p->next = mk_SetElement (st, s1->value);
213 p = p->next = mk_SetElement (st, s1->value);
220 void pr_Set (SetType st, Set s)
225 printf (" %d", s->value);
231 unsigned hash_Set (SetType st, Set s)
242 int eq_Set (SetType st, Set s1, Set s2)
244 for (; s1 && s2; s1=s1->next, s2=s2->next)
245 if (s1->value != s2->value)