File: | src/mite/shade.c |
Location: | line 40, column 14 |
Description: | Potential leak of memory pointed to by 'shpec' |
1 | /* | |||||
2 | Teem: Tools to process and visualize scientific data and images . | |||||
3 | Copyright (C) 2013, 2012, 2011, 2010, 2009 University of Chicago | |||||
4 | Copyright (C) 2008, 2007, 2006, 2005 Gordon Kindlmann | |||||
5 | Copyright (C) 2004, 2003, 2002, 2001, 2000, 1999, 1998 University of Utah | |||||
6 | ||||||
7 | This library is free software; you can redistribute it and/or | |||||
8 | modify it under the terms of the GNU Lesser General Public License | |||||
9 | (LGPL) as published by the Free Software Foundation; either | |||||
10 | version 2.1 of the License, or (at your option) any later version. | |||||
11 | The terms of redistributing and/or modifying this software also | |||||
12 | include exceptions to the LGPL that facilitate static linking. | |||||
13 | ||||||
14 | This library is distributed in the hope that it will be useful, | |||||
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
17 | Lesser General Public License for more details. | |||||
18 | ||||||
19 | You should have received a copy of the GNU Lesser General Public License | |||||
20 | along with this library; if not, write to Free Software Foundation, Inc., | |||||
21 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
22 | */ | |||||
23 | ||||||
24 | #include "mite.h" | |||||
25 | #include "privateMite.h" | |||||
26 | ||||||
27 | miteShadeSpec * | |||||
28 | miteShadeSpecNew(void) { | |||||
29 | miteShadeSpec *shpec; | |||||
30 | ||||||
31 | shpec = (miteShadeSpec *)calloc(1, sizeof(miteShadeSpec)); | |||||
| ||||||
32 | if (shpec) { | |||||
33 | shpec->method = miteShadeMethodUnknown; | |||||
34 | shpec->vec0 = gageItemSpecNew(); | |||||
35 | shpec->vec1 = gageItemSpecNew(); | |||||
36 | shpec->scl0 = gageItemSpecNew(); | |||||
37 | shpec->scl1 = gageItemSpecNew(); | |||||
38 | if (!( shpec->vec0 && shpec->vec1 && | |||||
39 | shpec->scl0 && shpec->scl1 )) { | |||||
40 | return NULL((void*)0); | |||||
| ||||||
41 | } | |||||
42 | } | |||||
43 | return shpec; | |||||
44 | } | |||||
45 | ||||||
46 | miteShadeSpec * | |||||
47 | miteShadeSpecNix(miteShadeSpec *shpec) { | |||||
48 | ||||||
49 | if (shpec) { | |||||
50 | shpec->vec0 = gageItemSpecNix(shpec->vec0); | |||||
51 | shpec->vec1 = gageItemSpecNix(shpec->vec1); | |||||
52 | shpec->scl0 = gageItemSpecNix(shpec->scl0); | |||||
53 | shpec->scl1 = gageItemSpecNix(shpec->scl1); | |||||
54 | airFree(shpec); | |||||
55 | } | |||||
56 | return NULL((void*)0); | |||||
57 | } | |||||
58 | ||||||
59 | /* | |||||
60 | ******** miteShadeSpecParse | |||||
61 | ** | |||||
62 | ** set up a miteShadeSpec based on a string. Valid forms are: | |||||
63 | ** | |||||
64 | ** none | |||||
65 | ** phong:<vector> | |||||
66 | ** litten:<vector>,<vector>,<scalar>,<scalar> | |||||
67 | ** | |||||
68 | ** where <vector> and <scalar> are specifications of 3-vector and scalar | |||||
69 | ** parsable by miteVariableParse | |||||
70 | */ | |||||
71 | int | |||||
72 | miteShadeSpecParse(miteShadeSpec *shpec, char *shadeStr) { | |||||
73 | static const char me[]="miteShadeSpecParse"; | |||||
74 | char *buff, *qstr, *tok, *state; | |||||
75 | airArray *mop; | |||||
76 | int ansLength; | |||||
77 | ||||||
78 | mop = airMopNew(); | |||||
79 | if (!( shpec && airStrlen(shadeStr) )) { | |||||
80 | biffAddf(MITEmiteBiffKey, "%s: got NULL pointer and/or empty string", me); | |||||
81 | airMopError(mop); return 1; | |||||
82 | } | |||||
83 | buff = airToLower(airStrdup(shadeStr)); | |||||
84 | if (!buff) { | |||||
85 | biffAddf(MITEmiteBiffKey, "%s: couldn't strdup shading spec", me); | |||||
86 | airMopError(mop); return 1; | |||||
87 | } | |||||
88 | airMopAdd(mop, buff, airFree, airMopAlways); | |||||
89 | shpec->method = miteShadeMethodUnknown; | |||||
90 | if (!strcmp("none", buff)) { | |||||
91 | shpec->method = miteShadeMethodNone; | |||||
92 | } else if (buff == strstr(buff, "phong:")) { | |||||
93 | shpec->method = miteShadeMethodPhong; | |||||
94 | qstr = buff + strlen("phong:"); | |||||
95 | if (miteVariableParse(shpec->vec0, qstr)) { | |||||
96 | biffAddf(MITEmiteBiffKey, "%s: couldn't parse \"%s\" as shading vector", me, qstr); | |||||
97 | airMopError(mop); return 1; | |||||
98 | } | |||||
99 | ansLength = shpec->vec0->kind->table[shpec->vec0->item].answerLength; | |||||
100 | if (3 != ansLength) { | |||||
101 | biffAddf(MITEmiteBiffKey, "%s: \"%s\" isn't a vector (answer length is %d, not 3)", | |||||
102 | me, qstr, ansLength); | |||||
103 | airMopError(mop); return 1; | |||||
104 | } | |||||
105 | shpec->method = miteShadeMethodPhong; | |||||
106 | } else if (buff == strstr(buff, "litten:")) { | |||||
107 | qstr = buff + strlen("litten:"); | |||||
108 | /* ---- first vector */ | |||||
109 | tok = airStrtok(qstr, ",", &state); | |||||
110 | if (miteVariableParse(shpec->vec0, tok)) { | |||||
111 | biffAddf(MITEmiteBiffKey, "%s: couldn't parse \"%s\" as first lit-tensor vector", | |||||
112 | me, tok); | |||||
113 | airMopError(mop); return 1; | |||||
114 | } | |||||
115 | ansLength = shpec->vec0->kind->table[shpec->vec0->item].answerLength; | |||||
116 | if (3 != ansLength) { | |||||
117 | biffAddf(MITEmiteBiffKey, "%s: \"%s\" isn't a vector (answer length is %d, not 3)", | |||||
118 | me, qstr, ansLength); | |||||
119 | airMopError(mop); return 1; | |||||
120 | } | |||||
121 | /* ---- second vector */ | |||||
122 | tok = airStrtok(qstr, ",", &state); | |||||
123 | if (miteVariableParse(shpec->vec1, tok)) { | |||||
124 | biffAddf(MITEmiteBiffKey, "%s: couldn't parse \"%s\" as second lit-tensor vector", | |||||
125 | me, tok); | |||||
126 | airMopError(mop); return 1; | |||||
127 | } | |||||
128 | ansLength = shpec->vec1->kind->table[shpec->vec1->item].answerLength; | |||||
129 | if (3 != ansLength) { | |||||
130 | biffAddf(MITEmiteBiffKey, "%s: \"%s\" isn't a vector (answer length is %d, not 3)", | |||||
131 | me, qstr, ansLength); | |||||
132 | airMopError(mop); return 1; | |||||
133 | } | |||||
134 | /* ---- first scalar */ | |||||
135 | tok = airStrtok(qstr, ",", &state); | |||||
136 | if (miteVariableParse(shpec->scl0, tok)) { | |||||
137 | biffAddf(MITEmiteBiffKey, "%s: couldn't parse \"%s\" as first lit-tensor scalar", | |||||
138 | me, tok); | |||||
139 | airMopError(mop); return 1; | |||||
140 | } | |||||
141 | ansLength = shpec->scl0->kind->table[shpec->scl0->item].answerLength; | |||||
142 | if (1 != ansLength) { | |||||
143 | biffAddf(MITEmiteBiffKey, "%s: \"%s\" isn't a scalar (answer length is %d, not 1)", | |||||
144 | me, qstr, ansLength); | |||||
145 | airMopError(mop); return 1; | |||||
146 | } | |||||
147 | /* ---- second scalar */ | |||||
148 | tok = airStrtok(qstr, ",", &state); | |||||
149 | if (miteVariableParse(shpec->scl1, tok)) { | |||||
150 | biffAddf(MITEmiteBiffKey, "%s: couldn't parse \"%s\" as second lit-tensor scalar", | |||||
151 | me, tok); | |||||
152 | airMopError(mop); return 1; | |||||
153 | } | |||||
154 | ansLength = shpec->scl1->kind->table[shpec->scl1->item].answerLength; | |||||
155 | if (1 != ansLength) { | |||||
156 | biffAddf(MITEmiteBiffKey, "%s: \"%s\" isn't a scalar (answer length is %d, not 1)", | |||||
157 | me, qstr, ansLength); | |||||
158 | airMopError(mop); return 1; | |||||
159 | } | |||||
160 | shpec->method = miteShadeMethodLitTen; | |||||
161 | } else { | |||||
162 | biffAddf(MITEmiteBiffKey, "%s: shading specification \"%s\" not understood", | |||||
163 | me, shadeStr); | |||||
164 | airMopError(mop); return 1; | |||||
165 | } | |||||
166 | airMopOkay(mop); | |||||
167 | return 0; | |||||
168 | } | |||||
169 | ||||||
170 | void | |||||
171 | miteShadeSpecPrint(char *buff, const miteShadeSpec *shpec) { | |||||
172 | static const char me[]="miteShadeSpecPrint"; | |||||
173 | char var[4][AIR_STRLEN_MED(256+1)]; | |||||
174 | ||||||
175 | if (buff && shpec) { | |||||
176 | switch(shpec->method) { | |||||
177 | case miteShadeMethodNone: | |||||
178 | sprintf(buff, "none")__builtin___sprintf_chk (buff, 0, __builtin_object_size (buff , 2 > 1 ? 1 : 0), "none"); | |||||
179 | break; | |||||
180 | case miteShadeMethodPhong: | |||||
181 | miteVariablePrint(var[0], shpec->vec0); | |||||
182 | sprintf(buff, "phong:%s", var[0])__builtin___sprintf_chk (buff, 0, __builtin_object_size (buff , 2 > 1 ? 1 : 0), "phong:%s", var[0]); | |||||
183 | break; | |||||
184 | case miteShadeMethodLitTen: | |||||
185 | miteVariablePrint(var[0], shpec->vec0); | |||||
186 | miteVariablePrint(var[1], shpec->vec1); | |||||
187 | miteVariablePrint(var[2], shpec->scl0); | |||||
188 | miteVariablePrint(var[3], shpec->scl1); | |||||
189 | sprintf(buff, "litten:%s,%s,%s,%s", var[0], var[1], var[2], var[3])__builtin___sprintf_chk (buff, 0, __builtin_object_size (buff , 2 > 1 ? 1 : 0), "litten:%s,%s,%s,%s", var[0], var[1], var [2], var[3]); | |||||
190 | break; | |||||
191 | default: | |||||
192 | sprintf(buff, "%s: unknown shade method!", me)__builtin___sprintf_chk (buff, 0, __builtin_object_size (buff , 2 > 1 ? 1 : 0), "%s: unknown shade method!", me); | |||||
193 | break; | |||||
194 | } | |||||
195 | } | |||||
196 | return; | |||||
197 | } | |||||
198 | ||||||
199 | void | |||||
200 | miteShadeSpecQueryAdd(gageQuery queryScl, gageQuery queryVec, | |||||
201 | gageQuery queryTen, gageQuery queryMite, | |||||
202 | miteShadeSpec *shpec) { | |||||
203 | if (shpec) { | |||||
204 | switch(shpec->method) { | |||||
205 | case miteShadeMethodNone: | |||||
206 | /* no queries to add */ | |||||
207 | break; | |||||
208 | case miteShadeMethodPhong: | |||||
209 | miteQueryAdd(queryScl, queryVec, queryTen, queryMite, shpec->vec0); | |||||
210 | break; | |||||
211 | case miteShadeMethodLitTen: | |||||
212 | miteQueryAdd(queryScl, queryVec, queryTen, queryMite, shpec->vec0); | |||||
213 | miteQueryAdd(queryScl, queryVec, queryTen, queryMite, shpec->vec1); | |||||
214 | miteQueryAdd(queryScl, queryVec, queryTen, queryMite, shpec->scl0); | |||||
215 | miteQueryAdd(queryScl, queryVec, queryTen, queryMite, shpec->scl1); | |||||
216 | break; | |||||
217 | default: | |||||
218 | break; | |||||
219 | } | |||||
220 | } | |||||
221 | return; | |||||
222 | } | |||||
223 |