Coverity: graphics module resource leaks fixed
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_param3d.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2006 - INRIA - Fabrice Leray
4  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 /*------------------------------------------------------------------------*/
18 /* file: sci_param3d.c                                                    */
19 /* desc : interface for param3d routine                                   */
20 /*------------------------------------------------------------------------*/
21
22 #include "gw_graphics.h"
23 #include "GetCommandArg.h"
24 #include "BuildObjects.h"
25 #include "sciCall.h"
26 #include "api_scilab.h"
27 #include "localization.h"
28 #include "Scierror.h"
29 #include "DefaultCommandArg.h"
30 /*------------------------------------------------------------------------*/
31 int sci_param3d(char * fname, void *pvApiCtx)
32 {
33     SciErr sciErr;
34     int izcol = 0, isfac = 0;
35     static double  ebox_def[6] = { 0, 1, 0, 1, 0, 1};
36     double *ebox = ebox_def;
37     static int iflag_def[3] = {1, 2, 4};
38     int iflag[3], *ifl = NULL, ix1 = 0, one = 1;
39     double  alpha_def = 35.0 , theta_def = 45.0;
40     double *alpha = &alpha_def, *theta = &theta_def;
41     int m1 = 0, n1 = 0, m2 = 0, n2 = 0, m3 = 0, n3 = 0;
42     int m3n = 0, n3n = 0; /* F.Leray 19.03.04*/
43
44     static rhs_opts opts[] =
45     {
46         { -1, "alpha", -1, 0, 0, NULL},
47         { -1, "ebox", -1, 0, 0, NULL},
48         { -1, "flag", -1, 0, 0, NULL},
49         { -1, "leg", -1, 0, 0, NULL},
50         { -1, "theta", -1, 0, 0, NULL},
51         { -1, NULL, -1, 0, 0, NULL}
52     };
53
54     char * labels = NULL;
55     BOOL freeLabels = FALSE;
56
57     int* piAddr1 = NULL;
58     int* piAddr2 = NULL;
59     int* piAddr3 = NULL;
60
61     double* l1 = NULL;
62     double* l2 = NULL;
63     double* l3 = NULL;
64
65     if (nbInputArgument(pvApiCtx) <= 0)
66     {
67         sci_demo(fname, pvApiCtx);
68         return 0;
69     }
70
71     CheckInputArgument(pvApiCtx, 3, 8);
72
73     if (getOptionals(pvApiCtx, fname, opts) == 0)
74     {
75         ReturnArguments(pvApiCtx);
76         return 0;
77     }
78     if (FirstOpt(pvApiCtx) < 4)
79     {
80         Scierror(999, _("%s: Misplaced optional argument: #%d must be at position %d.\n"), fname, 1, 4);
81         return (0);
82     }
83
84     //get variable address
85     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
86     if (sciErr.iErr)
87     {
88         printError(&sciErr, 0);
89         return 1;
90     }
91
92     // Retrieve a matrix of double at position 1.
93     sciErr = getMatrixOfDouble(pvApiCtx, piAddr1, &m1, &n1, &l1);
94     if (sciErr.iErr)
95     {
96         Scierror(202, _("%s: Wrong type for argument #%d: A real expected.\n"), fname, 1);
97         printError(&sciErr, 0);
98         return 1;
99     }
100
101     if (m1 * n1 == 0)
102     {
103         AssignOutputVariable(pvApiCtx, 1) = 0;
104         ReturnArguments(pvApiCtx);
105         return 0;
106     }
107     //get variable address
108     sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
109     if (sciErr.iErr)
110     {
111         printError(&sciErr, 0);
112         return 1;
113     }
114
115     // Retrieve a matrix of double at position 2.
116     sciErr = getMatrixOfDouble(pvApiCtx, piAddr2, &m2, &n2, &l2);
117     if (sciErr.iErr)
118     {
119         Scierror(202, _("%s: Wrong type for argument #%d: A real expected.\n"), fname, 2);
120         printError(&sciErr, 0);
121         return 1;
122     }
123
124     //get variable address
125     sciErr = getVarAddressFromPosition(pvApiCtx, 3, &piAddr3);
126     if (sciErr.iErr)
127     {
128         printError(&sciErr, 0);
129         return 1;
130     }
131
132     // Retrieve a matrix of double at position 3.
133     sciErr = getMatrixOfDouble(pvApiCtx, piAddr3, &m3, &n3, &l3);
134     if (sciErr.iErr)
135     {
136         Scierror(202, _("%s: Wrong type for argument #%d: A real expected.\n"), fname, 3);
137         printError(&sciErr, 0);
138         return 1;
139     }
140
141     //CheckSameDims
142     if (m1 != m2 || n1 != n2)
143     {
144         Scierror(999, _("%s: Wrong size for input argument #%d: %d-by-%d matrix expected.\n"), fname, 1, m1, n1);
145         return 1;
146     }
147
148     //CheckSameDims
149     if (m2 != m3 || n2 != n3)
150     {
151         Scierror(999, _("%s: Wrong size for input argument #%d: %d-by-%d matrix expected.\n"), fname, 2, m2, n2);
152         return 1;
153     }
154
155
156     if (get_optional_double_arg(pvApiCtx, fname, 4, "theta", &theta, 1, opts) == 0)
157     {
158         return 0;
159     }
160     if (get_optional_double_arg(pvApiCtx, fname, 5, "alpha", &alpha, 1, opts) == 0)
161     {
162         return 0;
163     }
164     if (get_labels_arg(pvApiCtx, fname, 6, opts, &labels) == 0)
165     {
166         return 0;
167     }
168     freeLabels = !isDefLegend(labels);
169     iflag_def[1] = 8;
170     ifl = &(iflag_def[1]);
171     if (get_optional_int_arg(pvApiCtx, fname, 7, "flag", &ifl, 2, opts) == 0)
172     {
173         if (freeLabels)
174         {
175             freeAllocatedSingleString(labels);
176         }
177         return 0;
178     }
179     iflag[0] = iflag_def[0];
180     iflag[1] = ifl[0];
181     iflag[2] = ifl[1];
182     if (get_optional_double_arg(pvApiCtx, fname, 8, "ebox", &ebox, 6, opts) == 0)
183     {
184         if (freeLabels)
185         {
186             freeAllocatedSingleString(labels);
187         }
188         return 0;
189     }
190
191     getOrCreateDefaultSubwin();
192
193     ix1 = m1 * n1;
194
195     /* NG beg */
196     isfac = -1;
197     izcol = 0;
198
199     Objplot3d (fname, &isfac, &izcol, (l1), (l2), (l3), (double *) NULL, &ix1, &one, theta, alpha, labels, iflag, ebox, &m1, &n1, &m2, &n2, &m3, &n3, &m3n, &n3n); /*Adding F.Leray 12.03.04 */
200
201
202     /* NG end */
203     if (freeLabels)
204     {
205         freeAllocatedSingleString(labels);
206     }
207     AssignOutputVariable(pvApiCtx, 1) = 0;
208     ReturnArguments(pvApiCtx);
209     return 0;
210 }
211 /*------------------------------------------------------------------------*/