Coverity: elementary_functions module memory errors fixed
[scilab.git] / scilab / modules / elementary_functions / sci_gateway / c / sci_nearfloat.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2006 - INRIA - Allan CORNET
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15 /*--------------------------------------------------------------------------*/
16 #include <string.h>
17 #include "gw_elementary_functions.h"
18 #include "basic_functions.h"
19 #include "api_scilab.h"
20 #include "Scierror.h"
21
22
23 int sci_nearfloat(char *fname, void* pvApiCtx)
24 {
25     SciErr sciErr;
26     int i;
27
28     int* piAddr1                                = NULL;
29     int iRows1                                  = 0;
30     int iCols1                                  = 0;
31     int iType1                                  = 0;
32     int* piLen                                  = NULL;
33     char **pstData                      = NULL;
34
35     int* piAddr2                                = NULL;
36     int iRows2                                  = 0;
37     int iCols2                                  = 0;
38     int iType2                                  = 0;
39     double *pdblReal            = NULL;
40
41     double dblMode                      = 0;
42
43     double *pdblRealRet = NULL;
44
45
46     CheckRhs(2, 2);
47     CheckLhs(1, 1);
48
49     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
50     if (sciErr.iErr)
51     {
52         printError(&sciErr, 0);
53         return 0;
54     }
55
56     sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
57     if (sciErr.iErr)
58     {
59         printError(&sciErr, 0);
60         return 0;
61     }
62
63     sciErr = getVarType(pvApiCtx, piAddr1, &iType1);
64     if (sciErr.iErr)
65     {
66         printError(&sciErr, 0);
67         return 0;
68     }
69
70     sciErr = getVarType(pvApiCtx, piAddr2, &iType2);
71     if (sciErr.iErr)
72     {
73         printError(&sciErr, 0);
74         return 0;
75     }
76
77     if (iType1 != sci_strings)
78     {
79         //Err = 1;
80         SciError(55);
81         return 0;
82     }
83
84     if (iType2 != sci_matrix)
85     {
86         //Err = 2;
87         SciError(53);
88         return 0;
89     }
90
91     sciErr = getMatrixOfString(pvApiCtx, piAddr1, &iRows1, &iCols1, NULL, NULL);
92     if (sciErr.iErr)
93     {
94         printError(&sciErr, 0);
95         return 0;
96     }
97
98     if (iRows1 != 1 || iCols1 != 1)
99     {
100         return 1;
101     }
102
103     piLen = (int*)malloc(sizeof(int) * iRows1 * iCols1);
104     sciErr = getMatrixOfString(pvApiCtx, piAddr1, &iRows1, &iCols1, piLen, NULL);
105     if (sciErr.iErr)
106     {
107         printError(&sciErr, 0);
108         free(piLen);
109         return 0;
110     }
111
112     pstData     = (char**)malloc(sizeof(char*) * iRows1 * iCols1);
113     for (i = 0 ; i < iRows1 * iCols1 ; i++)
114     {
115         pstData[i] = (char*)malloc(sizeof(char) * (piLen[i] + 1));//+1 for null termination
116     }
117
118     sciErr = getMatrixOfString(pvApiCtx, piAddr1, &iRows1, &iCols1, piLen, pstData);
119     if (sciErr.iErr)
120     {
121         printError(&sciErr, 0);
122         free(piLen);
123         for (i = 0 ; i < iRows1 * iCols1 ; i++)
124         {
125             free(pstData[i]);
126         }
127         free(pstData);
128         return 0;
129     }
130
131     sciErr = getMatrixOfDouble(pvApiCtx, piAddr2, &iRows2, &iCols2, &pdblReal);
132     if (sciErr.iErr)
133     {
134         printError(&sciErr, 0);
135         free(piLen);
136         for (i = 0 ; i < iRows1 * iCols1 ; i++)
137         {
138             free(pstData[i]);
139         }
140         free(pstData);
141         return 0;
142     }
143
144     if (strcmp(pstData[0], "succ") == 0)
145     {
146         dblMode = 1.0;
147     }
148     else if (strcmp(pstData[0], "pred") == 0)
149     {
150         dblMode = -1.0;
151     }
152     else
153     {
154         SciError(999);
155         free(piLen);
156         for (i = 0 ; i < iRows1 * iCols1 ; i++)
157         {
158             free(pstData[i]);
159         }
160         free(pstData);
161         return 0;
162     }
163
164     sciErr = allocMatrixOfDouble(pvApiCtx, Rhs + 1, iRows2, iCols2, &pdblRealRet);
165     if (sciErr.iErr)
166     {
167         printError(&sciErr, 0);
168         free(piLen);
169         for (i = 0 ; i < iRows1 * iCols1 ; i++)
170         {
171             free(pstData[i]);
172         }
173         free(pstData);
174         return 0;
175     }
176
177     for (i = 0 ; i < iRows2 * iCols2 ; i++)
178     {
179         pdblRealRet[i] = dblNearFloat(pdblReal[i], dblMode);
180     }
181
182     free(piLen);
183     for (i = 0 ; i < iRows1 * iCols1 ; i++)
184     {
185         free(pstData[i]);
186     }
187     free(pstData);
188
189     LhsVar(1) = Rhs + 1;
190     PutLhsVar();
191     return 0;
192 }
193 /*--------------------------------------------------------------------------*/