1 // Interface for writing structures
12 #include "processabstract.h"
15 bitwriter::bitwriter(model *m, Hashtable *e) {
17 bitread=new bitreader(m,e);
21 void bitwriter::writefieldorarray(Element *element, Field * field, Element * index, Element *target) {
22 assert(element->type()==ELEMENT_OBJECT);
37 // Hashtable *env=new Hashtable((int (*)(void *)) & hashstring,(int (*)(void *,void *)) &equivalentstrings);;
38 structure *type=element->getstructure();
39 //assert(type->getnumparams()==element->getnumparams());
41 /* build parameter mapping */
42 /* for(int i=0;i<type->getnumparams();i++) {
43 env->put(type->getparam(i)->getname(),element->paramvalue(i));
45 char *fieldname=field->field();
46 ttype *typeoffield=NULL;
47 AElementexpr *lindex=NULL;
48 for(int i=0;i<type->getnumlabels();i++) {
49 if (equivalentstrings(type->getlabel(i)->getname(),fieldname)) {
50 /* got label not field... */
51 typeoffield=type->getlabel(i)->gettype();
52 fieldname=type->getlabel(i)->getfield();
53 lindex=type->getlabel(i)->getindex();
59 for(int i=0;i<type->getnumfields();i++) {
60 if(equivalentstrings(type->getfield(i)->getname(), fieldname)) {
62 if (typeoffield==NULL)
63 typeoffield=type->getfield(i)->gettype();
66 offset+=type->getfield(i)->gettype()->getbytes(bitread,globalmodel,env);
69 if (index!=NULL||lindex!=NULL) {
71 index=evaluateexpr(globalmodel,lindex,env,true,true);
72 if(typeoffield->gettype()==TTYPE_BIT) {
73 offset+=(index->intvalue())/8;
74 bitoffset=(index->intvalue())%8;
76 int size=typeoffield->basesize(bitread,globalmodel,env);
77 offset+=size*index->intvalue();
82 void *addr=(void *)(((char *) element->getobject())+offset);
84 if (typeoffield->isptr())
85 addr=*((void **)addr);
86 switch(typeoffield->gettype()) {
89 *((int *) addr)=target->intvalue();
94 *((short *) addr)=target->getshortvalue();
99 char c=*((char *) addr);
101 bool b=target->getboolvalue();
102 char mask=0xFF^(1<<bitoffset);
104 c=(c&mask)|(1<<bitoffset);
110 printf("Change: %hhd %hhd\n",co,c);
116 *((char *)addr)=target->getbytevalue();
121 assert(typeoffield->isptr());
122 *((void **)(((char *) element->getobject())+offset))=target->getobject();