Coverity #1321093 fixed
[scilab.git] / scilab / modules / interpolation / sci_gateway / cpp / sci_cshep2d.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2011 - DIGITEO - Cedric DELAMARRE
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
17 #include "interpolation_gw.hxx"
18 #include "function.hxx"
19 #include "double.hxx"
20 #include "string.hxx"
21 #include "tlist.hxx"
22 #include "int.hxx"
23
24 extern "C"
25 {
26 #include "localization.h"
27 #include "Scierror.h"
28 #include "interpolation_functions.h"
29 }
30 /*--------------------------------------------------------------------------*/
31
32 types::Function::ReturnValue sci_cshep2d(types::typed_list &in, int _iRetCount, types::typed_list &out)
33 {
34     //input
35     types::Double* pDblXYZ = NULL;
36
37     //output
38     types::TList* pTListCoef = NULL;
39
40     const wchar_t * wcsStr[] = {L"cshep2d", L"xyz", L"lcell", L"lnext", L"grdim", L"rmax", L"rw", L"a"};
41
42     // *** check the minimal number of input args. ***
43     if (in.size() != 1)
44     {
45         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "cshep2d", 1);
46         return types::Function::Error;
47     }
48
49     // *** check number of output args according the methode. ***
50     if (_iRetCount > 1)
51     {
52         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "cshep2d", 1);
53         return types::Function::Error;
54     }
55
56     // *** check type of input args and get it. ***
57     //xyz
58     if (in[0]->isDouble() == false)
59     {
60         Scierror(999, _("%s: Wrong type for input argument #%d : A matrix expected.\n"), "cshep2d", 1);
61         return types::Function::Error;
62     }
63
64     pDblXYZ = in[0]->getAs<types::Double>()->clone()->getAs<types::Double>();
65
66     if (pDblXYZ->isComplex())
67     {
68         Scierror(999, _("%s: Wrong type for argument #%d: Real matrix expected.\n"), "cshep2d", 1);
69         return types::Function::Error;
70     }
71
72     if (pDblXYZ->getCols() != 3 || pDblXYZ->getRows() < 10)
73     {
74         Scierror(999, _("%s: Wrong size for input argument #%d : A matrix of size n x 3 expected.(n >= 10)\n"), "cshep2d", 1);
75         return types::Function::Error;
76     }
77
78     // *** Perform operation. ***
79     // choise for nc (can be a futur optionnal parameter)
80     int nc = std::min(17, pDblXYZ->getRows() - 1);
81     // choise for nw
82     int nw = std::min(30, pDblXYZ->getRows() - 1);
83     // choise for nr (grid nr x nr)
84     int nr = (int) sqrt(pDblXYZ->getRows() / 3.0); // comme n >= 10 nr >= 1
85
86     pTListCoef = new types::TList();
87
88     types::String* pStr = new types::String(1, 8);
89     pStr->set(wcsStr);
90
91     types::Int32* pInt32Cell    = new types::Int32(nr, nr);
92     types::Int32* pInt32Next    = new types::Int32(1, pDblXYZ->getRows());
93     types::Double* pDblGrid     = new types::Double(1, 4);
94     types::Double* pDblRMax     = new types::Double(1, 1);
95     types::Double* pDblRW       = new types::Double(1, pDblXYZ->getRows());
96     types::Double* pDblA        = new types::Double(9, pDblXYZ->getRows());
97
98     int ier = 0;
99     int rows = pDblXYZ->getRows();
100
101     C2F(cshep2)(&rows, pDblXYZ->get(), pDblXYZ->get() + rows, pDblXYZ->get() + (2 * rows),
102                 &nc, &nw, &nr, pInt32Cell->get(), pInt32Next->get(), pDblGrid->get(),
103                 pDblGrid->get() + 1, pDblGrid->get() + 2, pDblGrid->get() + 3,
104                 pDblRMax->get(), pDblRW->get(), pDblA->get(), &ier);
105
106     if (ier != 0)
107     {
108         Scierror(999, _("%s: Duplicate nodes or all nodes colinears (ier = %d).\n"), "cshep2d", ier);
109         delete pTListCoef;
110         delete pStr;
111         delete pInt32Cell;
112         delete pInt32Next;
113         delete pDblGrid;
114         delete pDblRMax;
115         delete pDblRW;
116         delete pDblA;
117         return types::Function::Error;
118     }
119
120
121     // *** Return result in Scilab. ***
122     pTListCoef->append(pStr);
123     pTListCoef->append(pDblXYZ);
124     pTListCoef->append(pInt32Cell);
125     pTListCoef->append(pInt32Next);
126     pTListCoef->append(pDblGrid);
127     pTListCoef->append(pDblRMax);
128     pTListCoef->append(pDblRW);
129     pTListCoef->append(pDblA);
130
131     out.push_back(pTListCoef);
132
133     return types::Function::OK;
134 }
135