2 * Copyright (C) 1994, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.1 1994-09-26 10:16:57 adam
8 * First version of dfa module in alex. This version uses yacc to parse
9 * regular expressions. This should be hand-made instead.
23 static void rm_SetElement (SetType st, SetElement *p);
24 static Set mk_SetElement (SetType st, int n);
26 SetType mk_SetType (int chunk)
30 assert( chunk > 8 && chunk < 8000 );
32 st = (SetType) imalloc( sizeof(*st) );
35 st->alloclist = st->freelist = NULL;
41 int inf_SetType (SetType st, long *used, long *allocated)
47 for( s = st->alloclist; s; s = s->next )
48 *allocated += st->chunk;
49 return sizeof( SetElement );
52 SetType rm_SetType (SetType st)
55 for( s = st->alloclist; (s1 = s); )
64 Set mk_Set (SetType st)
70 static Set mk_SetElement (SetType st, int n)
76 assert( st->chunk > 8 );
79 s = (Set) imalloc( sizeof(*s) * (1+st->chunk) );
81 s->next = st->alloclist;
84 for( i=st->chunk; --i > 0; s++ )
90 st->freelist = s->next;
95 static void rm_SetElement (SetType st, SetElement *p)
98 assert( st->used > 0 );
99 p->next = st->freelist;
104 Set rm_Set (SetType st, Set s)
116 s->next = st->freelist;
119 assert( st->used >= 0 );
124 Set add_Set (SetType st, Set s, int n)
129 while( p->next && p->next->value < n )
132 if( !(p->next && p->next->value == n ) )
134 new = mk_SetElement( st, n );
141 Set union_Set (SetType st, Set s1, Set s2)
147 for( p = &dummy; s1 && s2; )
148 if( s1->value < s2->value )
153 else if( s1->value > s2->value )
155 p = p->next = mk_SetElement( st, s2->value );
170 p = p->next = mk_SetElement( st, s2->value );
178 Set cp_Set (SetType st, Set s)
180 return merge_Set( st, s, NULL );
183 Set merge_Set (SetType st, Set s1, Set s2)
188 for( p = &dummy; s1 && s2; p = p->next )
189 if( s1->value < s2->value )
191 p->next = mk_SetElement( st, s1->value );
194 else if( s1->value > s2->value )
196 p->next = mk_SetElement( st, s2->value );
201 p->next = mk_SetElement( st, s1->value );
209 p = p->next = mk_SetElement( st, s1->value );
216 void pr_Set (SetType st, Set s)
221 printf( " %d", s->value );
227 unsigned hash_Set (SetType st, Set s)
238 int eq_Set (SetType st, Set s1, Set s2)
240 for( ; s1 && s2; s1=s1->next, s2=s2->next )
241 if( s1->value != s2->value )