signal_processing plugged.
[scilab.git] / scilab / modules / signal_processing / sci_gateway / cpp / sci_delip.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2011 - DIGITEO - Antoine ELIAS
4 *
5 * This file must be used under the terms of the CeCILL.
6 * This source file is licensed as described in the file COPYING, which
7 * you should have received as part of this distribution.  The terms
8 * are also available at
9 * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10 *
11 */
12 /*--------------------------------------------------------------------------*/
13
14 #include "signal_gw.hxx"
15 #include "double.hxx"
16 #include "function.hxx"
17
18 extern "C"
19 {
20 #include "localization.h"
21 #include "Scierror.h"
22
23 extern void C2F(delip)(int *length,
24                        double *output_real, double *output_imaginary,
25                        double *x, double *ck);
26 }
27
28 /*--------------------------------------------------------------------------*/
29 types::Function::ReturnValue sci_delip(types::typed_list &in, int _iRetCount, types::typed_list &out)
30 {
31     bool bBecomeComplex = false;
32     //check input parameters
33     if(in.size() != 2)
34     {
35         ScierrorW(77, _W("%ls: Wrong number of input argument(s): %d expected.\n"), L"delip", 2);
36         return types::Function::Error;
37     }
38
39     //check first input parameter : x
40     if(in[0]->isDouble() == false || in[0]->getAs<types::Double>()->isComplex() == true)
41     {
42         ScierrorW(999, _W("%ls: Wrong type for argument %d: Real matrix expected.\n"), L"delip", 1);
43         return types::Function::Error;
44     }
45
46     types::Double* pIn1 = in[0]->getAs<types::Double>();
47     double* pdblIn1 = pIn1->get();
48     int iSize = pIn1->getSize();
49
50     for(int i = 0 ; i < iSize ; i++)
51     {
52         if(pdblIn1[i] < 0)
53         {
54             ScierrorW(999, _W("%ls: Wrong value for input argument #%d: Must be in the interval [%ls, %ls].\n"), L"delip", 1, L"0", L"+INF");
55             return types::Function::Error;
56         }
57         else if(pdblIn1[i] > 1)
58         {
59             bBecomeComplex = true;
60         }
61     }
62
63     //check second input parameter : ck
64     if(in[1]->isDouble() == false || in[1]->getAs<types::Double>()->isScalar() == false || in[1]->getAs<types::Double>()->isComplex() == true)
65     {
66         ScierrorW(999, _W("%ls: Wrong type for input argument #%d: Real scalar expected.\n"), L"delip", 2);
67         return types::Function::Error;
68     }
69
70     double pdblCK = in[1]->getAs<types::Double>()->get(0);
71     if(pdblCK < -1 || pdblCK > 1)
72     {
73       ScierrorW(999, _W("%ls: Wrong value for input argument #%d: Must be in the interval [%ls, %ls].\n"), L"delip", 2, L"-1", L"1");
74       return types::Function::OK;
75     }
76
77     //alloc output parameter
78     types::Double* pOut = new types::Double(pIn1->getRows(), pIn1->getCols(), true);
79
80     //call math function
81     C2F(delip)(&iSize, pOut->getReal(), pOut->getImg(), pIn1->get(), &pdblCK);
82
83     //update complexity of output parameter
84     pOut->setComplex(bBecomeComplex);
85
86     out.push_back(pOut);
87     return types::Function::OK;
88 }