Coverity: elementary_functions module memory errors fixed
[scilab.git] / scilab / modules / elementary_functions / sci_gateway / c / sci_testmatrix.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 "gw_elementary_functions.h"
17 #include "basic_functions.h"
18 #include "Scierror.h"
19 #include "api_scilab.h"
20
21 #define MAGI_LETTER             'm'
22 #define FRK_LETTER              'f'
23 #define HILB_LETTER             'h'
24
25 char getGenerateMode(void* pvApiCtx, int* _piAddress);
26 int getGenerateSize(void* pvApiCtx, int* _piAddress);
27 /*--------------------------------------------------------------------------*/
28 int sci_testmatrix(char *fname, void* pvApiCtx)
29 {
30     SciErr sciErr;
31     int iRet                                            = 0;
32
33     int iRows1                                  = 0;
34     int iCols1                                  = 0;
35     int* piAddr1                                = NULL;
36     char cMode                                  = 0;
37
38
39     int iRows2                                  = 0;
40     int iCols2                                  = 0;
41     int* piAddr2                                = NULL;
42     int iDim                                            = 0;
43
44     double *pdblRealRet = NULL;
45
46     CheckRhs(2, 2);
47     CheckLhs(1, 1);
48
49     /*check input 1*/
50     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
51     if (sciErr.iErr)
52     {
53         printError(&sciErr, 0);
54         return 0;
55     }
56
57     sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
58     if (sciErr.iErr)
59     {
60         printError(&sciErr, 0);
61         return 0;
62     }
63
64     cMode = getGenerateMode(pvApiCtx, piAddr1);
65
66     if (cMode == -1)
67     {
68         return 1;
69     }
70
71     iDim = getGenerateSize(pvApiCtx, piAddr2);
72
73
74     if (cMode != FRK_LETTER && cMode != HILB_LETTER && iDim == 2)
75     {
76         iDim = 0;
77     }
78
79     if (iDim == 0)
80     {
81         iRet = createEmptyMatrix(pvApiCtx, Rhs + 1);
82         if (iRet)
83         {
84             return 1;
85         }
86         LhsVar(1) = Rhs + 1;
87         PutLhsVar();
88         return 0;
89     }
90
91     sciErr = allocMatrixOfDouble(pvApiCtx, Rhs + 1, iDim, iDim, &pdblRealRet);
92     if (sciErr.iErr)
93     {
94         printError(&sciErr, 0);
95         return 0;
96     }
97
98     switch (cMode)
99     {
100         case FRK_LETTER :
101             franck_matrix(iDim, pdblRealRet);
102             break;
103         case HILB_LETTER :
104             hilb_matrix(iDim, pdblRealRet);
105             break;
106         default : //Magic case and others
107             magic_matrix(iDim, pdblRealRet);
108             break;
109     }
110
111     LhsVar(1) = Rhs + 1;
112     PutLhsVar();
113     return 0;
114 }
115
116 char getGenerateMode(void* pvApiCtx, int* _piAddress)
117 {
118     int iRet = 0;
119
120     char* pstData;
121     char ret;
122     iRet = getAllocatedSingleString(pvApiCtx, _piAddress, &pstData);
123     if (iRet)
124     {
125         return -1;
126     }
127     ret = pstData[0];
128     freeAllocatedSingleString(pstData);
129     return ret;
130 }
131
132 int getGenerateSize(void* pvApiCtx, int* _piAddress)
133 {
134     SciErr sciErr;
135     int iRet = 0;
136     int iRows = 0;
137     int iCols = 0;
138
139     double* pdblReal = NULL;
140     double* pdblImg      = NULL;
141
142     if (isVarComplex(pvApiCtx, _piAddress))
143     {
144         sciErr = getComplexMatrixOfDouble(pvApiCtx, _piAddress, &iRows, &iCols, &pdblReal, &pdblImg);
145         if (sciErr.iErr)
146         {
147             printError(&sciErr, 0);
148             return 0;
149         }
150     }
151     else
152     {
153         sciErr = getMatrixOfDouble(pvApiCtx, _piAddress, &iRows, &iCols, &pdblReal);
154         if (sciErr.iErr)
155         {
156             printError(&sciErr, 0);
157             return 0;
158         }
159     }
160     return abs((int)pdblReal[0]);
161
162 }
163 /*--------------------------------------------------------------------------*/