Pristine Ack-5.5
[Ack-5.5.git] / util / ego / cs / cs_entity.c
1 /* $Id: cs_entity.c,v 1.4 1994/06/24 10:22:15 ceriel Exp $ */
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
11 #include "../share/types.h"
12 #include "../share/global.h"
13 #include "../share/lset.h"
14 #include "../share/debug.h"
15 #include "cs.h"
16 #include "cs_alloc.h"
17 #include "cs_aux.h"
18
19 lset entities; /* Our pseudo symbol-table. */
20
21 entity_p find_entity(vn)
22         valnum vn;
23 {
24         /* Try to find the entity with valuenumber vn. */
25
26         register Lindex i; 
27
28         for (i = Lfirst(entities); i != (Lindex) 0; i = Lnext(i, entities)) {
29                 if (en_elem(i)->en_vn == vn)
30                         return en_elem(i);
31         }
32
33         return (entity_p) 0;
34 }
35
36 STATIC bool same_entity(enp1, enp2)
37         entity_p enp1, enp2;
38 {
39         if (enp1->en_kind != enp2->en_kind) return FALSE;
40         if (enp1->en_size != enp2->en_size) return FALSE;
41         if (enp1->en_size == UNKNOWN_SIZE) return FALSE;
42
43         switch (enp1->en_kind) {
44                 case ENCONST:
45                         return  enp1->en_val == enp2->en_val;
46                 case ENLOCAL:
47                 case ENALOCAL:
48                         return  enp1->en_loc == enp2->en_loc;
49                 case ENEXTERNAL:
50                 case ENAEXTERNAL:
51                         return  enp1->en_ext == enp2->en_ext;
52                 case ENINDIR:
53                         return  enp1->en_ind == enp2->en_ind;
54                 case ENOFFSETTED:
55                 case ENAOFFSETTED:
56                         return  enp1->en_base == enp2->en_base &&
57                                 enp1->en_off == enp2->en_off;
58                 case ENALOCBASE:
59                 case ENAARGBASE:
60                         return  enp1->en_levels == enp2->en_levels;
61                 case ENPROC:
62                         return  enp1->en_pro == enp2->en_pro;
63                 case ENARRELEM:
64                         return  enp1->en_arbase == enp2->en_arbase &&
65                                 enp1->en_index == enp2->en_index &&
66                                 enp1->en_adesc == enp2->en_adesc;
67                 default:
68                         return  TRUE;
69         }
70 }
71
72 STATIC copy_entity(src, dst)
73         entity_p src, dst;
74 {
75         dst->en_static = src->en_static;
76         dst->en_kind = src->en_kind;
77         dst->en_size = src->en_size;
78
79         switch (src->en_kind) {
80                 case ENCONST:
81                         dst->en_val = src->en_val;
82                         break;
83                 case ENLOCAL:
84                 case ENALOCAL:
85                         dst->en_loc = src->en_loc;
86                         break;
87                 case ENEXTERNAL:
88                 case ENAEXTERNAL:
89                         dst->en_ext = src->en_ext;
90                         break;
91                 case ENINDIR:
92                         dst->en_ind = src->en_ind;
93                         break;
94                 case ENOFFSETTED:
95                 case ENAOFFSETTED:
96                         dst->en_base = src->en_base;
97                         dst->en_off = src->en_off;
98                         break;
99                 case ENALOCBASE:
100                 case ENAARGBASE:
101                         dst->en_levels = src->en_levels;
102                         break;
103                 case ENPROC:
104                         dst->en_pro = src->en_pro;
105                         break;
106                 case ENARRELEM:
107                         dst->en_arbase = src->en_arbase;
108                         dst->en_index = src->en_index;
109                         dst->en_adesc = src->en_adesc;
110                         break;
111         }
112 }
113
114 entity_p en_enter(enp)
115         register entity_p enp;
116 {
117         /* Put the entity in enp in the entity set, if it is not already there.
118          * Return pointer to stored entity.
119          */
120         register Lindex i;
121         register entity_p new;
122
123         for (i = Lfirst(entities); i != (Lindex) 0; i = Lnext(i, entities)) {
124                 if (same_entity(en_elem(i), enp))
125                         return en_elem(i);
126         }
127         /* A new entity. */
128         new = newentity();
129         new->en_vn = newvalnum();
130         copy_entity(enp, new);
131         Ladd(new, &entities);
132
133         return new;
134 }
135
136 clr_entities()
137 {
138         /* Throw away all pseudo-symboltable information. */
139
140         register Lindex i;
141
142         for (i = Lfirst(entities); i != (Lindex) 0; i = Lnext(i, entities)) {
143                 oldentity(en_elem(i));
144         }
145         Ldeleteset(entities);
146         entities = Lempty_set();
147 }