source: cpp/gdk/paramobj.cpp @ 91

Last change on this file since 91 was 91, checked in by Maciej Komosinski, 11 years ago

better and simpler memory management (allocation/deallocation); malloc/free -> new[]/delete[]

  • Property svn:eol-style set to native
File size: 3.3 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=new ExtValue[n+1];
97ret->setInt(n);
98ExtValue *v=ret+1;
99tab+=tab->group;
100for (;n>0;n--,v++,tab++)
101        switch(*tab->type)
102        {
103        case 'd': v->setInt(0); break;
104        case 'f': v->setDouble(0); break;
105        case 's': v->setString(SString::empty()); break;
106        case 'o': v->setObject(ExtObject()); break;
107        case 'x': break;
108        }
109return ret;
110}
111
112void ParamObject::copyObject(void* dst,void* src)
113{
114if ((!dst)||(!src)) return;
115ExtValue *s=(ExtValue *)src;
116ExtValue *d=(ExtValue *)dst;
117int n=min(s->getInt(),d->getInt());
118s++; d++;
119for (int i=0;i<n;i++,d++,s++)
120        *d=*s;
121}
122
123void* ParamObject::dupObject(void* src)
124{
125if (!src) return NULL;
126ExtValue *s=(ExtValue *)src;
127int n=s->getInt();
128
129ExtValue *ret=new ExtValue[n+1];
130ExtValue *d=ret;
131d->setInt(n);
132d++; s++;
133
134for (int i=0;i<n;i++,d++,s++)
135        *d=*s;
136
137return ret;
138}
139
140void ParamObject::freeObject(void* obj)
141{
142if (!obj) return;
143delete[] (ExtValue *)obj;
144}
145
146
147
148
149
150
151
152
153
Note: See TracBrowser for help on using the repository browser.