Changeset 326 for cpp/frams/param/paramobj.cpp
- Timestamp:
- 02/06/15 00:15:08 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
cpp/frams/param/paramobj.cpp
r286 r326 7 7 #include <common/nonstd_stl.h> 8 8 9 static const char* maybedup(bool dup,const char* src) 10 { return dup ? (src?strdup(src):0) : src; } 9 static const char* maybedup(bool dup, const char* src) 10 { 11 return dup ? (src ? strdup(src) : 0) : src; 12 } 11 13 static void maybefree(void* mem) 12 { if (mem) free(mem); } 13 14 ParamEntry* ParamObject::makeParamTab(ParamInterface *pi,bool stripgroups,bool stripproc, 15 int firstprop, int maxprops, bool dupentries, int flagsexclude) 16 { 17 ParamEntry *tab,*t; 18 int i,n,offs; 19 static ExtValue ex; 20 int count=0,gcount=1; 21 if (!stripgroups) gcount=pi->getGroupCount(); 22 if (stripproc||flagsexclude) 23 for (int i=firstprop;i < pi->getPropCount();i++) 24 { 25 const char*t=pi->type(i); 26 if ((!stripproc)||(strchr("dfsox",*t))) 27 if ((!flagsexclude)||(!(pi->flags(i)&flagsexclude))) 28 if (++count >= maxprops) break; 29 } 30 else count=pi->getPropCount()-firstprop; 31 t=tab=(ParamEntry*)malloc(sizeof(ParamEntry)*(count+gcount+1)); 32 t->group=(short)gcount; 33 t->flags=(short)count; 34 t->name=maybedup(dupentries,pi->getName()); 35 t->type=maybedup(dupentries,pi->getDescription()); 36 for(i=0;i<gcount;i++) 37 { 38 t->id=maybedup(dupentries,pi->grname(i)); 39 t->offset=0; 40 t++; 41 } 42 n=1; offs=1; 43 for (i=firstprop;i < pi->getPropCount();i++) 44 { 45 if ((!stripproc)||(strchr("dfsox",*pi->type(i)))) 14 { 15 if (mem) free(mem); 16 } 17 18 int ParamObject::firstFieldOffset() 19 { 20 static ParamObject dummy(0, NULL); 21 return ((char*)&dummy.fields[0]) - (char*)&dummy; 22 } 23 24 ParamEntry* ParamObject::makeParamTab(ParamInterface *pi, bool stripgroups, bool stripproc, 25 int firstprop, int maxprops, bool dupentries, int flagsexclude, bool addnew, const char* rename) 26 { 27 ParamEntry *tab, *t; 28 int i, n, offset; 29 static ExtValue ex; 30 int count = 0, gcount = 1; 31 if (!stripgroups) gcount = pi->getGroupCount(); 32 if (stripproc || flagsexclude) 33 for (int i = firstprop; i < pi->getPropCount(); i++) 46 34 { 47 if ((!flagsexclude)||(!(pi->flags(i)&flagsexclude))) 35 const char*t = pi->type(i); 36 if ((!stripproc) || (strchr("dfsox", *t))) 37 if ((!flagsexclude) || (!(pi->flags(i)&flagsexclude))) 38 if (++count >= maxprops) break; 39 } 40 else count = pi->getPropCount() - firstprop; 41 if (addnew) count++; 42 t = tab = (ParamEntry*)malloc(sizeof(ParamEntry)*(count + gcount + 1)); 43 t->group = (short)gcount; 44 t->flags = (short)count; 45 t->name = maybedup(dupentries, rename ? rename : pi->getName()); 46 t->type = maybedup(dupentries, pi->getDescription()); 47 for (i = 0; i < gcount; i++) 48 { 49 t->id = maybedup(dupentries, pi->grname(i)); 50 t->offset = 0; 51 t++; 52 } 53 n = 1; 54 offset = firstFieldOffset(); 55 if (addnew) 56 { 57 t->id = maybedup(dupentries, "new"); 58 t->name = maybedup(dupentries, "create new object"); 59 SString tmp = SString::sprintf("p o%s()", pi->getName()); 60 t->type = maybedup(dupentries, (const char*)tmp); 61 t->help = maybedup(dupentries, pi->help(i)); 62 t->flags = 0; 63 t->group = 0; 64 t->offset = PARAM_ILLEGAL_OFFSET; 65 t->fun1 = (void*)p_new; 66 t->fun2 = 0; 67 t++; 68 } 69 for (i = firstprop; i < pi->getPropCount(); i++) 70 { 71 if ((!stripproc) || (strchr("dfsox", *pi->type(i)))) 72 { 73 if ((!flagsexclude) || (!(pi->flags(i)&flagsexclude))) 48 74 { 49 t->offset=offs*sizeof(ExtValue);50 if (*pi->type(i)!='x') t->offset+=(((char*)&ex.data[0])-((char*)&ex));51 t->group=(short)(stripgroups?0:pi->group(i));52 t->flags=(short)pi->flags(i);53 t->fun1=0;54 t->fun2=0;55 t->id=maybedup(dupentries,pi->id(i));56 t->name=maybedup(dupentries,pi->name(i));57 t->type=maybedup(dupentries,pi->type(i));58 t->help=maybedup(dupentries,pi->help(i));59 t++; n++; offs++;60 if (n>count) break;75 t->offset = offset; 76 if (*pi->type(i) != 'x') t->offset += (((char*)&ex.data[0]) - ((char*)&ex)); 77 t->group = (short)(stripgroups ? 0 : pi->group(i)); 78 t->flags = (short)pi->flags(i); 79 t->fun1 = 0; 80 t->fun2 = 0; 81 t->id = maybedup(dupentries, pi->id(i)); 82 t->name = maybedup(dupentries, pi->name(i)); 83 t->type = maybedup(dupentries, pi->type(i)); 84 t->help = maybedup(dupentries, pi->help(i)); 85 t++; n++; offset += sizeof(ExtValue); 86 if (n > count) break; 61 87 } 62 88 } 63 89 } 64 t->id=0; t->group=0; t->flags=dupentries?MUTPARAM_ALLOCENTRY:0; 65 return tab; 90 t->id = 0; t->group = 0; t->flags = dupentries ? MUTPARAM_ALLOCENTRY : 0; 91 return tab; 92 } 93 94 void ParamObject::setParamTabText(ParamEntry *pe, const char* &ptr, const char* txt) 95 { 96 if (!paramTabAllocatedString(pe)) 97 return; 98 maybefree((char*)ptr); 99 ptr = maybedup(true, txt); 100 } 101 102 bool ParamObject::paramTabAllocatedString(ParamEntry *pe) 103 { 104 return (pe[pe->flags + pe->group].flags & MUTPARAM_ALLOCENTRY) ? true : false; 66 105 } 67 106 68 107 void ParamObject::freeParamTab(ParamEntry *pe) 69 108 { 70 if (pe[pe->flags+pe->group].flags & MUTPARAM_ALLOCENTRY)71 { 72 int i;73 ParamEntry *e;74 maybefree((void*)pe->name);75 maybefree((void*)pe->type);76 for (i=0,e=pe;i<pe->group;i++,e++)77 maybefree((void*)e->id);78 for (i=pe->group,e=pe+i;i<pe->group+pe->flags;i++,e++)109 if (paramTabAllocatedString(pe)) 110 { 111 int i; 112 ParamEntry *e; 113 maybefree((void*)pe->name); 114 maybefree((void*)pe->type); 115 for (i = 0, e = pe; i < pe->group; i++, e++) 116 maybefree((void*)e->id); 117 for (i = pe->group, e = pe + i; i < pe->group + pe->flags; i++, e++) 79 118 { 80 maybefree((void*)e->id);81 maybefree((void*)e->name);82 maybefree((void*)e->type);83 maybefree((void*)e->help);119 maybefree((void*)e->id); 120 maybefree((void*)e->name); 121 maybefree((void*)e->type); 122 maybefree((void*)e->help); 84 123 } 85 124 } 86 free(pe); 87 } 88 89 bool ParamObject::paramTabEqual(ParamEntry *pe1,ParamEntry *pe2) 90 { 91 if (pe1->flags != pe2->flags) return false; 92 ParamEntry *e1=pe1+pe1->group, *e2=pe2+pe2->group; 93 for(int i=0;i<pe1->flags;i++,e1++,e2++) 94 { 95 if (strcmp(e1->id,e2->id)) return false; 96 if (strcmp(e1->name,e2->name)) return false; 97 if (strcmp(e1->type,e2->type)) return false; 98 if (e1->offset!=e2->offset) return false; 99 } 100 return true; 101 } 102 103 void* ParamObject::makeObject(ParamEntry *tab) 104 { 105 if (!tab) return 0; 106 int n=tab->flags; 107 if (!n) return 0; 108 ExtValue *ret=new ExtValue[n+1]; 109 ret->setInt(n); 110 ExtValue *v=ret+1; 111 tab+=tab->group; 112 for (;n>0;n--,v++,tab++) 113 switch(*tab->type) 114 { 115 case 'd': v->setInt(0); break; 116 case 'f': v->setDouble(0); break; 117 case 's': v->setString(SString::empty()); break; 118 case 'o': v->setObject(ExtObject()); break; 119 case 'x': break; 120 } 121 return ret; 122 } 123 124 void ParamObject::copyObject(void* dst,void* src) 125 { 126 if ((!dst)||(!src)) return; 127 ExtValue *s=(ExtValue *)src; 128 ExtValue *d=(ExtValue *)dst; 129 int n=min(s->getInt(),d->getInt()); 130 s++; d++; 131 for (int i=0;i<n;i++,d++,s++) 132 *d=*s; 125 free(pe); 126 } 127 128 bool ParamObject::paramTabEqual(ParamEntry *pe1, ParamEntry *pe2) 129 { 130 if (pe1->flags != pe2->flags) return false; 131 ParamEntry *e1 = pe1 + pe1->group, *e2 = pe2 + pe2->group; 132 for (int i = 0; i < pe1->flags; i++, e1++, e2++) 133 { 134 if (strcmp(e1->id, e2->id)) return false; 135 if (strcmp(e1->name, e2->name)) return false; 136 if (strcmp(e1->type, e2->type)) return false; 137 if (e1->offset != e2->offset) return false; 138 } 139 return true; 140 } 141 142 void ParamObject::p_new(void* obj, ExtValue *args, ExtValue *ret) 143 { 144 ParamObject *this_obj = (ParamObject*)obj; 145 ParamObject *po = makeObject(this_obj->par.getParamTab()); 146 ret->setObject(ExtObject(&this_obj->par, po)); 147 po->par.setDefault(); 148 } 149 150 ParamObject::ParamObject(int _numfields, ParamEntry *_tab) 151 { 152 numfields = _numfields; 153 par.setParamTab(_tab); 154 par.select(this); 155 for (int i = 0; i < numfields; i++) 156 new(&fields[i])ExtValue(); 157 } 158 159 ParamObject::~ParamObject() 160 { 161 for (int i = 0; i < numfields; i++) 162 fields[i].~ExtValue(); 163 } 164 165 ParamObject* ParamObject::makeObject(ParamEntry *tab) 166 { 167 if (!tab) return 0; 168 int n = tab->flags; 169 if (!n) return 0; 170 ParamObject *obj = new(n)ParamObject(n, tab); // new(n): allocate n fields ; ParamObject(n,...): tell the object it has n fields 171 ExtValue *v = &obj->fields[0]; 172 tab += tab->group; 173 for (; n > 0; n--, tab++) 174 switch (*tab->type) 175 { 176 case 'd': v->setInt(0); v++; break; 177 case 'f': v->setDouble(0); v++; break; 178 case 's': v->setString(SString::empty()); v++; break; 179 case 'o': v->setObject(ExtObject()); v++; break; 180 case 'x': v++; break; 181 } 182 return obj; 183 } 184 185 void ParamObject::operator=(const ParamObject& src) 186 { 187 const ExtValue *s = &src.fields[0]; 188 ExtValue *d = &fields[0]; 189 int n = min(numfields, src.numfields); 190 for (int i = 0; i < n; i++, d++, s++) 191 *d = *s; 192 } 193 194 ParamObject* ParamObject::clone() 195 { 196 ParamObject *c = new(numfields)ParamObject(numfields, par.getParamTab()); 197 *c = *this; 198 return c; 199 } 200 201 void ParamObject::copyObject(void* dst, void* src) 202 { 203 if ((!dst) || (!src)) return; 204 ParamObject *s = (ParamObject*)src; 205 ParamObject *d = (ParamObject*)dst; 206 *d = *s; 133 207 } 134 208 135 209 void* ParamObject::dupObject(void* src) 136 210 { 137 if (!src) return NULL; 138 ExtValue *s=(ExtValue *)src; 139 int n=s->getInt(); 140 141 ExtValue *ret=new ExtValue[n+1]; 142 ExtValue *d=ret; 143 d->setInt(n); 144 d++; s++; 145 146 for (int i=0;i<n;i++,d++,s++) 147 *d=*s; 148 149 return ret; 211 if (!src) return NULL; 212 ParamObject *s = (ParamObject*)src; 213 return s->clone(); 150 214 } 151 215 152 216 void ParamObject::freeObject(void* obj) 153 217 { 154 if (!obj) return; 155 delete[] (ExtValue *)obj; 156 } 157 158 159 160 161 162 163 164 165 218 if (!obj) return; 219 ParamObject *o = (ParamObject*)obj; 220 delete o; 221 }
Note: See TracChangeset
for help on using the changeset viewer.