2 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
3 * See the copyright notice in the ACK home directory, in the file "Copyright".
6 static char rcsid[]= "$Id: set.c,v 0.5 1994/06/24 10:38:14 ceriel Exp $";
18 extern set_t l_sets[];
20 setlookup(s) set_t s; {
25 for(p=l_sets;p<&l_sets[nsets];p++) {
26 if (p->set_size != s.set_size)
28 for (i=0;i<SETSIZE;i++)
29 if (p->set_val[i] != s.set_val[i])
34 setno = NEXT(nsets,MAXSETS,"Sets");
43 for(i=0;i<SETSIZE;i++)
45 for(i=0;i<nregs+ntokens;i++)
48 allsetno = setlookup(s);
49 n_set("ALL",allsetno);
54 set_t ident_to_set(name) char *name; {
55 register symbol *sy_p;
57 register struct propinfo *pp;
61 sy_p = lookup(name,symany,mustexist);
62 switch(sy_p->sy_type) {
64 error("%s is wrong kind of symbol",name);
67 pp = &l_props[sy_p->sy_value.syv_propno];
68 result.set_size = pp->pr_size;
69 for (i=0;i<SZOFSET(MAXREGS);i++)
70 result.set_val[i] = pp->pr_regset[i];
71 BIS(result.set_val,0);
73 result.set_val[i] = 0;
76 bitno = sy_p->sy_value.syv_tokno+nregs;
77 for (i=0;i<SETSIZE;i++)
78 result.set_val[i] = 0;
79 BIS(result.set_val,bitno);
80 result.set_size = l_tokens[sy_p->sy_value.syv_tokno]->tk_size;
83 return(l_sets[sy_p->sy_value.syv_setno]);
93 register int size = -1;
96 for (i = 1; i <= nregs; i++) {
97 if (BIT(s->set_val, i)) {
98 register int sz = l_regs[i].ri_size;
100 if (size == -1) size = sz;
101 else if (size != sz) return;
104 for (i = 1; i <= ntokens; i++) {
105 if (BIT(s->set_val, i+nregs)) {
106 register int sz = l_tokens[i]->tk_size;
107 if (size == -1) size = sz;
108 else if (size != sz) return;
111 if (size != -1) s->set_size = size;
114 set_t setproduct(s1,s2) set_t s1,s2; {
118 for(i=0;i<SETSIZE;i++)
119 result.set_val[i] = s1.set_val[i] & s2.set_val[i];
124 set_t setsum(s1,s2) set_t s1,s2; {
128 if (s1.set_size == s2.set_size)
129 result.set_size = s1.set_size;
132 for(i=0;i<SETSIZE;i++)
133 result.set_val[i] = s1.set_val[i] | s2.set_val[i];
137 set_t setdiff(s1,s2) set_t s1,s2; {
141 for(i=0;i<SETSIZE;i++)
142 result.set_val[i] = s1.set_val[i] & ~ s2.set_val[i];
143 /* make sure that we don't loose the lowest bit of the set, which
144 indicates that it contains registers
146 for (i=1;i <= nregs; i++) {
147 if (BIT(result.set_val, i)) {
148 BIS(result.set_val,0);