* Port to matio 1.5.0 * Code cleaning * Prepare code for Scilab 6 (YaSp branch merge)
[scilab.git] / scilab / modules / matio / src / c / GetDoubleVariable.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Vincent COUVERT
4  * Copyright (C) 2010 - DIGITEO - Yann COLLETTE
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 #include "GetMatlabVariable.h"
15 #include "sci_types.h"
16 #include "api_scilab.h"
17
18 matvar_t * GetDoubleVariable(void *pvApiCtx, int iVar, const char* name, int matfile_version, int * parent, int item_position)
19 {
20     double * realDataAdr = NULL, * complexDataAdr = NULL;
21     int i = 0;
22     int rank = 0;
23     int *piDims = NULL;
24     size_t *pszDims = NULL;
25     int isComplex = 0;
26     struct mat_complex_split_t mat5ComplexData;
27     matvar_t *createdVar = NULL;
28     int * var_addr = NULL;
29     int * item_addr = NULL;
30     int var_type;
31     SciErr sciErr;
32
33     if (parent == NULL)
34     {
35         sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &var_addr);
36         if (sciErr.iErr)
37         {
38             printError(&sciErr, 0);
39             return 0;
40         }
41         sciErr = getVarType(pvApiCtx, var_addr, &var_type);
42         if (sciErr.iErr)
43         {
44             printError(&sciErr, 0);
45             return 0;
46         }
47         isComplex = isVarComplex(pvApiCtx, var_addr);
48     }
49     else
50     {
51         sciErr = getListItemAddress(pvApiCtx, parent, item_position, &item_addr);
52         if (sciErr.iErr)
53         {
54             printError(&sciErr, 0);
55             return 0;
56         }
57         sciErr = getVarType(pvApiCtx, item_addr, &var_type);
58         if (sciErr.iErr)
59         {
60             printError(&sciErr, 0);
61             return 0;
62         }
63         isComplex = isVarComplex(pvApiCtx, item_addr);
64     }
65
66     if (var_type == sci_matrix) /* 2-D array */
67     {
68         rank = 2;
69         if ((piDims = (int*)MALLOC(sizeof(int) * rank)) == NULL)
70         {
71             Scierror(999, _("%s: No more memory.\n"), "GetDoubleVariable");
72             return NULL;
73         }
74         if ((pszDims = (size_t*)MALLOC(sizeof(size_t) * rank)) == NULL)
75         {
76             Scierror(999, _("%s: No more memory.\n"), "GetDoubleVariable");
77             return NULL;
78         }
79
80         if (isComplex)
81         {
82             if (parent == NULL)
83             {
84                 sciErr = getComplexMatrixOfDouble(pvApiCtx, var_addr, &piDims[0], &piDims[1], &realDataAdr, &complexDataAdr);
85                 if (sciErr.iErr)
86                 {
87                     printError(&sciErr, 0);
88                     return 0;
89                 }
90             }
91             else
92             {
93                 sciErr = getComplexMatrixOfDoubleInList(pvApiCtx, parent, item_position, &piDims[0], &piDims[1],
94                                                         &realDataAdr, &complexDataAdr);
95                 if (sciErr.iErr)
96                 {
97                     printError(&sciErr, 0);
98                     return 0;
99                 }
100             }
101         }
102         else
103         {
104             if (parent == NULL)
105             {
106                 sciErr = getMatrixOfDouble(pvApiCtx, var_addr, &piDims[0], &piDims[1], &realDataAdr);
107                 if (sciErr.iErr)
108                 {
109                     printError(&sciErr, 0);
110                     return 0;
111                 }
112             }
113             else
114             {
115                 sciErr = getMatrixOfDoubleInList(pvApiCtx, parent, item_position, &piDims[0], &piDims[1], &realDataAdr);
116                 if (sciErr.iErr)
117                 {
118                     printError(&sciErr, 0);
119                     return 0;
120                 }
121             }
122         }
123
124         for (i = 0; i < rank; i++)
125         {
126             pszDims[i] = piDims[i];
127         }
128
129         if (isComplex == 0)
130         {
131             createdVar = Mat_VarCreate(name, MAT_C_DOUBLE, MAT_T_DOUBLE, rank, pszDims, realDataAdr, 0);
132         }
133         else
134         {
135             if (matfile_version == MAT_FT_MAT4) /* MATLAB4: data is a table of value */
136             {
137                 createdVar = Mat_VarCreate(name, MAT_C_DOUBLE, MAT_T_DOUBLE, rank, pszDims, realDataAdr, MAT_F_COMPLEX);
138             }
139             else /* MATLAB5 file: data is a mat_complex_split_t */
140             {
141                 mat5ComplexData.Re = realDataAdr;
142                 mat5ComplexData.Im = complexDataAdr;
143                 createdVar = Mat_VarCreate(name, MAT_C_DOUBLE, MAT_T_DOUBLE, rank, pszDims, &mat5ComplexData, MAT_F_COMPLEX);
144             }
145             createdVar->isComplex = 1;
146         }
147     }
148     else
149     {
150         Scierror(999, _("%s: Wrong type for first input argument: Double matrix expected.\n"), "GetDoubleVariable");
151     }
152
153     FREE(piDims);
154     FREE(pszDims);
155
156     return createdVar;
157 }