linear_algebra plugged.
[scilab.git] / scilab / modules / linear_algebra / sci_gateway / cpp / sci_rcond.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2009 - DIGITEO - Bernard HUGUENEY
4 * Copyright (C) 2011 - DIGITEO - Cedric DELAMARRE
5 *
6 * This file must be used under the terms of the CeCILL.
7 * This source file is licensed as described in the file COPYING, which
8 * you should have received as part of this distribution.  The terms
9 * are also available at
10 * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11 *
12 */
13 /*--------------------------------------------------------------------------*/
14
15 #include "linear_algebra_gw.hxx"
16 #include "function.hxx"
17 #include "double.hxx"
18 #include "overload.hxx"
19 #include "execvisitor.hxx"
20
21 extern "C"
22 {
23 #include "localization.h"
24 #include "Scierror.h"
25 #include "rcond.h"
26 }
27 /*--------------------------------------------------------------------------*/
28
29 types::Function::ReturnValue sci_rcond(types::typed_list &in, int _iRetCount, types::typed_list &out)
30 {
31     types::Double* pDbl     = NULL;
32     types::Double* result   = NULL;
33     int iRet                = 0;
34
35     if(in.size() != 1)
36     {
37         ScierrorW(77, _W("%ls: Wrong number of input argument(s): %d expected.\n"), L"rcond", 1);
38         return types::Function::Error;
39     }
40
41     if((in[0]->isDouble() == false))
42     {
43         std::wstring wstFuncName = L"%"  + in[0]->getShortTypeStr() + L"_rcond";
44         return Overload::call(wstFuncName, in, _iRetCount, out, new ExecVisitor());
45     }
46
47     pDbl = in[0]->getAs<types::Double>();
48
49     if(pDbl->getRows() != pDbl->getCols())
50     {
51                 ScierrorW(20, _W("%ls: Wrong type for argument %d: Square matrix expected.\n"), L"rcond", 1);
52         return types::Function::Error;            
53     }
54
55     if(pDbl->getRows() == 0)
56     {
57         out.push_back(types::Double::Empty());
58         return types::Function::OK;
59     }
60     else if(pDbl->getRows() == -1) // manage eye case
61     {
62         out.push_back(new types::Double(1));
63         return types::Function::OK;
64     }
65
66     result = new types::Double(1,1);
67
68     if(pDbl->isComplex())
69     {
70         double* pData = (double*)oGetDoubleComplexFromPointer(pDbl->getReal(), pDbl->getImg(), pDbl->getSize());
71         iRet = iRcondM(pData, pDbl->getCols(), true /*isComplex*/, result->get());
72                 vFreeDoubleComplexFromPointer((doublecomplex*)pData);
73     }
74     else
75     {
76         iRet = iRcondM(pDbl->get(), pDbl->getCols(), false /*isComplex*/, result->get());
77     }
78
79     if(iRet == -1)
80     {
81                 ScierrorW(999, _W("%ls: Allocation failed.\n"), L"rcond");
82         return types::Function::Error;
83     }
84
85     out.push_back(result);
86     return types::Function::OK;
87 }
88 /*--------------------------------------------------------------------------*/
89