source: cpp/frams/param/paramobj.cpp @ 299

Last change on this file since 299 was 286, checked in by Maciej Komosinski, 10 years ago

Updated headers

  • Property svn:eol-style set to native
File size: 3.8 KB
Line 
1// This file is a part of Framsticks SDK.  http://www.framsticks.com/
2// Copyright (C) 1999-2015  Maciej Komosinski and Szymon Ulatowski.
3// See LICENSE.txt for details.
4
5#include <frams/param/paramobj.h>
6#include <frams/util/extvalue.h>
7#include <common/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=(short)gcount;
33t->flags=(short)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=(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;
61                        }
62                }
63        }
64t->id=0; t->group=0; t->flags=dupentries?MUTPARAM_ALLOCENTRY:0;
65return tab;
66}
67
68void ParamObject::freeParamTab(ParamEntry *pe)
69{
70if (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++)
79                {
80                maybefree((void*)e->id);
81                maybefree((void*)e->name);
82                maybefree((void*)e->type);
83                maybefree((void*)e->help);
84                }
85        }
86free(pe);
87}
88
89bool ParamObject::paramTabEqual(ParamEntry *pe1,ParamEntry *pe2)
90{
91if (pe1->flags != pe2->flags) return false;
92ParamEntry *e1=pe1+pe1->group, *e2=pe2+pe2->group;
93for(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        }
100return true;
101}
102
103void* ParamObject::makeObject(ParamEntry *tab)
104{
105if (!tab) return 0;
106int n=tab->flags;
107if (!n) return 0;
108ExtValue *ret=new ExtValue[n+1];
109ret->setInt(n);
110ExtValue *v=ret+1;
111tab+=tab->group;
112for (;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        }
121return ret;
122}
123
124void ParamObject::copyObject(void* dst,void* src)
125{
126if ((!dst)||(!src)) return;
127ExtValue *s=(ExtValue *)src;
128ExtValue *d=(ExtValue *)dst;
129int n=min(s->getInt(),d->getInt());
130s++; d++;
131for (int i=0;i<n;i++,d++,s++)
132        *d=*s;
133}
134
135void* ParamObject::dupObject(void* src)
136{
137if (!src) return NULL;
138ExtValue *s=(ExtValue *)src;
139int n=s->getInt();
140
141ExtValue *ret=new ExtValue[n+1];
142ExtValue *d=ret;
143d->setInt(n);
144d++; s++;
145
146for (int i=0;i<n;i++,d++,s++)
147        *d=*s;
148
149return ret;
150}
151
152void ParamObject::freeObject(void* obj)
153{
154if (!obj) return;
155delete[] (ExtValue *)obj;
156}
157
158
159
160
161
162
163
164
165
Note: See TracBrowser for help on using the repository browser.