License Header change: Removed the LICENSE_END before beta
[scilab.git] / scilab / modules / api_scilab / tests / unit_tests / poly_reading_api.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009-2010 - DIGITEO
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 #include "api_scilab.h"
17 #include "Scierror.h"
18 #include "localization.h"
19 #include "sciprint.h"
20 #include "sci_malloc.h"
21
22 int read_poly(char *fname, void* pvApiCtx)
23 {
24     SciErr sciErr;
25     int i, j;
26     //variable info
27     int iRows                   = 0;
28     int iCols                   = 0;
29     int iVarLen                 = 0;
30     int* piAddr                 = NULL;
31     int* piNbCoef               = NULL;
32     double** pdblReal   = NULL;
33     double** pdblImg    = NULL;
34     char* pstVarname    = NULL;
35
36     //check input and output arguments
37     CheckInputArgument(pvApiCtx, 1, 1);
38     CheckOutputArgument(pvApiCtx, 1, 1);
39
40     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
41     if (sciErr.iErr)
42     {
43         printError(&sciErr, 0);
44         return 0;
45     }
46
47     if (isVarComplex(pvApiCtx, piAddr) == FALSE)
48     {
49         //Error
50         return 0;
51     }
52
53     //get variable name length
54     sciErr = getPolyVariableName(pvApiCtx, piAddr, NULL, &iVarLen);
55     if (sciErr.iErr)
56     {
57         printError(&sciErr, 0);
58         return 0;
59     }
60
61     //alloc buff to receive variable name
62     pstVarname = (char*)MALLOC(sizeof(char) * (iVarLen + 1));//1 for null termination
63
64     //get variable name
65     sciErr = getPolyVariableName(pvApiCtx, piAddr, pstVarname, &iVarLen);
66     if (sciErr.iErr)
67     {
68         printError(&sciErr, 0);
69         return 0;
70     }
71
72     //First call: retrieve dimmension
73     sciErr = getComplexMatrixOfPoly(pvApiCtx, piAddr, &iRows, &iCols, NULL, NULL, NULL);
74     if (sciErr.iErr)
75     {
76         printError(&sciErr, 0);
77         return 0;
78     }
79
80     //alloc array of coefficient
81     piNbCoef = (int*)MALLOC(sizeof(int) * iRows * iCols);
82
83     //Second call: retrieve coefficient
84     sciErr = getComplexMatrixOfPoly(pvApiCtx, piAddr, &iRows, &iCols, piNbCoef, NULL, NULL);
85     if (sciErr.iErr)
86     {
87         printError(&sciErr, 0);
88         return 0;
89     }
90
91     //alloc arrays of data
92     pdblReal    = (double**)MALLOC(sizeof(double*) * iRows * iCols);
93     pdblImg     = (double**)MALLOC(sizeof(double*) * iRows * iCols);
94
95     for (i = 0 ; i < iRows * iCols ; i++)
96     {
97         pdblReal[i] = (double*)MALLOC(sizeof(double) * piNbCoef[i]);
98         pdblImg[i] = (double*)MALLOC(sizeof(double) * piNbCoef[i]);
99     }
100
101     //Third call: retrieve data
102     sciErr = getComplexMatrixOfPoly(pvApiCtx, piAddr, &iRows, &iCols, piNbCoef, pdblReal, pdblImg);
103     if (sciErr.iErr)
104     {
105         printError(&sciErr, 0);
106         return 0;
107     }
108
109     //Do something with Data
110     //Invert polynomials in the matrix and invert coefficients
111     for (i = 0 ; i < (iRows * iCols) / 2 ; i++)
112     {
113         int iPos1                       = iRows * iCols - 1 - i;
114         double* pdblSave        = NULL;
115         int iNbCoefSave         = 0;
116         //switch array of coefficient
117         pdblSave                        = pdblReal[i];
118         pdblReal[i]                     = pdblReal[iPos1];
119         pdblReal[iPos1]         = pdblSave;
120         pdblSave                        = pdblImg[i];
121         pdblImg[i]                      = pdblImg[iPos1];
122         pdblImg[iPos1]          = pdblSave;
123         //switch number of coefficient
124         iNbCoefSave                     = piNbCoef[i];
125         piNbCoef[i]                     = piNbCoef[iPos1];
126         piNbCoef[iPos1]         = iNbCoefSave;
127     }
128
129     //switch coefficient
130     for (i = 0 ; i < iRows * iCols ; i++)
131     {
132         for (j = 0 ; j < piNbCoef[i] / 2 ; j++)
133         {
134             int iPos2                   = piNbCoef[i] - 1 - j;
135             double dblVal               = pdblReal[i][j];
136             pdblReal[i][j]              = pdblReal[i][iPos2];
137             pdblReal[i][iPos2]  = dblVal;
138             dblVal                              = pdblImg[i][j];
139             pdblImg[i][j]               = pdblImg[i][iPos2];
140             pdblImg[i][iPos2]   = dblVal;
141         }
142     }
143
144     sciErr = createComplexMatrixOfPoly(pvApiCtx, nbInputArgument(pvApiCtx) + 1, pstVarname, iRows, iCols, piNbCoef, pdblReal, pdblImg);
145     if (sciErr.iErr)
146     {
147         printError(&sciErr, 0);
148         return 0;
149     }
150
151     //free OS memory
152     FREE(pstVarname);
153     FREE(piNbCoef);
154     for (i = 0 ; i < iRows * iCols ; i++)
155     {
156         FREE(pdblReal[i]);
157         FREE(pdblImg[i]);
158     }
159     FREE(pdblReal);
160     FREE(pdblImg);
161     //assign allocated variables to Lhs position
162     AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
163     return 0;
164 }