cs_entity.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /* $Id$ */
  2. /*
  3. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  4. * See the copyright notice in the ACK home directory, in the file "Copyright".
  5. */
  6. /* F U N C T I O N S F O R A C C E S S I N G T H E S E T
  7. *
  8. * O F E N T I T I E S
  9. */
  10. #include "../share/types.h"
  11. #include "../share/global.h"
  12. #include "../share/lset.h"
  13. #include "../share/debug.h"
  14. #include "cs.h"
  15. #include "cs_alloc.h"
  16. #include "cs_aux.h"
  17. lset entities; /* Our pseudo symbol-table. */
  18. entity_p find_entity(vn)
  19. valnum vn;
  20. {
  21. /* Try to find the entity with valuenumber vn. */
  22. register Lindex i;
  23. for (i = Lfirst(entities); i != (Lindex) 0; i = Lnext(i, entities)) {
  24. if (en_elem(i)->en_vn == vn)
  25. return en_elem(i);
  26. }
  27. return (entity_p) 0;
  28. }
  29. STATIC bool same_entity(enp1, enp2)
  30. entity_p enp1, enp2;
  31. {
  32. if (enp1->en_kind != enp2->en_kind) return FALSE;
  33. if (enp1->en_size != enp2->en_size) return FALSE;
  34. if (enp1->en_size == UNKNOWN_SIZE) return FALSE;
  35. switch (enp1->en_kind) {
  36. case ENCONST:
  37. return enp1->en_val == enp2->en_val;
  38. case ENLOCAL:
  39. case ENALOCAL:
  40. return enp1->en_loc == enp2->en_loc;
  41. case ENEXTERNAL:
  42. case ENAEXTERNAL:
  43. return enp1->en_ext == enp2->en_ext;
  44. case ENINDIR:
  45. return enp1->en_ind == enp2->en_ind;
  46. case ENOFFSETTED:
  47. case ENAOFFSETTED:
  48. return enp1->en_base == enp2->en_base &&
  49. enp1->en_off == enp2->en_off;
  50. case ENALOCBASE:
  51. case ENAARGBASE:
  52. return enp1->en_levels == enp2->en_levels;
  53. case ENPROC:
  54. return enp1->en_pro == enp2->en_pro;
  55. case ENARRELEM:
  56. return enp1->en_arbase == enp2->en_arbase &&
  57. enp1->en_index == enp2->en_index &&
  58. enp1->en_adesc == enp2->en_adesc;
  59. default:
  60. return TRUE;
  61. }
  62. }
  63. STATIC copy_entity(src, dst)
  64. entity_p src, dst;
  65. {
  66. dst->en_static = src->en_static;
  67. dst->en_kind = src->en_kind;
  68. dst->en_size = src->en_size;
  69. switch (src->en_kind) {
  70. case ENCONST:
  71. dst->en_val = src->en_val;
  72. break;
  73. case ENLOCAL:
  74. case ENALOCAL:
  75. dst->en_loc = src->en_loc;
  76. break;
  77. case ENEXTERNAL:
  78. case ENAEXTERNAL:
  79. dst->en_ext = src->en_ext;
  80. break;
  81. case ENINDIR:
  82. dst->en_ind = src->en_ind;
  83. break;
  84. case ENOFFSETTED:
  85. case ENAOFFSETTED:
  86. dst->en_base = src->en_base;
  87. dst->en_off = src->en_off;
  88. break;
  89. case ENALOCBASE:
  90. case ENAARGBASE:
  91. dst->en_levels = src->en_levels;
  92. break;
  93. case ENPROC:
  94. dst->en_pro = src->en_pro;
  95. break;
  96. case ENARRELEM:
  97. dst->en_arbase = src->en_arbase;
  98. dst->en_index = src->en_index;
  99. dst->en_adesc = src->en_adesc;
  100. break;
  101. }
  102. }
  103. entity_p en_enter(enp)
  104. register entity_p enp;
  105. {
  106. /* Put the entity in enp in the entity set, if it is not already there.
  107. * Return pointer to stored entity.
  108. */
  109. register Lindex i;
  110. register entity_p new;
  111. for (i = Lfirst(entities); i != (Lindex) 0; i = Lnext(i, entities)) {
  112. if (same_entity(en_elem(i), enp))
  113. return en_elem(i);
  114. }
  115. /* A new entity. */
  116. new = newentity();
  117. new->en_vn = newvalnum();
  118. copy_entity(enp, new);
  119. Ladd(new, &entities);
  120. return new;
  121. }
  122. clr_entities()
  123. {
  124. /* Throw away all pseudo-symboltable information. */
  125. register Lindex i;
  126. for (i = Lfirst(entities); i != (Lindex) 0; i = Lnext(i, entities)) {
  127. oldentity(en_elem(i));
  128. }
  129. Ldeleteset(entities);
  130. entities = Lempty_set();
  131. }