source: cpp/gdk/paramobj.cpp @ 88

Last change on this file since 88 was 81, checked in by Maciej Komosinski, 12 years ago

improved parsing of properties (e.g. in f0 genotypes)

  • Property svn:eol-style set to native
File size: 3.5 KB
Line 
1// This file is a part of the Framsticks GDK library.
2// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
3// Refer to http://www.framsticks.com/ for further information.
4
5#include "paramobj.h"
6#include "extvalue.h"
7#include "nonstd_stl.h"
8
9static const char* maybedup(bool dup,const char* src)
10{ return dup ? (src?strdup(src):0) : src; }
11static void maybefree(void* mem)
12{ if (mem) free(mem); }
13
14ParamEntry* ParamObject::makeParamTab(ParamInterface *pi,bool stripgroups,bool stripproc,
15                                      int firstprop, int maxprops, bool dupentries, int flagsexclude)
16{
17ParamEntry *tab,*t;
18int i,n,offs;
19static ExtValue ex;
20int count=0,gcount=1;
21if (!stripgroups) gcount=pi->getGroupCount();
22if (stripproc||flagsexclude)
23for (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        }
30else count=pi->getPropCount()-firstprop;
31t=tab=(ParamEntry*)malloc(sizeof(ParamEntry)*(count+gcount+1));
32t->group=gcount;
33t->flags=count;
34t->name=maybedup(dupentries,pi->getName());
35t->type=maybedup(dupentries,pi->getDescription());
36for(i=0;i<gcount;i++)
37        {
38        t->id=maybedup(dupentries,pi->grname(i));
39        t->offset=0;
40        t++;
41        }
42n=1; offs=1;
43for (i=firstprop;i < pi->getPropCount();i++)
44        {
45        if ((!stripproc)||(strchr("dfsox",*pi->type(i))))
46                {
47                if ((!flagsexclude)||(!(pi->flags(i)&flagsexclude)))
48                        {
49                        t->offset=offs*sizeof(ExtValue);
50                        if (*pi->type(i)!='x') t->offset+=(((char*)&ex.data[0])-((char*)&ex));
51                        t->group=stripgroups?0:pi->group(i);
52                        t->flags=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++;
60                        n++;
61                        if (n>count) break;
62                        }
63                offs++;
64                }
65        }
66t->id=0; t->group=0; t->flags=dupentries?MUTPARAM_ALLOCENTRY:0;
67return tab;
68}
69
70void ParamObject::freeParamTab(ParamEntry *pe)
71{
72if (pe[pe->flags+pe->group].flags & MUTPARAM_ALLOCENTRY)
73        {
74        int i;
75        ParamEntry *e;
76        maybefree((void*)pe->name);
77        maybefree((void*)pe->type);
78        for (i=0,e=pe;i<pe->group;i++,e++)
79                maybefree((void*)e->id);
80        for (i=pe->group,e=pe+i;i<pe->group+pe->flags;i++,e++)
81                {
82                maybefree((void*)e->id);
83                maybefree((void*)e->name);
84                maybefree((void*)e->type);
85                maybefree((void*)e->help);
86                }
87        }
88free(pe);
89}
90
91void* ParamObject::makeObject(ParamEntry *tab)
92{
93if (!tab) return 0;
94int n=tab->flags;
95if (!n) return 0;
96ExtValue *ret,*v;
97ret=v=(ExtValue*)malloc( sizeof(ExtValue)*(n+1) );
98for (int i=0;i<=n;i++,v++)
99        new(v) ExtValue;
100ret->setInt(n);
101v=ret+1;
102tab+=tab->group;
103for (;n>0;n--,v++,tab++)
104        switch(*tab->type)
105        {
106        case 'd': v->setInt(0); break;
107        case 'f': v->setDouble(0); break;
108        case 's': v->setString(SString::empty()); break;
109        case 'o': v->setObject(ExtObject()); break;
110        case 'x': break;
111        }
112return ret;
113}
114
115void ParamObject::copyObject(void* dst,void* src)
116{
117if ((!dst)||(!src)) return;
118ExtValue *s=(ExtValue *)src;
119ExtValue *d=(ExtValue *)dst;
120int n=min(s->getInt(),d->getInt());
121s++; d++;
122for (int i=0;i<n;i++,d++,s++)
123        *d=*s;
124}
125
126void* ParamObject::dupObject(void* src)
127{
128if (!src) return 0;
129ExtValue *s=(ExtValue *)src;
130int n=s->getInt();
131
132ExtValue *ret=new ExtValue[n+1];
133ExtValue *d=ret;
134d->setInt(n);
135d++; s++;
136
137for (int i=0;i<n;i++,d++,s++)
138        *d=*s;
139
140return ret;
141}
142
143void ParamObject::freeObject(void* obj)
144{
145if (!obj) return;
146ExtValue *o=(ExtValue *)obj,*t=o+1;
147int n=o->getInt();
148for (int i=0;i<n;i++,t++)
149        t -> ~ExtValue();
150free(obj);
151}
152
153
154
155
156
157
158
159
160
Note: See TracBrowser for help on using the repository browser.