20d131eb7e1c7e2c9331d19b4dda002475b7925d
[scilab.git] / scilab / modules / matio / src / c / GetStructVariable.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  * Copyright (C) 2011 - DIGITEO - Vincent COUVERT
6  * 
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at    
11  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
12  *
13  */
14
15 #include "GetMatlabVariable.h"
16 #include "api_scilab.h"
17 #include "freeArrayOfString.h"
18
19 matvar_t *GetStructVariable(int iVar, const char *name, int matfile_version, char **fieldNames, int nbFields, int * parent, int item_position)
20 {
21     int fieldIndex = 0;
22     int valueIndex = 0;
23     int K = 0;
24     int prodDims = 1;
25     matvar_t *dimensionsVariable = NULL;
26     matvar_t **structEntries = NULL;
27     int * var_addr = NULL;
28     int * list_addr = NULL;
29     SciErr sciErr;
30
31     if (parent==NULL)
32     {
33         sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &var_addr);
34     }
35     else
36     {
37         sciErr = getListItemAddress(pvApiCtx, parent, item_position, &var_addr);
38     }
39     if(sciErr.iErr)
40     {
41         printError(&sciErr, 0);
42         return NULL;
43     }
44
45     /* FIRST LIST ENTRY: fieldnames --> NO NEED TO BE READ */
46
47     /* SECOND LIST ENTRY: dimensions */
48     /* Second input argument = "data" beacause we do not need to give the format because this variable is just temp */ 
49     dimensionsVariable = GetMatlabVariable(iVar, "data", 0, var_addr, 2);
50
51     /* Total number of entries */
52     for (K=0; K<dimensionsVariable->rank; K++)
53     {
54         prodDims *= ((int *)dimensionsVariable->data)[K];
55     }
56
57     /* OTHERS LIST ENTRIES: ALL STRUCT VALUES */
58     if ((structEntries = (matvar_t **) MALLOC (sizeof(matvar_t*)*(prodDims*(nbFields-2)+1))) == NULL)
59     {
60         Scierror(999, _("%s: No more memory.\n"), "GetStructVariable");
61         freeArrayOfString(fieldNames, nbFields);
62         return NULL;
63     }
64     for (K = 0; K < prodDims*(nbFields-2)+1; K++)
65     {
66         structEntries[K] = NULL;
67     }
68
69     if (prodDims == 1) /* Scalar struct array */
70     {
71         for (fieldIndex = 2; fieldIndex < nbFields; fieldIndex++)
72         {
73             structEntries[fieldIndex - 2] = GetMatlabVariable(iVar ,fieldNames[fieldIndex], matfile_version, var_addr, fieldIndex+1);
74         }
75     }
76     else
77     {
78         /* All the values of each field are stored in a list */
79
80         /* Read all entries */
81         for (fieldIndex = 2; fieldIndex < nbFields; fieldIndex++)
82         {
83             sciErr = getListInList(pvApiCtx, var_addr, fieldIndex+1, &list_addr);
84             if(sciErr.iErr)
85             {
86                 printError(&sciErr, 0);
87                 return NULL;
88             }
89
90             for (valueIndex = 0; valueIndex < prodDims; valueIndex++)
91             {
92                 structEntries[(fieldIndex-1) + (nbFields-2)*valueIndex] = GetMatlabVariable(iVar ,fieldNames[fieldIndex], matfile_version, list_addr, valueIndex+1);
93             }
94         }
95     }
96
97     return Mat_VarCreate(name, MAT_C_STRUCT, MAT_T_STRUCT, dimensionsVariable->rank, dimensionsVariable->data, structEntries, 0);
98 }