* Bug 16617 fixed: gamma() extended to incomplete cases
[scilab.git] / scilab / modules / special_functions / sci_gateway / cpp / sci_gamma.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2014 - Scilab Enterprises - Sylvain Genin
4  *
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 #include "special_functions_gw.hxx"
18 #include "function.hxx"
19 #include "double.hxx"
20 #include "overload.hxx"
21
22 extern "C"
23 {
24 #include "Scierror.h"
25 #include "localization.h"
26     extern double C2F(dgammacody)(double*);
27 }
28
29 /*--------------------------------------------------------------------------*/
30 types::Function::ReturnValue sci_gamma(types::typed_list &in, int _iRetCount, types::typed_list &out)
31 {
32     if (in.size() < 1)
33     {
34         Scierror(77, _("%s: Wrong number of input arguments: At least %d expected.\n"), "gamma", 1);
35         return types::Function::Error;
36     }
37
38     if (in.size() > 1 || in[0]->isDouble() == false)
39     {
40         std::wstring wstFuncName = L"%" + in[0]->getShortTypeStr() + L"_gamma";
41         return Overload::call(wstFuncName, in, _iRetCount, out);
42     }
43
44     /***** get data *****/
45     types::Double* pDblIn = in[0]->getAs<types::Double>();
46
47     if (pDblIn->isComplex() || pDblIn->getDims() > 2)
48     {
49         return Overload::call(L"%s_gamma", in, _iRetCount, out);
50     }
51
52     types::Double* pDblOut = new types::Double(pDblIn->getDims(), pDblIn->getDimsArray());
53
54     double* pDblValIn  = pDblIn->getReal();
55     double* pDblValOut = pDblOut->getReal();
56
57     /***** perform operation *****/
58     for (int i = 0; i < pDblIn->getSize(); i++)
59     {
60         pDblValOut[i] = C2F(dgammacody)(pDblValIn + i);
61     }
62
63     /***** return data *****/
64     out.push_back(pDblOut);
65     return types::Function::OK;
66 }
67 /*--------------------------------------------------------------------------*/