Bug Summary

File:src/meet/meetNrrd.c
Location:line 47, column 42
Description:Dereference of undefined pointer value

Annotated Source Code

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 "meet.h"
25
26typedef union {
27 const NrrdKernel ***k;
28 void **v;
29} _kernu;
30
31/*
32** ALLOCATES and returns a NULL-terminated array of all the
33** NrrdKernels in Teem
34*/
35const NrrdKernel **
36meetNrrdKernelAll(void) {
37 airArray *arr;
38 const NrrdKernel **kern;
2
'kern' declared without an initial value
39 unsigned int ii;
40 int di, ci, ai, dmax, cmax, amax;
41 _kernu ku;
42
43 ku.k = &kern;
44 arr = airArrayNew(ku.v, NULL((void*)0), sizeof(NrrdKernel *), 2);
45
46 /* kernel.c */
47 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelZero;
3
Dereference of undefined pointer value
48 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBox;
49 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBoxSupportDebug;
50 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCatmullRomSupportDebug;
51 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCatmullRomSupportDebugD;
52 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCatmullRomSupportDebugDD;
53 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCos4SupportDebug;
54 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCos4SupportDebugD;
55 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCos4SupportDebugDD;
56 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCos4SupportDebugDDD;
57 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCheap;
58 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelHermiteScaleSpaceFlag;
59 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelTent;
60 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelForwDiff;
61 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCentDiff;
62 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBCCubic;
63 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBCCubicD;
64 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBCCubicDD;
65 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCatmullRom;
66 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCatmullRomD;
67 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCatmullRomDD;
68 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelAQuartic;
69 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelAQuarticD;
70 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelAQuarticDD;
71 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC3Quintic;
72 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC3QuinticD;
73 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC3QuinticDD;
74 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC4Hexic;
75 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC4HexicD;
76 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC4HexicDD;
77 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC4HexicDDD;
78 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC4HexicApproxInverse;
79 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC5Septic;
80 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC5SepticD;
81 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC5SepticDD;
82 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC5SepticDDD;
83 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC5SepticApproxInverse;
84 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelGaussian;
85 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelGaussianD;
86 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelGaussianDD;
87 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelDiscreteGaussian;
88
89 /* winKernel.c */
90 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelHann;
91 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelHannD;
92 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelHannDD;
93 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBlackman;
94 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBlackmanD;
95 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBlackmanDD;
96
97 /* bsplKernel.c */
98 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline1;
99 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline1D;
100 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline2;
101 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline2D;
102 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline2DD;
103 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline3;
104 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline3D;
105 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline3DD;
106 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline3DDD;
107 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline3ApproxInverse;
108 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline4;
109 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline4D;
110 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline4DD;
111 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline4DDD;
112 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline5;
113 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline5D;
114 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline5DD;
115 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline5DDD;
116 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline5ApproxInverse;
117 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline6;
118 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline6D;
119 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline6DD;
120 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline6DDD;
121 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline7;
122 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline7D;
123 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline7DD;
124 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline7DDD;
125 ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline7ApproxInverse;
126
127 /* tmfKernel.c
128 nrrdKernelTMF[D+1][C+1][A] is d<D>_c<C>_<A>ef:
129 Dth-derivative, C-order continuous ("smooth"), A-order accurate
130 (for D and C, index 0 accesses the function for -1)
131 NRRD_EXPORT NrrdKernel *const nrrdKernelTMF[4][5][5];
132 */
133 dmax = AIR_CAST(int, nrrdKernelTMF_maxD)((int)(nrrdKernelTMF_maxD));
134 cmax = AIR_CAST(int, nrrdKernelTMF_maxC)((int)(nrrdKernelTMF_maxC));
135 amax = AIR_CAST(int, nrrdKernelTMF_maxA)((int)(nrrdKernelTMF_maxA));
136 for (di=-1; di<=dmax; di++) {
137 for (ci=-1; ci<=cmax; ci++) {
138 for (ai=1; ai<=amax; ai++) {
139 ii = airArrayLenIncr(arr, 1);
140 kern[ii] = nrrdKernelTMF[di+1][ci+1][ai];
141 }
142 }
143 }
144
145 /* NULL-terminate the list */
146 ii = airArrayLenIncr(arr, 1); kern[ii] = NULL((void*)0);
147 /* nix, not nuke the airArray */
148 airArrayNix(arr);
149 return kern;
150}
151
152/* the knowledge here about what is a derivative of what is something
153 that will be built into kernels in a future Teem version */
154static const NrrdKernel *
155kintegral(const NrrdKernel *kd) {
156 const NrrdKernel *ret=NULL((void*)0);
157
158 /* the statement "INTGL(K)" is saying that K has a derivative with the
159 usual name K##D. This is made more convenient by the
160 consistent use of the "D" suffix for indicating a derivative */
161#define INTGL(K) if (K##D == kd) { ret = K; }
162 INTGL(nrrdKernelHann);
163 INTGL(nrrdKernelHannD);
164 INTGL(nrrdKernelBlackman);
165 INTGL(nrrdKernelBlackmanD);
166
167 INTGL(nrrdKernelBSpline1);
168 INTGL(nrrdKernelBSpline2);
169 INTGL(nrrdKernelBSpline2D);
170 INTGL(nrrdKernelBSpline3);
171 INTGL(nrrdKernelBSpline3D);
172 INTGL(nrrdKernelBSpline3DD);
173 INTGL(nrrdKernelBSpline4);
174 INTGL(nrrdKernelBSpline4D);
175 INTGL(nrrdKernelBSpline4DD);
176 INTGL(nrrdKernelBSpline5);
177 INTGL(nrrdKernelBSpline5D);
178 INTGL(nrrdKernelBSpline5DD);
179 INTGL(nrrdKernelBSpline6);
180 INTGL(nrrdKernelBSpline6D);
181 INTGL(nrrdKernelBSpline6DD);
182 INTGL(nrrdKernelBSpline7);
183 INTGL(nrrdKernelBSpline7D);
184 INTGL(nrrdKernelBSpline7DD);
185
186 INTGL(nrrdKernelCos4SupportDebug);
187 INTGL(nrrdKernelCos4SupportDebugD);
188 INTGL(nrrdKernelCos4SupportDebugDD);
189 INTGL(nrrdKernelCatmullRomSupportDebug);
190 INTGL(nrrdKernelCatmullRomSupportDebugD);
191 INTGL(nrrdKernelBCCubic);
192 INTGL(nrrdKernelBCCubicD);
193 INTGL(nrrdKernelCatmullRom);
194 INTGL(nrrdKernelCatmullRomD);
195 INTGL(nrrdKernelAQuartic);
196 INTGL(nrrdKernelAQuarticD);
197 INTGL(nrrdKernelC3Quintic);
198 INTGL(nrrdKernelC3QuinticD);
199 INTGL(nrrdKernelC4Hexic);
200 INTGL(nrrdKernelC4HexicD);
201 INTGL(nrrdKernelC4HexicDD);
202 INTGL(nrrdKernelC5Septic);
203 INTGL(nrrdKernelC5SepticD);
204 INTGL(nrrdKernelC5SepticDD);
205 INTGL(nrrdKernelGaussian);
206 INTGL(nrrdKernelGaussianD);
207#undef INTGL
208 return ret;
209}
210
211/*
212** Does more than call nrrdKernelCheck on all kernels:
213** makes sure that all kernels have unique names
214** makes sure that derivative relationships are correct
215** Also, simply calling nrrdKernelCheck requires some knowledge
216** of the kernel's needed parameters
217**
218** HEY: its problematic that because the various kernels have different
219** parameter epsilon requirements, they usually end up having to be
220** enumerated in some of the if/else statements below; it would be much
221** better if new kernels didn't need to be so explicitly added!
222*/
223int
224meetNrrdKernelAllCheck(void) {
225 static const char me[]="meetNrrdKernelAllCheck";
226 const NrrdKernel **kern, *kk, *ll;
227 unsigned int ki, kj, pnum;
228 airArray *mop;
229 double epsl, XX, YY,
230 parm0[NRRD_KERNEL_PARMS_NUM8],
231 parm1_1[NRRD_KERNEL_PARMS_NUM8], parm1_X[NRRD_KERNEL_PARMS_NUM8],
232 parm[NRRD_KERNEL_PARMS_NUM8];
233 size_t evalNum;
234 int EE;
235
236 mop = airMopNew();
237 kern = meetNrrdKernelAll();
1
Calling 'meetNrrdKernelAll'
238 airMopAdd(mop, AIR_CAST(void*, kern)((void*)(kern)), airFree, airMopAlways);
239 evalNum = 120000; /* success of kernel integral test is surprisingly
240 dependent on this, likely due to the naive way
241 the integral is numerically computed; the current
242 value here represents some experimentation */
243 epsl = 0.9e-5;
244 XX = 7.0/3.0; /* 2.333.. */
245 YY = 43.0/9.0; /* 4.777.. */
246 parm0[0] = AIR_NAN(airFloatQNaN.f); /* shouldn't be read */
247 parm1_1[0] = 1.0;
248 parm1_X[0] = XX;
249 ki = 0;
250 while ((kk = kern[ki])) {
251 kj = 0;
252 while (kj < ki) {
253 ll = kern[kj];
254 if (kk == ll) {
255 biffAddf(MEETmeetBiffKey, "%s: kern[%u] and [%u] were identical (%s)",
256 me, kj, ki, kk->name);
257 airMopError(mop); return 1;
258 }
259 if (!airStrcmp(kk->name, ll->name)) {
260 biffAddf(MEETmeetBiffKey, "%s: kern[%u] and [%u] have same name (%s)",
261 me, kj, ki, kk->name);
262 airMopError(mop); return 1;
263 }
264 kj++;
265 }
266 pnum = kk->numParm;
267 EE = 0;
268 /* the second argument to CHECK is how much to scale up the
269 permissible error in kernel evaluations (between float and double)
270 The kernels for which this is higher should be targets for
271 re-coding with an eye towards numerical accuracy */
272#define CHECK(P, S, N) \
273 if (!EE) EE |= nrrdKernelCheck(kk, (P), evalNum, epsl*(S), \
274 N, N, \
275 kintegral(kk), (P));
276 if (nrrdKernelBCCubic == kk ||
277 nrrdKernelBCCubicD == kk ||
278 nrrdKernelBCCubicDD == kk) {
279 /* try a few settings of the 3 parms */
280 ELL_3V_SET(parm, 1.0, 0.0, 0.0)((parm)[0] = (1.0), (parm)[1] = (0.0), (parm)[2] = (0.0)); CHECK(parm, 1, 2);
281 ELL_3V_SET(parm, XX, 0.0, 0.0)((parm)[0] = (XX), (parm)[1] = (0.0), (parm)[2] = (0.0)); CHECK(parm, 1, 2);
282 ELL_3V_SET(parm, 1.0, 1.0/3.0, 1.0/3.0)((parm)[0] = (1.0), (parm)[1] = (1.0/3.0), (parm)[2] = (1.0/3.0
))
; CHECK(parm, 1, 2);
283 ELL_3V_SET(parm, XX, 1.0/3.0, 1.0/3.0)((parm)[0] = (XX), (parm)[1] = (1.0/3.0), (parm)[2] = (1.0/3.0
))
; CHECK(parm, 1, 2);
284 ELL_3V_SET(parm, 1.0, 0.0, 1.0)((parm)[0] = (1.0), (parm)[1] = (0.0), (parm)[2] = (1.0)); CHECK(parm, 1, 2);
285 ELL_3V_SET(parm, XX, 0.0, 1.0)((parm)[0] = (XX), (parm)[1] = (0.0), (parm)[2] = (1.0)); CHECK(parm, 1, 2);
286 ELL_3V_SET(parm, 1.0, 0.5, 0.0)((parm)[0] = (1.0), (parm)[1] = (0.5), (parm)[2] = (0.0)); CHECK(parm, 1, 2);
287 ELL_3V_SET(parm, XX, 0.5, 0.0)((parm)[0] = (XX), (parm)[1] = (0.5), (parm)[2] = (0.0)); CHECK(parm, 1, 2);
288 } else if (2 == pnum) {
289 if (nrrdKernelAQuartic == kk ||
290 nrrdKernelAQuarticD == kk ||
291 nrrdKernelAQuarticDD == kk) {
292 ELL_2V_SET(parm, 1.0, 0.0)((parm)[0]=(1.0), (parm)[1]=(0.0)); CHECK(parm, 10, 2);
293 ELL_2V_SET(parm, 1.0, 0.5)((parm)[0]=(1.0), (parm)[1]=(0.5)); CHECK(parm, 10, 2);
294 ELL_2V_SET(parm, XX, 0.0)((parm)[0]=(XX), (parm)[1]=(0.0)); CHECK(parm, 10, 2);
295 ELL_2V_SET(parm, XX, 0.5)((parm)[0]=(XX), (parm)[1]=(0.5)); CHECK(parm, 10, 2);
296 } else if (nrrdKernelGaussian == kk ||
297 nrrdKernelGaussianD == kk ||
298 nrrdKernelGaussianDD == kk) {
299 ELL_2V_SET(parm, 0.1, XX)((parm)[0]=(0.1), (parm)[1]=(XX)); CHECK(parm, 10, 2);
300 ELL_2V_SET(parm, 0.1, YY)((parm)[0]=(0.1), (parm)[1]=(YY)); CHECK(parm, 10, 2);
301 ELL_2V_SET(parm, 1.0, XX)((parm)[0]=(1.0), (parm)[1]=(XX)); CHECK(parm, 10, 2);
302 ELL_2V_SET(parm, 1.0, YY)((parm)[0]=(1.0), (parm)[1]=(YY)); CHECK(parm, 10, 2);
303 ELL_2V_SET(parm, XX, XX)((parm)[0]=(XX), (parm)[1]=(XX)); CHECK(parm, 10, 2);
304 ELL_2V_SET(parm, XX, YY)((parm)[0]=(XX), (parm)[1]=(YY)); CHECK(parm, 10, 2);
305 } else if (nrrdKernelHann == kk ||
306 nrrdKernelHannD == kk ||
307 nrrdKernelBlackman == kk) {
308 ELL_2V_SET(parm, 0.5, XX)((parm)[0]=(0.5), (parm)[1]=(XX)); CHECK(parm, 100, 2);
309 ELL_2V_SET(parm, 0.5, YY)((parm)[0]=(0.5), (parm)[1]=(YY)); CHECK(parm, 100, 2);
310 ELL_2V_SET(parm, 1.0, XX)((parm)[0]=(1.0), (parm)[1]=(XX)); CHECK(parm, 100, 2);
311 ELL_2V_SET(parm, 1.0, YY)((parm)[0]=(1.0), (parm)[1]=(YY)); CHECK(parm, 100, 2);
312 ELL_2V_SET(parm, XX, XX)((parm)[0]=(XX), (parm)[1]=(XX)); CHECK(parm, 100, 2);
313 ELL_2V_SET(parm, XX, YY)((parm)[0]=(XX), (parm)[1]=(YY)); CHECK(parm, 100, 2);
314 } else if (nrrdKernelHannDD == kk ||
315 nrrdKernelBlackmanD == kk ||
316 nrrdKernelBlackmanDD == kk) {
317 /* there are apparently bugs in these kernels */
318 ELL_2V_SET(parm, 0.5, XX)((parm)[0]=(0.5), (parm)[1]=(XX)); CHECK(parm, 10000000, 2);
319 ELL_2V_SET(parm, 0.5, YY)((parm)[0]=(0.5), (parm)[1]=(YY)); CHECK(parm, 10000000, 2);
320 ELL_2V_SET(parm, 1.0, XX)((parm)[0]=(1.0), (parm)[1]=(XX)); CHECK(parm, 1000000, 2);
321 ELL_2V_SET(parm, 1.0, YY)((parm)[0]=(1.0), (parm)[1]=(YY)); CHECK(parm, 1000000, 2);
322 ELL_2V_SET(parm, XX, XX)((parm)[0]=(XX), (parm)[1]=(XX)); CHECK(parm, 100000, 2);
323 ELL_2V_SET(parm, XX, YY)((parm)[0]=(XX), (parm)[1]=(YY)); CHECK(parm, 100000, 2);
324 } else if (nrrdKernelDiscreteGaussian == kk) {
325 ELL_2V_SET(parm, 0.1, XX)((parm)[0]=(0.1), (parm)[1]=(XX)); CHECK(parm, 1, 2);
326 ELL_2V_SET(parm, 0.1, YY)((parm)[0]=(0.1), (parm)[1]=(YY)); CHECK(parm, 1, 2);
327 ELL_2V_SET(parm, 1.0, XX)((parm)[0]=(1.0), (parm)[1]=(XX)); CHECK(parm, 1, 2);
328 ELL_2V_SET(parm, 1.0, YY)((parm)[0]=(1.0), (parm)[1]=(YY)); CHECK(parm, 1, 2);
329 ELL_2V_SET(parm, XX, XX)((parm)[0]=(XX), (parm)[1]=(XX)); CHECK(parm, 1, 2);
330 ELL_2V_SET(parm, XX, YY)((parm)[0]=(XX), (parm)[1]=(YY)); CHECK(parm, 1, 2);
331 } else {
332 biffAddf(MEETmeetBiffKey, "%s: sorry, got unexpected 2-parm kernel %s",
333 me, kk->name);
334 airMopError(mop); return 1;
335 }
336 } else if (1 == pnum) {
337 if (strstr(kk->name, "TMF")) {
338 /* these take a single parm, but its not support */
339 parm[0] = 0.0; CHECK(parm, 10, 2);
340 parm[0] = 1.0/3.0; CHECK(parm, 10, 2);
341 } else {
342 /* zero, box, boxsup, cos4sup{,D,DD,DDD}, cheap,
343 ctmrsup{,D,DD}, tent, fordif, cendif */
344 /* takes a single support/scale parm[0], try two different values */
345 if (nrrdKernelCos4SupportDebug == kk ||
346 nrrdKernelCos4SupportDebugD == kk ||
347 nrrdKernelCos4SupportDebugDD == kk ||
348 nrrdKernelCos4SupportDebugDDD == kk ||
349 nrrdKernelCatmullRomSupportDebugD == kk ||
350 nrrdKernelCatmullRomSupportDebugDD == kk) {
351 CHECK(parm1_1, 10, 4);
352 CHECK(parm1_X, 10, 4);
353 } else {
354 CHECK(parm1_1, 1, 2);
355 CHECK(parm1_X, 1, 2);
356 }
357 }
358 } else if (0 == pnum) {
359 /* C3Quintic{,D,DD,DD}, C4Hexic{,D,DD,DDD}, C5Septic{,D},
360 hermiteSS, catmull-rom{,D}, bspl{3,5,7}{,D,DD,DDD} */
361 if (nrrdKernelC3Quintic == kk ||
362 nrrdKernelC3QuinticD == kk ||
363 nrrdKernelC3QuinticDD == kk ||
364 nrrdKernelC4Hexic == kk ||
365 nrrdKernelC4HexicD == kk ||
366 nrrdKernelC4HexicDD == kk ||
367 nrrdKernelC4HexicDDD == kk ||
368 nrrdKernelC5Septic == kk ||
369 nrrdKernelC5SepticD == kk ||
370 nrrdKernelC5SepticDD == kk ||
371 nrrdKernelC5SepticDDD == kk
372 ) {
373 CHECK(parm0, 1, 2);
374 CHECK(parm0, 1, 2);
375 } else if (nrrdKernelBSpline5DD == kk ||
376 nrrdKernelBSpline5DDD == kk ||
377 nrrdKernelBSpline7DD == kk ) {
378 CHECK(parm0, 100, 2);
379 } else {
380 CHECK(parm0, 10, 2);
381 }
382 } else {
383 biffAddf(MEETmeetBiffKey, "%s: sorry, didn't expect %u parms for %s",
384 me, pnum, kk->name);
385 airMopError(mop); return 1;
386 }
387#undef CHECK
388 if (EE) {
389 biffMovef(MEETmeetBiffKey, NRRDnrrdBiffKey, "%s: problem with kern[%u] \"%s\"", me, ki,
390 kk->name ? kk->name : "(NULL name)");
391 airMopError(mop); return 1;
392 }
393 ki++;
394 }
395
396 airMopOkay(mop);
397 return 0;
398}