cs_entity.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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(valnum vn)
  19. {
  20. /* Try to find the entity with valuenumber vn. */
  21. Lindex i;
  22. for (i = Lfirst(entities); i != (Lindex) 0; i = Lnext(i, entities)) {
  23. if (en_elem(i)->en_vn == vn)
  24. return en_elem(i);
  25. }
  26. return (entity_p) 0;
  27. }
  28. static bool same_entity(entity_p enp1, entity_p enp2)
  29. {
  30. if (enp1->en_kind != enp2->en_kind) return FALSE;
  31. if (enp1->en_size != enp2->en_size) return FALSE;
  32. if (enp1->en_size == UNKNOWN_SIZE) return FALSE;
  33. switch (enp1->en_kind) {
  34. case ENCONST:
  35. return enp1->en_val == enp2->en_val;
  36. case ENLOCAL:
  37. case ENALOCAL:
  38. return enp1->en_loc == enp2->en_loc;
  39. case ENEXTERNAL:
  40. case ENAEXTERNAL:
  41. return enp1->en_ext == enp2->en_ext;
  42. case ENINDIR:
  43. return enp1->en_ind == enp2->en_ind;
  44. case ENOFFSETTED:
  45. case ENAOFFSETTED:
  46. return enp1->en_base == enp2->en_base &&
  47. enp1->en_off == enp2->en_off;
  48. case ENALOCBASE:
  49. case ENAARGBASE:
  50. return enp1->en_levels == enp2->en_levels;
  51. case ENPROC:
  52. return enp1->en_pro == enp2->en_pro;
  53. case ENARRELEM:
  54. return enp1->en_arbase == enp2->en_arbase &&
  55. enp1->en_index == enp2->en_index &&
  56. enp1->en_adesc == enp2->en_adesc;
  57. default:
  58. return TRUE;
  59. }
  60. }
  61. static void copy_entity(entity_p src, entity_p dst)
  62. {
  63. dst->en_static = src->en_static;
  64. dst->en_kind = src->en_kind;
  65. dst->en_size = src->en_size;
  66. switch (src->en_kind) {
  67. case ENCONST:
  68. dst->en_val = src->en_val;
  69. break;
  70. case ENLOCAL:
  71. case ENALOCAL:
  72. dst->en_loc = src->en_loc;
  73. break;
  74. case ENEXTERNAL:
  75. case ENAEXTERNAL:
  76. dst->en_ext = src->en_ext;
  77. break;
  78. case ENINDIR:
  79. dst->en_ind = src->en_ind;
  80. break;
  81. case ENOFFSETTED:
  82. case ENAOFFSETTED:
  83. dst->en_base = src->en_base;
  84. dst->en_off = src->en_off;
  85. break;
  86. case ENALOCBASE:
  87. case ENAARGBASE:
  88. dst->en_levels = src->en_levels;
  89. break;
  90. case ENPROC:
  91. dst->en_pro = src->en_pro;
  92. break;
  93. case ENARRELEM:
  94. dst->en_arbase = src->en_arbase;
  95. dst->en_index = src->en_index;
  96. dst->en_adesc = src->en_adesc;
  97. break;
  98. }
  99. }
  100. entity_p en_enter(entity_p enp)
  101. {
  102. /* Put the entity in enp in the entity set, if it is not already there.
  103. * Return pointer to stored entity.
  104. */
  105. Lindex i;
  106. entity_p new;
  107. for (i = Lfirst(entities); i != (Lindex) 0; i = Lnext(i, entities)) {
  108. if (same_entity(en_elem(i), enp))
  109. return en_elem(i);
  110. }
  111. /* A new entity. */
  112. new = newentity();
  113. new->en_vn = newvalnum();
  114. copy_entity(enp, new);
  115. Ladd(new, &entities);
  116. return new;
  117. }
  118. void clr_entities()
  119. {
  120. /* Throw away all pseudo-symboltable information. */
  121. Lindex i;
  122. for (i = Lfirst(entities); i != (Lindex) 0; i = Lnext(i, entities)) {
  123. oldentity(en_elem(i));
  124. }
  125. Ldeleteset(entities);
  126. entities = Lempty_set();
  127. }