1 // Interface for reading structures
10 #include "processabstract.h"
12 bitreader::bitreader(model *m, Hashtable *e) {
17 Element * bitreader::readfieldorarray(Element *element, Field * field, Element * index) {
18 assert(element->type()==ELEMENT_OBJECT);
19 // Hashtable *env=new Hashtable((int (*)(void *)) & hashstring,(int (*)(void *,void *)) &equivalentstrings);;
20 if (element->getobject()==NULL)
22 structure *type=element->getstructure();
23 // assert(type->getnumparams()==element->getnumparams());
24 /* build parameter mapping */
25 /* for(int i=0;i<type->getnumparams();i++) {
26 env->put(type->getparam(i)->getname(),element->paramvalue(i));
28 char *fieldname=field->field();
29 ttype *typeoffield=NULL;
30 AElementexpr *lindex=NULL;
31 for(int i=0;i<type->getnumlabels();i++) {
32 if (equivalentstrings(type->getlabel(i)->getname(),fieldname)) {
33 /* got label not field... */
34 typeoffield=type->getlabel(i)->gettype();
35 fieldname=type->getlabel(i)->getfield();
36 lindex=type->getlabel(i)->getindex();
42 for(int i=0;i<type->getnumfields();i++) {
43 if(equivalentstrings(type->getfield(i)->getname(), fieldname)) {
45 if (typeoffield==NULL)
46 typeoffield=type->getfield(i)->gettype();
49 offset+=type->getfield(i)->gettype()->getbytes(this,globalmodel,env);
52 if (index!=NULL||lindex!=NULL) {
54 index=evaluateexpr(globalmodel,lindex,env,true,true);
55 if(typeoffield->gettype()==TTYPE_BIT) {
56 offset+=(index->intvalue())/8;
57 bitoffset=(index->intvalue())%8;
59 if (index->intvalue()!=0) {
60 /* Don't want to force computation of basesize unless we really need to...
61 we'd like to handle the filesystem example...:) */
62 int size=typeoffield->basesize(this,globalmodel,env);
63 offset+=size*index->intvalue();
70 void *addr=(void *)(((char *) element->getobject())+offset);
71 if (typeoffield->isptr())
72 addr=*((void **)addr);
73 switch(typeoffield->gettype()) {
76 int i=*((int *) addr);
82 short i=*((short *) addr);
88 char c=*((char *) addr);
89 ele=new Element((bool)((c&(1<<bitoffset))!=0));
94 char c=*((char *)addr);
100 /* Element **earray=new Element *[typeoffield->getnumparamvalues()];
101 for(int i=0;i<typeoffield->getnumparamvalues();i++) {
102 earray[i]=evaluateexpr(this,typeoffield->getparamvalues(i),env);
104 ele=new Element(addr,globalmodel->getstructure(typeoffield->getname()));