lib file was not embedded in the binary version
[scilab.git] / scilab / modules / signal_processing / sci_gateway / c / sci_delip.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2006 - INRIA - Allan CORNET
4  * Copyright (C) 2009 - Digiteo - Vincent LIARD
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 #include "api_scilab.h"
14 #include "gw_signal.h"
15 #include "stack-c.h"
16 #include "MALLOC.h"
17 #include "Scierror.h"
18 #include "localization.h"
19
20 extern void C2F(delip)(int *length,
21                        double *output_real, double *output_imaginary,
22                        double *x, double *ck);
23
24 int sci_delip(char *fname, int* _piKey)
25 {
26   enum {real, complex} return_type;
27   int rows, cols, type, x_rows, x_cols, length, i;
28   double *argument, *output_real, *output_imaginary, *x, ck;
29   int *p;
30
31   CheckRhs(2,2);
32   CheckLhs(1,1);
33
34   /* arg1: x */
35   getVarAddressFromPosition(_piKey, 1, &p);
36         getVarType(_piKey, p, &type);
37   if (type != sci_matrix || isVarComplex(_piKey, p)) {
38     Scierror(999, _("%s: Wrong type for argument %d: Real matrix expected.\n"), fname, 1);
39     return 1;
40   }
41   // GetRhsVarMatrixDouble(1, &x_rows, &x_cols, &x);
42   getMatrixOfDouble(_piKey, p, &x_rows, &x_cols, &x);
43   length = x_cols * x_rows;
44   for (i = 0, return_type = real ; i < length ; i++) {
45     if (x[i] < 0) {
46       Scierror(999, _("%s: Wrong value for input argument #%d: Must be in the interval [%s, %s].\n"), fname, 1, "0", "+INF");
47       return 1;
48     }
49     else if (x[i] > 1) {
50       return_type = complex;
51     }
52   }
53
54   /* arg2: ck */
55   getVarAddressFromPosition(_piKey, 2, &p);
56   // GetVarDimension(2, &rows, &cols);
57   getVarDimension(_piKey, p, &rows, &cols);
58   getVarType(_piKey, p, &type);
59
60   if (type != sci_matrix || rows != 1 || cols != 1 || isVarComplex(_piKey, p)) {
61     Scierror(999, _("%s: Wrong type for input argument #%d: Real scalar expected.\n"), fname, 2);
62     return 1;
63   }
64   // GetRhsVarMatrixDouble(2, &rows, &cols, &argument);
65   getMatrixOfDouble(_piKey, p, &rows, &cols, &argument);
66   ck = argument[0];
67   if (ck < -1 || ck > 1) {
68       Scierror(999, _("%s: Wrong value for input argument #%d: Must be in the interval [%s, %s].\n"), fname, 2, "-1", "1");
69       return 1;
70   }
71
72   switch (return_type) {
73   case real:
74     // iAllocMatrixOfDouble(Rhs + 1, x_rows, x_cols, &output_real);
75     allocMatrixOfDouble(_piKey, Rhs + 1, x_rows, x_cols, &output_real);
76     createMatrixOfDouble(_piKey, Rhs + 1, x_rows, x_cols, output_real);
77     /* allocate a useless return buffer to securize delip's call */
78     output_imaginary = (double *)MALLOC(length * sizeof(double));
79     if (output_imaginary == NULL) {
80       Scierror(999, _("%s : Memory allocation error.\n"), fname);
81       return 1;
82     }
83     break;
84   case complex:
85     // iAllocComplexMatrixOfDouble(Rhs + 1, x_rows, x_cols, &output_real, &output_imaginary);
86     allocComplexMatrixOfDouble(_piKey, Rhs + 1, x_rows, x_cols, &output_real, &output_imaginary);
87     createComplexMatrixOfDouble(_piKey, Rhs + 1, x_rows, x_cols, output_real, output_imaginary);
88     break;
89   }
90   C2F(delip)(&length, output_real, output_imaginary, x, &ck);
91   if (return_type == real) {
92     FREE(output_imaginary);
93     output_imaginary = NULL;
94   }
95   LhsVar(1) = Rhs + 1;
96   PutLhsVar();
97   return 0;
98 }