Moved the interpreter
[repair.git] / Repair / RepairInterpreter / tmodel.cc
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include "tmodel.h"
4 #include "processabstract.h"
5 #include "element.h"
6 #include "model.h"
7 #include "Hashtable.h"
8 #include "common.h"
9
10
11 void structure::print() {
12   printf("\nBEGIN structure:\n");
13   printf("   name=%s\n", name);
14   printf("   type=%d\n", type);
15   
16   if (subtype == NULL)
17     printf("   subtype=null\n");
18   else subtype->print();
19
20   for (int i=0; i<getnumfields(); i++)
21     getfield(i)->print();
22
23   for (int i=0; i<getnumlabels(); i++)
24     getlabel(i)->print();
25   
26   printf("END structure\n\n");
27 }
28
29 void ttype::print() {
30   printf("\nBEGIN ttype\n");
31   printf("   ttype: primtype=%ld, intlength=%ld, type=%s\n", primtype, intlength, type);
32   printf("END ttype\n\n");
33 }
34
35 /*void tparam::print() {
36   }*/
37
38 void tlabel::print() {
39   printf("\nBEGIN tlabel\n");
40   printf("   field=%s\n", field);
41   specifictype->print();
42   printf("END tlabel\n\n");
43 }
44
45 void tfield::print() {
46   printf("\nBEGIN tfield\n");
47   printf("   name=\%s\n", name);
48   type->print();
49   printf("END tfield\n\n");
50 }
51
52 AElementexpr * ttype::getsize() {
53   return asize;
54 }
55
56
57 int ttype::getbytes(bitreader *br,model *m,Hashtable *env) {
58   int basesizeval=basesize(br,m,env);
59   int mult=1;
60   if (asize!=NULL) {
61     Element * number=evaluateexpr(m,asize,env,true,false);
62     mult=number->intvalue();
63     delete(number);
64   }
65   if (gettype()==TTYPE_BIT) {
66     return ((mult-1)/8)+1;
67   }
68   return mult*basesizeval;
69 }
70
71 int ttype::basesize(bitreader *br,model *m,Hashtable *env) {
72   if ((primtype/TTYPE_PTR)>0)
73     return pointersize;
74   if (gettype()==TTYPE_INT)
75     return intsize;
76   if (gettype()==TTYPE_SHORT)
77     return shortsize;
78   if (gettype()==TTYPE_BYTE)
79     return 1;
80   if (gettype()==TTYPE_BIT)
81     return 0;
82   if (gettype()==TTYPE_STRUCT) {
83     /*    Element **earray=new Element *[numparamvalues];
84           for(int i=0;i<numparamvalues;i++) {
85           earray[i]=evaluateexpr(br,paramvalues[i],env);
86           }*/
87     structure *st=m->getstructure(type);
88     int size=st->getsize(br,m,env);
89     /*    for(int i=0;i<numparamvalues;i++)
90           delete(earray[i]);
91           delete earray;*/
92     return size;
93   }
94 }
95
96 int structure::getsize(bitreader *br,model *m, Hashtable *env) {
97   int totalsize=0;
98   /* build parameter mapping */
99   /*  for(int i=0;i<getnumparams();i++) {
100     env->put(getparam(i)->getname(),earray[i]);
101     }*/
102   /* loop through fields */
103   if (getsubtype()!=NULL) {
104     return getsubtype()->getbytes(br, m,env);
105   }
106   for(int j=0;j<getnumfields();j++)
107     totalsize+=getfield(j)->gettype()->getbytes(br,m,env);
108   //delete(env);
109   return totalsize;
110 }
111 char * tlabel::getname() {
112   return specifictype->getname();
113 }
114 ttype * tlabel::gettype() {
115   return specifictype->gettype();
116 }
117
118 structure::structure(char *nam) {
119   subtype=NULL;
120   name=nam;
121 }
122
123 void structure::settype(int t) {
124   type=t;
125 }
126
127 /*void structure::setparams(tparam **tp,int n) {
128   params=tp;numparams=n;
129   }*/
130
131 void structure::setsubtype(ttype *sub) {
132   subtype=sub;
133 }
134
135 ttype * structure::getsubtype() {
136   return subtype;
137 }
138
139 void structure::setfields(tfield **fieldarray, int n) {
140   fields=fieldarray;
141   numfields=n;
142 }
143
144 void structure::setlabels(tlabel **lab,int n) {
145   labels=lab;
146   numlabels=n;
147 }
148
149 /*int structure::getnumparams() {
150   return numparams;
151   }*/
152
153 /*tparam * structure::getparam(int i) {
154   return params[i];
155   }*/
156
157 int structure::getnumlabels() {
158   return numlabels;
159 }
160
161 tlabel * structure::getlabel(int i) {
162   return labels[i];
163 }
164
165 int structure::getnumfields() {
166   return numfields;
167 }
168
169 tfield * structure::getfield(int i) {
170   return fields[i];
171 }
172
173 char * structure::getname() {
174   return name;
175 }
176
177 ttype::ttype(int typ) {
178   primtype=typ;
179   intlength=0;
180   type=NULL;
181   //  paramvalues=NULL;
182   //numparamvalues=0;
183   asize=NULL;
184 }
185
186 ttype::ttype(char *t) {
187   primtype=TTYPE_STRUCT;
188   type=t;
189   intlength=0;
190   //paramvalues=NULL;
191   //numparamvalues=0;
192   asize=NULL;
193 }
194
195 ttype::ttype(char *t, AElementexpr *size) {
196   primtype=TTYPE_STRUCT;
197   type=t;
198   intlength=0;
199   //paramvalues=param;
200   //numparamvalues=numparam;
201   asize=size;
202 }
203
204 ttype::ttype(int type, AElementexpr * size) {
205   primtype=type;
206   intlength=0;
207   this->type=NULL;
208   //paramvalues=NULL;
209   //numparamvalues=0;
210   asize=size;
211 }
212
213 void ttype::makeptr() {
214   primtype+=TTYPE_PTR;
215 }
216  
217 void ttype::setsize(AElementexpr *size) {
218   asize=size;
219 }
220
221 bool ttype::isptr() {
222   if (numderef()>0)
223     return true;
224   else
225     return false;
226 }
227
228 int ttype::numderef() {
229   return primtype/TTYPE_PTR;
230 }
231
232 int ttype::gettype() {
233   return primtype%TTYPE_PTR;
234 }
235  
236 /*int ttype::getnumparamvalues() {
237   return numparamvalues;
238 }
239
240 AElementexpr * ttype::getparamvalues(int i) {
241   return paramvalues[i];
242   }*/
243  
244 char * ttype::getname() {
245   return type;
246 }
247
248 /*tparam::tparam(ttype *t,char * n) {
249   type=t;name=n;
250   }
251   char * tparam::getname() {
252   return name;
253   }
254 */
255 tlabel::tlabel(tfield *f, char *fld,AElementexpr *a) {
256   index=a;
257   field=fld;
258   specifictype=f;
259 }
260
261 char *tlabel::getfield() {
262   return field;
263 }
264  
265 AElementexpr * tlabel::getindex() {
266   return index;
267 }
268
269 tfield::tfield(ttype *tt, char *n) {
270   type=tt;name=n;
271 }
272
273 ttype * tfield::gettype() {
274   return type;
275 }
276
277 char * tfield::getname() {
278   return name;
279 }