2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2012 - DIGITEO - Antoine ELIAS
5 * This file must be used under the terms of the CeCILL.
6 * This source file is licensed as described in the file COPYING, which
7 * you should have received as part of this distribution. The terms
8 * are also available at
9 * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
20 #include "localization.h"
22 #include "api_scilab.h"
23 #include "../../../call_scilab/includes/call_scilab.h"
24 #include "h5_fileManagement.h"
25 #include "h5_readDataFromFile_v1.h"
26 #include "expandPathVariable.h"
31 typedef struct __VAR_INFO_V1__
40 __VAR_INFO_V1__() : iType(0), iSize(0), iDims(0) {}
43 static bool read_data_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
44 static bool read_double_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
45 static bool read_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
46 static bool read_boolean_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
47 static bool read_integer_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
48 static bool read_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
49 static bool read_boolean_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
50 static bool read_poly_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
51 static bool read_list_v1(int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
52 static bool read_void_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
53 static bool read_undefined_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
55 static void generateInfo_v1(VarInfo_v1* _pInfo, const char* _pstType);
57 int sci_listvar_in_hdf5_v1(char *fname, unsigned long fname_len)
64 VarInfo_v1* pInfo = NULL;
69 sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
72 printError(&sciErr, 0);
76 if (getAllocatedSingleString(pvApiCtx, piAddr, &pstFile))
78 Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 1);
82 char* pstFileName = expandPathVariable(pstFile);
83 iFile = openHDF5File(pstFileName, 0);
87 Scierror(999, _("%s: Unable to open file: %s\n"), fname, pstFile);
94 iNbItem = getVariableNames_v1(iFile, NULL);
97 char** pstVarNameList = (char**)MALLOC(sizeof(char*) * iNbItem);
99 pInfo = (VarInfo_v1*)MALLOC(iNbItem * sizeof(VarInfo_v1));
103 sciprint("Name Type Size Bytes\n");
104 sciprint("---------------------------------------------------------------\n");
107 iNbItem = getVariableNames_v1(iFile, pstVarNameList);
108 for (int i = 0; i < iNbItem; i++)
110 int iDataSetId = getDataSetIdFromName_v1(iFile, pstVarNameList[i]);
116 strcpy(pInfo[i].varName, pstVarNameList[i]);
117 FREE(pstVarNameList[i]);
118 b = read_data_v1(iDataSetId, 0, NULL, &pInfo[i]) == false;
119 closeDataSet_v1(iDataSetId);
128 sciprint("%s\n", pInfo[i].pstInfo);
134 //no variable returms [] for each Lhs
135 for (int i = 0 ; i < Lhs ; i++)
137 createEmptyMatrix(pvApiCtx, Rhs + i + 1);
138 LhsVar(i + 1) = Rhs + i + 1;
145 closeHDF5File(iFile);
148 char** pstVarName = (char**)MALLOC(sizeof(char*) * iNbItem);
149 for (int i = 0 ; i < iNbItem ; i++)
151 pstVarName[i] = pInfo[i].varName;
154 sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, iNbItem, 1, pstVarName);
158 printError(&sciErr, 0);
168 sciErr = allocMatrixOfDouble(pvApiCtx, Rhs + 2, iNbItem, 1, &pdblType);
171 printError(&sciErr, 0);
175 for (int i = 0 ; i < iNbItem ; i++)
177 pdblType[i] = pInfo[i].iType;
186 sciErr = createList(pvApiCtx, Rhs + 3, iNbItem, &pList);
187 for (int i = 0 ; i < iNbItem ; i++)
189 double* pdblDims = NULL;
190 allocMatrixOfDoubleInList(pvApiCtx, Rhs + 3, pList, i + 1, 1, pInfo[i].iDims, &pdblDims);
191 for (int j = 0 ; j < pInfo[i].iDims ; j++)
193 pdblDims[j] = pInfo[i].piDims[j];
204 sciErr = allocMatrixOfDouble(pvApiCtx, Rhs + 4, iNbItem, 1, &pdblSize);
205 for (int i = 0 ; i < iNbItem ; i++)
207 pdblSize[i] = pInfo[i].iSize;
220 static bool read_data_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
224 _pInfo->iType = getScilabTypeFromDataSet_v1(_iDatasetId);
225 switch (_pInfo->iType)
229 bRet = read_double_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
234 bRet = read_string_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
241 bRet = read_list_v1(_iDatasetId, _pInfo->iType, _iItemPos, _piAddress, _pInfo);
246 bRet = read_boolean_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
251 bRet = read_poly_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
256 bRet = read_integer_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
261 bRet = read_sparse_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
264 case sci_boolean_sparse:
266 bRet = read_boolean_sparse_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
269 case sci_void: //void item only on list variable
271 bRet = read_void_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
274 case sci_undefined: //undefined item only on list variable
276 bRet = read_undefined_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
281 Scierror(999, _("%s: Invalid HDF5 Scilab format.\n"), "listvar_in_hdf5");
289 static bool read_double_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
296 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
297 iComplex = isComplexData_v1(_iDatasetId);
300 _pInfo->piDims[0] = iRows;
301 _pInfo->piDims[1] = iCols;
302 _pInfo->iSize = (2 + (iRows * iCols * (iComplex + 1))) * 8;
304 generateInfo_v1(_pInfo, "constant");
308 static bool read_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
313 char** pstData = NULL;
315 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
318 _pInfo->piDims[0] = iRows;
319 _pInfo->piDims[1] = iCols;
321 pstData = (char **)MALLOC(iRows * iCols * sizeof(char *));
322 iRet = readStringMatrix_v1(_iDatasetId, iRows, iCols, pstData);
325 for (int i = 0 ; i < iRows * iCols ; i++)
327 _pInfo->iSize += (int)strlen(pstData[i]) * 4;
332 //always full double size
333 _pInfo->iSize += (8 - (_pInfo->iSize % 8));
335 _pInfo->iSize += 16 + (1 + iRows * iCols) * 4;
337 generateInfo_v1(_pInfo, "string");
341 static bool read_boolean_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
347 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
350 _pInfo->piDims[0] = iRows;
351 _pInfo->piDims[1] = iCols;
352 _pInfo->iSize = (3 + iRows * iCols) * 4;
354 generateInfo_v1(_pInfo, "boolean");
358 static bool read_integer_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
365 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
366 iRet = getDatasetPrecision_v1(_iDatasetId, &iPrec);
369 _pInfo->piDims[0] = iRows;
370 _pInfo->piDims[1] = iCols;
371 _pInfo->iSize = 16 + iRows * iCols * (iPrec % 10);
373 generateInfo_v1(_pInfo, "integer");
377 static bool read_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
385 iRet = getSparseDimension_v1(_iDatasetId, &iRows, &iCols, &iNbItem);
391 iComplex = isComplexData_v1(_iDatasetId);
394 _pInfo->piDims[0] = iRows;
395 _pInfo->piDims[1] = iCols;
396 _pInfo->iSize = 20 + iRows * 4 + iNbItem * 4 + (iNbItem * (iComplex + 1) * 8);
398 generateInfo_v1(_pInfo, "sparse");
402 static bool read_boolean_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
410 iRet = getSparseDimension_v1(_iDatasetId, &iRows, &iCols, &iNbItem);
417 _pInfo->piDims[0] = iRows;
418 _pInfo->piDims[1] = iCols;
419 _pInfo->iSize = 20 + iRows * 4 + iNbItem * 4;
421 generateInfo_v1(_pInfo, "boolean sparse");
425 static bool read_poly_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
431 char pstVarName[64] = { 0 };
432 double **pdblReal = NULL;
433 double **pdblImg = NULL;
434 int *piNbCoef = NULL;
436 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
442 iComplex = isComplexData_v1(_iDatasetId);
445 _pInfo->piDims[0] = iRows;
446 _pInfo->piDims[1] = iCols;
447 _pInfo->iSize = 8 * 4 + (iRows * iCols + 1) * 4;
451 piNbCoef = (int *)MALLOC(iRows * iCols * sizeof(int));
452 pdblReal = (double **)MALLOC(iRows * iCols * sizeof(double *));
453 pdblImg = (double **)MALLOC(iRows * iCols * sizeof(double *));
454 iRet = readPolyComplexMatrix_v1(_iDatasetId, pstVarName, iRows, iCols, piNbCoef, pdblReal, pdblImg);
458 piNbCoef = (int *)MALLOC(iRows * iCols * sizeof(int));
459 pdblReal = (double **)MALLOC(iRows * iCols * sizeof(double *));
460 iRet = readPolyMatrix_v1(_iDatasetId, pstVarName, iRows, iCols, piNbCoef, pdblReal);
463 for (int i = 0 ; i < iRows * iCols ; i++)
465 _pInfo->iSize += piNbCoef[i] * 8 * (iComplex + 1);
480 generateInfo_v1(_pInfo, "polynomial");
484 static bool read_list_v1(int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
488 int *piListAddr = NULL;
489 hobj_ref_t *piItemRef = NULL;
491 iRet = getListDims_v1(_iDatasetId, &iItems);
499 //special case for empty list
503 iRet = getListItemReferences_v1(_iDatasetId, &piItemRef);
509 //_pInfo = (VarInfo_v1*)MALLOC(sizeof(VarInfo));
511 _pInfo->piDims[0] = iItems;
512 _pInfo->iSize = (2 + iItems + 1) * 4;
514 for (int i = 0; i < iItems; i++)
516 int iItemDataset = 0;
518 iRet = getListItemDataset_v1(_iDatasetId, piItemRef, i, &iItemDataset);
519 if (iRet || iItemDataset == 0)
524 bool bRet = read_data_v1(iItemDataset, i + 1, piListAddr, &info);
530 _pInfo->iSize += info.iSize;
533 if (_iVarType == sci_list)
535 generateInfo_v1(_pInfo, "list");
537 else if (_iVarType == sci_tlist)
539 generateInfo_v1(_pInfo, "tlist");
541 else if (_iVarType == sci_mlist)
543 generateInfo_v1(_pInfo, "mlist");
549 static bool read_void_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
555 static bool read_undefined_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
561 static void generateInfo_v1(VarInfo_v1* _pInfo, const char* _pstType)
565 if (_pInfo->iDims == 2)
567 sprintf(pstSize, "%d by %d", _pInfo->piDims[0], _pInfo->piDims[1]);
571 sprintf(pstSize, "%d", _pInfo->piDims[0]);
573 sprintf(_pInfo->pstInfo, "%-*s%-*s%-*s%-*d", 25, _pInfo->varName, 15, _pstType, 16, pstSize, 10, _pInfo->iSize);