/* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #ifndef NORCSID static char rcsid[]= "$Id$"; #endif #include "param.h" #include "property.h" #include "set.h" #include "token.h" #include "lookup.h" #include "reg.h" #include #include "extern.h" extern set_t l_sets[]; setlookup(s) set_t s; { register set_p p; register i; int setno; for(p=l_sets;p<&l_sets[nsets];p++) { if (p->set_size != s.set_size) continue; for (i=0;iset_val[i] != s.set_val[i]) goto cont; return(p-l_sets); cont:; } setno = NEXT(nsets,MAXSETS,"Sets"); l_sets[setno] = s; return(setno); } make_std_sets() { set_t s; register i; for(i=0;isy_type) { default: error("%s is wrong kind of symbol",name); return(emptyset); case symprop: pp = &l_props[sy_p->sy_value.syv_propno]; result.set_size = pp->pr_size; for (i=0;ipr_regset[i]; BIS(result.set_val,0); for (;isy_value.syv_tokno+nregs; for (i=0;isy_value.syv_tokno]->tk_size; break; case symset: return(l_sets[sy_p->sy_value.syv_setno]); } return(result); } static checksize(s) register set_p s; { register int i; register int size = -1; s->set_size = 0; for (i = 1; i <= nregs; i++) { if (BIT(s->set_val, i)) { register int sz = l_regs[i].ri_size; if (size == -1) size = sz; else if (size != sz) return; } } for (i = 1; i <= ntokens; i++) { if (BIT(s->set_val, i+nregs)) { register int sz = l_tokens[i]->tk_size; if (size == -1) size = sz; else if (size != sz) return; } } if (size != -1) s->set_size = size; } set_t setproduct(s1,s2) set_t s1,s2; { set_t result; register i; for(i=0;i