set.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #ifndef NORCSID
  2. static char rcsid[]= "$Header$";
  3. #endif
  4. #include "param.h"
  5. #include "property.h"
  6. #include "set.h"
  7. #include "token.h"
  8. #include "lookup.h"
  9. #include <cgg_cg.h>
  10. #include "extern.h"
  11. extern set_t l_sets[];
  12. setlookup(s) set_t s; {
  13. register set_p p;
  14. register i;
  15. int setno;
  16. for(p=l_sets;p<&l_sets[nsets];p++) {
  17. if (p->set_size != s.set_size)
  18. continue;
  19. for (i=0;i<SETSIZE;i++)
  20. if (p->set_val[i] != s.set_val[i])
  21. goto cont;
  22. return(p-l_sets);
  23. cont:;
  24. }
  25. setno = NEXT(nsets,MAXSETS,"Sets");
  26. l_sets[setno] = s;
  27. return(setno);
  28. }
  29. make_std_sets() {
  30. set_t s;
  31. register i;
  32. for(i=0;i<SETSIZE;i++)
  33. s.set_val[i]=0;
  34. for(i=0;i<nregs+ntokens;i++)
  35. BIS(s.set_val,i);
  36. s.set_size = 0;
  37. allsetno = setlookup(s);
  38. n_set("ALL",allsetno);
  39. }
  40. set_t emptyset;
  41. set_t ident_to_set(name) char *name; {
  42. register symbol *sy_p;
  43. register i;
  44. register struct propinfo *pp;
  45. int bitno;
  46. set_t result;
  47. sy_p = lookup(name,symany,mustexist);
  48. switch(sy_p->sy_type) {
  49. default:
  50. error("%s is wrong kind of symbol",name);
  51. return(emptyset);
  52. case symprop:
  53. pp = &l_props[sy_p->sy_value.syv_propno];
  54. result.set_size = pp->pr_size;
  55. for (i=0;i<SZOFSET(MAXREGS);i++)
  56. result.set_val[i] = pp->pr_regset[i];
  57. BIS(result.set_val,0);
  58. for (;i<SETSIZE;i++)
  59. result.set_val[i] = 0;
  60. break;
  61. case symtok:
  62. bitno = sy_p->sy_value.syv_tokno+nregs;
  63. for (i=0;i<SETSIZE;i++)
  64. result.set_val[i] = 0;
  65. BIS(result.set_val,bitno);
  66. result.set_size = l_tokens[sy_p->sy_value.syv_tokno]->tk_size;
  67. break;
  68. case symset:
  69. return(l_sets[sy_p->sy_value.syv_setno]);
  70. }
  71. return(result);
  72. }
  73. set_t setproduct(s1,s2) set_t s1,s2; {
  74. set_t result;
  75. register i;
  76. if ((result.set_size=s1.set_size)==0)
  77. result.set_size = s2.set_size;
  78. for(i=0;i<SETSIZE;i++)
  79. result.set_val[i] = s1.set_val[i] & s2.set_val[i];
  80. return(result);
  81. }
  82. set_t setsum(s1,s2) set_t s1,s2; {
  83. set_t result;
  84. register i;
  85. if (s1.set_size == s2.set_size)
  86. result.set_size = s1.set_size;
  87. else
  88. result.set_size = 0;
  89. for(i=0;i<SETSIZE;i++)
  90. result.set_val[i] = s1.set_val[i] | s2.set_val[i];
  91. return(result);
  92. }
  93. set_t setdiff(s1,s2) set_t s1,s2; {
  94. set_t result;
  95. register i;
  96. if (s1.set_size == s2.set_size)
  97. result.set_size = s1.set_size;
  98. else
  99. result.set_size = 0;
  100. for(i=0;i<SETSIZE;i++)
  101. result.set_val[i] = s1.set_val[i] & ~ s2.set_val[i];
  102. return(result);
  103. }