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"
27 #include "freeArrayOfString.h"
32 typedef struct __VAR_INFO_V1__
41 __VAR_INFO_V1__() : iType(0), iSize(0), iDims(0) {}
44 static bool read_data_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
45 static bool read_double_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
46 static bool read_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
47 static bool read_boolean_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
48 static bool read_integer_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
49 static bool read_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
50 static bool read_boolean_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
51 static bool read_poly_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
52 static bool read_list_v1(int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
53 static bool read_void_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
54 static bool read_undefined_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
56 static void generateInfo_v1(VarInfo_v1* _pInfo, const char* _pstType);
58 int sci_listvar_in_hdf5_v1(char *fname, unsigned long fname_len)
65 VarInfo_v1* pInfo = NULL;
70 sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
73 printError(&sciErr, 0);
77 if (getAllocatedSingleString(pvApiCtx, piAddr, &pstFile))
84 Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 1);
88 char* pstFileName = expandPathVariable(pstFile);
89 iFile = openHDF5File(pstFileName, 0);
93 Scierror(999, _("%s: Unable to open file: %s\n"), fname, pstFile);
100 iNbItem = getVariableNames_v1(iFile, NULL);
103 char** pstVarNameList = (char**)MALLOC(sizeof(char*) * iNbItem);
105 pInfo = (VarInfo_v1*)MALLOC(iNbItem * sizeof(VarInfo_v1));
109 sciprint("Name Type Size Bytes\n");
110 sciprint("---------------------------------------------------------------\n");
113 iNbItem = getVariableNames_v1(iFile, pstVarNameList);
114 for (int i = 0; i < iNbItem; i++)
116 int iDataSetId = getDataSetIdFromName_v1(iFile, pstVarNameList[i]);
122 strncpy(pInfo[i].varName, pstVarNameList[i], sizeof(pInfo[i].varName));
123 b = read_data_v1(iDataSetId, 0, NULL, &pInfo[i]) == false;
124 closeDataSet_v1(iDataSetId);
133 sciprint("%s\n", pInfo[i].pstInfo);
137 freeArrayOfString(pstVarNameList, iNbItem);
141 //no variable returms [] for each Lhs
142 for (int i = 0 ; i < Lhs ; i++)
144 createEmptyMatrix(pvApiCtx, Rhs + i + 1);
145 LhsVar(i + 1) = Rhs + i + 1;
152 closeHDF5File(iFile);
155 char** pstVarName = (char**)MALLOC(sizeof(char*) * iNbItem);
156 for (int i = 0 ; i < iNbItem ; i++)
158 pstVarName[i] = pInfo[i].varName;
161 sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, iNbItem, 1, pstVarName);
166 printError(&sciErr, 0);
176 sciErr = allocMatrixOfDouble(pvApiCtx, Rhs + 2, iNbItem, 1, &pdblType);
180 printError(&sciErr, 0);
184 for (int i = 0 ; i < iNbItem ; i++)
186 pdblType[i] = pInfo[i].iType;
195 sciErr = createList(pvApiCtx, Rhs + 3, iNbItem, &pList);
196 for (int i = 0 ; i < iNbItem ; i++)
198 double* pdblDims = NULL;
199 allocMatrixOfDoubleInList(pvApiCtx, Rhs + 3, pList, i + 1, 1, pInfo[i].iDims, &pdblDims);
200 for (int j = 0 ; j < pInfo[i].iDims ; j++)
202 pdblDims[j] = pInfo[i].piDims[j];
213 sciErr = allocMatrixOfDouble(pvApiCtx, Rhs + 4, iNbItem, 1, &pdblSize);
214 for (int i = 0 ; i < iNbItem ; i++)
216 pdblSize[i] = pInfo[i].iSize;
229 static bool read_data_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
233 _pInfo->iType = getScilabTypeFromDataSet_v1(_iDatasetId);
234 switch (_pInfo->iType)
238 bRet = read_double_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
243 bRet = read_string_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
250 bRet = read_list_v1(_iDatasetId, _pInfo->iType, _iItemPos, _piAddress, _pInfo);
255 bRet = read_boolean_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
260 bRet = read_poly_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
265 bRet = read_integer_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
270 bRet = read_sparse_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
273 case sci_boolean_sparse:
275 bRet = read_boolean_sparse_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
278 case sci_void: //void item only on list variable
280 bRet = read_void_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
283 case sci_undefined: //undefined item only on list variable
285 bRet = read_undefined_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
290 Scierror(999, _("%s: Invalid HDF5 Scilab format.\n"), "listvar_in_hdf5");
298 static bool read_double_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
305 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
306 iComplex = isComplexData_v1(_iDatasetId);
309 _pInfo->piDims[0] = iRows;
310 _pInfo->piDims[1] = iCols;
311 _pInfo->iSize = (2 + (iRows * iCols * (iComplex + 1))) * 8;
313 generateInfo_v1(_pInfo, "constant");
317 static bool read_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
322 char** pstData = NULL;
324 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
327 _pInfo->piDims[0] = iRows;
328 _pInfo->piDims[1] = iCols;
330 pstData = (char **)MALLOC(iRows * iCols * sizeof(char *));
331 memset(pstData, 0x00, iRows * iCols * sizeof(char *));
332 iRet = readStringMatrix_v1(_iDatasetId, iRows, iCols, pstData);
334 for (int i = 0 ; i < iRows * iCols ; i++)
336 _pInfo->iSize += (int)strlen(pstData[i]) * 4;
341 //always full double size
342 _pInfo->iSize += (8 - (_pInfo->iSize % 8));
344 _pInfo->iSize += 16 + (1 + iRows * iCols) * 4;
346 generateInfo_v1(_pInfo, "string");
350 static bool read_boolean_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
356 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
359 _pInfo->piDims[0] = iRows;
360 _pInfo->piDims[1] = iCols;
361 _pInfo->iSize = (3 + iRows * iCols) * 4;
363 generateInfo_v1(_pInfo, "boolean");
367 static bool read_integer_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
374 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
375 iRet = getDatasetPrecision_v1(_iDatasetId, &iPrec);
378 _pInfo->piDims[0] = iRows;
379 _pInfo->piDims[1] = iCols;
380 _pInfo->iSize = 16 + iRows * iCols * (iPrec % 10);
382 generateInfo_v1(_pInfo, "integer");
386 static bool read_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
394 iRet = getSparseDimension_v1(_iDatasetId, &iRows, &iCols, &iNbItem);
400 iComplex = isComplexData_v1(_iDatasetId);
403 _pInfo->piDims[0] = iRows;
404 _pInfo->piDims[1] = iCols;
405 _pInfo->iSize = 20 + iRows * 4 + iNbItem * 4 + (iNbItem * (iComplex + 1) * 8);
407 generateInfo_v1(_pInfo, "sparse");
411 static bool read_boolean_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
419 iRet = getSparseDimension_v1(_iDatasetId, &iRows, &iCols, &iNbItem);
426 _pInfo->piDims[0] = iRows;
427 _pInfo->piDims[1] = iCols;
428 _pInfo->iSize = 20 + iRows * 4 + iNbItem * 4;
430 generateInfo_v1(_pInfo, "boolean sparse");
434 static bool read_poly_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
440 char pstVarName[64] = { 0 };
441 double **pdblReal = NULL;
442 double **pdblImg = NULL;
443 int *piNbCoef = NULL;
445 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
451 iComplex = isComplexData_v1(_iDatasetId);
454 _pInfo->piDims[0] = iRows;
455 _pInfo->piDims[1] = iCols;
456 _pInfo->iSize = 8 * 4 + (iRows * iCols + 1) * 4;
460 piNbCoef = (int *)MALLOC(iRows * iCols * sizeof(int));
461 pdblReal = (double **)MALLOC(iRows * iCols * sizeof(double *));
462 pdblImg = (double **)MALLOC(iRows * iCols * sizeof(double *));
463 iRet = readPolyComplexMatrix_v1(_iDatasetId, pstVarName, iRows, iCols, piNbCoef, pdblReal, pdblImg);
467 piNbCoef = (int *)MALLOC(iRows * iCols * sizeof(int));
468 pdblReal = (double **)MALLOC(iRows * iCols * sizeof(double *));
469 iRet = readPolyMatrix_v1(_iDatasetId, pstVarName, iRows, iCols, piNbCoef, pdblReal);
472 for (int i = 0 ; i < iRows * iCols ; i++)
474 _pInfo->iSize += piNbCoef[i] * 8 * (iComplex + 1);
489 generateInfo_v1(_pInfo, "polynomial");
493 static bool read_list_v1(int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
497 int *piListAddr = NULL;
498 hobj_ref_t *piItemRef = NULL;
500 iRet = getListDims_v1(_iDatasetId, &iItems);
508 //special case for empty list
512 iRet = getListItemReferences_v1(_iDatasetId, &piItemRef);
518 //_pInfo = (VarInfo_v1*)MALLOC(sizeof(VarInfo));
520 _pInfo->piDims[0] = iItems;
521 _pInfo->iSize = (2 + iItems + 1) * 4;
523 for (int i = 0; i < iItems; i++)
525 int iItemDataset = 0;
527 iRet = getListItemDataset_v1(_iDatasetId, piItemRef, i, &iItemDataset);
528 if (iRet || iItemDataset == 0)
533 bool bRet = read_data_v1(iItemDataset, i + 1, piListAddr, &info);
539 _pInfo->iSize += info.iSize;
542 if (_iVarType == sci_list)
544 generateInfo_v1(_pInfo, "list");
546 else if (_iVarType == sci_tlist)
548 generateInfo_v1(_pInfo, "tlist");
550 else if (_iVarType == sci_mlist)
552 generateInfo_v1(_pInfo, "mlist");
558 static bool read_void_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
564 static bool read_undefined_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
570 static void generateInfo_v1(VarInfo_v1* _pInfo, const char* _pstType)
574 if (_pInfo->iDims == 2)
576 sprintf(pstSize, "%d by %d", _pInfo->piDims[0], _pInfo->piDims[1]);
580 sprintf(pstSize, "%d", _pInfo->piDims[0]);
582 sprintf(_pInfo->pstInfo, "%-*s%-*s%-*s%-*d", 25, _pInfo->varName, 15, _pstType, 16, pstSize, 10, _pInfo->iSize);