2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2009 - DIGITEO - Antoine ELIAS
5 * Copyright (C) 2012 - 2016 - Scilab Enterprises
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.
17 #include "context.hxx"
26 #include "sci_malloc.h"
28 #include "localization.h"
30 #include "api_scilab.h"
31 #include "../../../call_scilab/includes/call_scilab.h"
32 #include "h5_fileManagement.h"
33 #include "h5_readDataFromFile.h"
34 #include "h5_attributeConstants.h"
35 #include "expandPathVariable.h"
37 #include "freeArrayOfString.h"
40 #include "hdf5_load_v1.hxx"
42 static bool import_variable(int* pvCtx, int _iFile, char* _pstVarName);
43 static bool import_data(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
44 static bool import_double(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
45 static bool import_string(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
46 static bool import_boolean(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
47 static bool import_integer(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
48 static bool import_sparse(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
49 static bool import_boolean_sparse(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
50 static bool import_poly(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
51 static bool import_list(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname);
52 static bool import_hypermat(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname);
53 static bool import_struct(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname);
54 static bool import_cell(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname);
55 static bool import_void(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
56 static bool import_undefined(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
58 static const std::string fname("load");
60 int sci_hdf5_load_v2(char *fn, int* pvApiCtx)
65 char* pstFilename = NULL;
66 char* pstExpandedFilename = NULL;
68 const int nbIn = nbInputArgument(pvApiCtx);
69 int iSelectedVar = nbIn - 1;
71 CheckInputArgumentAtLeast(pvApiCtx , 1);
72 CheckOutputArgument(pvApiCtx, 1, 1);
74 sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
77 printError(&sciErr, 0);
81 if (getAllocatedSingleString(pvApiCtx, piAddr, &pstFilename))
85 freeAllocatedSingleString(pstFilename);
88 Scierror(999, _("%s: Wrong size for input argument #%d: string expected.\n"), fname.data(), 2);
93 pstExpandedFilename = expandPathVariable(pstFilename);
94 int iFile = openHDF5File(pstExpandedFilename, 0);
97 Scierror(999, _("%s: Unable to open file: %s\n"), fname.data(), pstFilename);
98 FREE(pstExpandedFilename);
103 FREE(pstExpandedFilename);
106 //manage version information
107 int iVersion = getSODFormatAttribute(iFile);
108 if (iVersion != SOD_FILE_VERSION)
110 if (iVersion > SOD_FILE_VERSION)
112 //can't read file with version newer that me !
113 Scierror(999, _("%s: Wrong SOD file format version. Max Expected: %d Found: %d\n"), fname.data(), SOD_FILE_VERSION, iVersion);
118 //call older import functions and exit or ... EXIT !
119 if (iVersion == 1 || iVersion == -1)
121 return sci_hdf5_load_v1(fn, pvApiCtx);
126 std::vector<wchar_t*> varList;
130 char* pstVarName = NULL;
131 for (int i = 0 ; i < iSelectedVar ; i++)
133 sciErr = getVarAddressFromPosition(pvApiCtx, i + 2, &piAddr);
136 printError(&sciErr, 0);
140 if (getAllocatedSingleString(pvApiCtx, piAddr, &pstVarName))
144 freeAllocatedSingleString(pstVarName);
147 Scierror(999, _("%s: Wrong size for input argument #%d: string expected.\n"), fname.data(), i + 1);
151 if (import_variable(pvApiCtx, iFile, pstVarName) == false)
158 varList.push_back(to_wide_string(pstVarName));
167 iNbItem = getVariableNames(iFile, NULL);
170 char **pstVarNameList = (char **)MALLOC(sizeof(char *) * iNbItem);
172 iNbItem = getVariableNames(iFile, pstVarNameList);
175 for (int i = 0; i < iNbItem; i++)
177 if (import_variable(pvApiCtx, iFile, pstVarNameList[i]) == false)
183 varList.push_back(to_wide_string(pstVarNameList[i]));
186 freeArrayOfString(pstVarNameList, iNbItem);
190 closeHDF5File(iFile);
192 if (bImport == true && varList.size() != 0)
194 createMatrixOfWideString(pvApiCtx, nbIn + 1, 1, static_cast<int>(varList.size()), varList.data());
198 createEmptyMatrix(pvApiCtx, nbIn + 1);
201 for (auto & i : varList)
206 AssignOutputVariable(pvApiCtx, 1) = nbIn + 1;
207 ReturnArguments(pvApiCtx);
209 // printf("End gateway !!!\n");
213 static bool import_variable(int* pvCtx, int _iFile, char* _pstVarName)
215 int iDataSetId = getDataSetIdFromName(_iFile, _pstVarName);
221 return import_data(pvCtx, iDataSetId, 0, NULL, _pstVarName);
224 static bool import_data(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
229 int iVarType = getScilabTypeFromDataSet(_iDatasetId);
235 bRet = import_double(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname);
240 bRet = import_string(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname);
247 bRet = import_hypermat(pvCtx, _iDatasetId, iVarType, _iItemPos, _piAddress, _pstVarname);
250 bRet = import_struct(pvCtx, _iDatasetId, iVarType, _iItemPos, _piAddress, _pstVarname);
254 bRet = import_cell(pvCtx, _iDatasetId, iVarType, _iItemPos, _piAddress, _pstVarname);
258 bRet = import_list(pvCtx, _iDatasetId, iVarType, _iItemPos, _piAddress, _pstVarname);
264 bRet = import_boolean(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname);
269 bRet = import_poly(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname);
274 bRet = import_integer(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname);
279 bRet = import_sparse(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname);
282 case sci_boolean_sparse:
284 bRet = import_boolean_sparse(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname);
287 case sci_void: //void item only on list variable
289 bRet = import_void(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname);
292 case sci_undefined: //undefined item only on list variable
294 bRet = import_undefined(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname);
299 Scierror(999, _("%s: Invalid HDF5 Scilab format.\n"), fname.data());
305 static bool import_void(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
311 sciErr = createVoidInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos);
320 printError(&sciErr, 0);
325 closeDataSet(_iDatasetId);
329 static bool import_undefined(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
335 sciErr = createUndefinedInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos);
344 printError(&sciErr, 0);
348 //close undefined dataset
349 closeDataSet(_iDatasetId);
353 static bool import_double(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
357 double *pdblReal = NULL;
358 double *pdblImg = NULL;
364 iRet = getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
378 piDims = (int*)MALLOC(sizeof(int) * iDims);
379 iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
383 pdblReal = (double *)MALLOC(iSize * sizeof(double));
387 pdblImg = (double *)MALLOC(iSize * sizeof(double));
388 iRet = readDoubleComplexMatrix(_iDatasetId, pdblReal, pdblImg);
392 iRet = readDoubleMatrix(_iDatasetId, pdblReal);
395 //to be sure ti have 2 dims
399 piDims = (int*)MALLOC(sizeof(int) * 2);
406 if (iDims == 0 || iSize == 0) //empty matrix
413 /*bug 7224 : to close dataset */
414 iRet = readEmptyMatrix(_iDatasetId);
420 // Hack to sure that piDims will not be null at line 372.
422 piDims = (int*)MALLOC(sizeof(int) * iDims);
423 memset(piDims, 0, sizeof(int) * iDims);
424 pdblReal = (double*)MALLOC(sizeof(double) * 1);
429 if (_piAddress == NULL)
433 sciErr = createNamedComplexMatrixOfDouble(pvCtx, _pstVarname, piDims[0], piDims[1], pdblReal, pdblImg);
437 sciErr = createNamedMatrixOfDouble(pvCtx, _pstVarname, piDims[0], piDims[1], pdblReal);
440 else //if not null this variable is in a list
444 sciErr = createComplexMatrixOfDoubleInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pdblReal, pdblImg);
448 sciErr = createMatrixOfDoubleInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pdblReal);
461 printError(&sciErr, 0);
468 static bool import_string(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
472 char **pstData = NULL;
478 iRet = getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
484 piDims = (int*)MALLOC(sizeof(int) * iDims);
485 iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
487 pstData = (char **)MALLOC(iSize * sizeof(char *));
489 iRet = readStringMatrix(_iDatasetId, pstData);
496 if (_piAddress == NULL)
498 sciErr = createNamedMatrixOfString(pvCtx, _pstVarname, piDims[0], piDims[1], pstData);
500 else //if not null this variable is in a list
502 sciErr = createMatrixOfStringInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pstData);
507 printError(&sciErr, 0);
509 freeStringMatrix(_iDatasetId, pstData);
515 freeStringMatrix(_iDatasetId, pstData);
521 static bool import_integer(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
531 iRet = getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
537 piDims = (int*)MALLOC(sizeof(int) * iDims);
538 iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
540 iRet = getDatasetPrecision(_iDatasetId, &iPrec);
553 pcData = (char *)MALLOC(sizeof(char) * iSize);
554 iRet = readInteger8Matrix(_iDatasetId, pcData);
561 if (_piAddress == NULL)
563 sciErr = createNamedMatrixOfInteger8(pvCtx, _pstVarname, piDims[0], piDims[1], pcData);
567 sciErr = createMatrixOfInteger8InNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pcData);
575 unsigned char *pucData = NULL;
577 pucData = (unsigned char *)MALLOC(sizeof(unsigned char) * iSize);
578 iRet = readUnsignedInteger8Matrix(_iDatasetId, pucData);
585 if (_piAddress == NULL)
587 sciErr = createNamedMatrixOfUnsignedInteger8(pvCtx, _pstVarname, piDims[0], piDims[1], pucData);
591 sciErr = createMatrixOfUnsignedInteger8InNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pucData);
599 short *psData = NULL;
601 psData = (short *)MALLOC(sizeof(short) * iSize);
602 iRet = readInteger16Matrix(_iDatasetId, psData);
609 if (_piAddress == NULL)
611 sciErr = createNamedMatrixOfInteger16(pvCtx, _pstVarname, piDims[0], piDims[1], psData);
615 sciErr = createMatrixOfInteger16InNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], psData);
623 unsigned short *pusData = NULL;
625 pusData = (unsigned short *)MALLOC(sizeof(unsigned short) * iSize);
626 iRet = readUnsignedInteger16Matrix(_iDatasetId, pusData);
633 if (_piAddress == NULL)
635 sciErr = createNamedMatrixOfUnsignedInteger16(pvCtx, _pstVarname, piDims[0], piDims[1], pusData);
639 sciErr = createMatrixOfUnsignedInteger16InNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pusData);
649 piData = (int *)MALLOC(sizeof(int) * iSize);
650 iRet = readInteger32Matrix(_iDatasetId, piData);
657 if (_piAddress == NULL)
659 sciErr = createNamedMatrixOfInteger32(pvCtx, _pstVarname, piDims[0], piDims[1], piData);
663 sciErr = createMatrixOfInteger32InNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], piData);
671 unsigned int *puiData = NULL;
673 puiData = (unsigned int *)MALLOC(sizeof(unsigned int) * iSize);
674 iRet = readUnsignedInteger32Matrix(_iDatasetId, puiData);
681 if (_piAddress == NULL)
683 sciErr = createNamedMatrixOfUnsignedInteger32(pvCtx, _pstVarname, piDims[0], piDims[1], puiData);
687 sciErr = createMatrixOfUnsignedInteger32InNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], puiData);
695 #ifdef __SCILAB_INT64__
696 long long *pllData = NULL;
698 pllData = (long long *)MALLOC(sizeof(long long) * iSize);
699 iRet = readInteger64Matrix(_iDatasetId, pllData);
706 if (_piAddress == NULL)
708 sciErr = createNamedMatrixOfInteger64(pvCtx, _pstVarname, piDims[0], piDims[1], pllData);
712 sciErr = createMatrixOfInteger64InNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pllData);
724 #ifdef __SCILAB_INT64__
725 unsigned long long *pullData = NULL;
727 pullData = (unsigned long long *)MALLOC(sizeof(unsigned long long) * iSize);
728 iRet = readUnsignedInteger64Matrix(_iDatasetId, pullData);
735 if (_piAddress == NULL)
737 sciErr = createNamedMatrixOfUnsignedInteger64(pvCtx, _pstVarname, piDims[0], piDims[1], pullData);
741 sciErr = createMatrixOfUnsignedInteger64InNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pullData);
760 printError(&sciErr, 0);
767 static bool import_boolean(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
777 iRet = getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
783 piDims = (int*)MALLOC(sizeof(int) * iDims);
784 iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
792 piData = (int *)MALLOC(iSize * sizeof(int));
793 iRet = readBooleanMatrix(_iDatasetId, piData);
801 if (_piAddress == NULL)
803 sciErr = createNamedMatrixOfBoolean(pvCtx, _pstVarname, piDims[0], piDims[1], piData);
805 else //if not null this variable is in a list
807 sciErr = createMatrixOfBooleanInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], piData);
818 printError(&sciErr, 0);
825 static bool import_poly(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
829 char pstVarName[64] = { 0 };
830 double **pdblReal = NULL;
831 double **pdblImg = NULL;
832 int *piNbCoef = NULL;
838 iRet = getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
844 piDims = (int*)MALLOC(sizeof(int) * iDims);
845 iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
849 piNbCoef = (int *)MALLOC(iSize * sizeof(int));
850 pdblReal = (double **)MALLOC(iSize * sizeof(double *));
851 pdblImg = (double **)MALLOC(iSize * sizeof(double *));
852 iRet = readPolyComplexMatrix(_iDatasetId, pstVarName, iDims, piDims, piNbCoef, pdblReal, pdblImg);
856 piNbCoef = (int *)MALLOC(iSize * sizeof(int));
857 pdblReal = (double **)MALLOC(iSize * sizeof(double *));
858 iRet = readPolyMatrix(_iDatasetId, pstVarName, iDims, piDims, piNbCoef, pdblReal);
865 for (int i = 0; i < iSize; i++)
873 for (int i = 0; i < iSize; i++)
883 if (_piAddress == NULL)
887 sciErr = createNamedComplexMatrixOfPoly(pvCtx, _pstVarname, pstVarName, piDims[0], piDims[1], piNbCoef, pdblReal, pdblImg);
891 sciErr = createNamedMatrixOfPoly(pvCtx, _pstVarname, pstVarName, piDims[0], piDims[1], piNbCoef, pdblReal);
894 else //if not null this variable is in a list
899 createComplexMatrixOfPolyInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, pstVarName, piDims[0], piDims[1], piNbCoef, pdblReal,
904 sciErr = createMatrixOfPolyInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, pstVarName, piDims[0], piDims[1], piNbCoef, pdblReal);
910 for (int i = 0; i < iSize; i++)
919 for (int i = 0; i < iSize; i++)
929 printError(&sciErr, 0);
936 static bool import_sparse(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
942 double *pdblReal = NULL;
943 double *pdblImg = NULL;
945 int *piNbItemRow = NULL;
946 int *piColPos = NULL;
949 iRet = getSparseDimension(_iDatasetId, &iRows, &iCols, &iNbItem);
955 iComplex = isComplexData(_iDatasetId);
959 piNbItemRow = (int *)MALLOC(iRows * sizeof(int));
960 piColPos = (int *)MALLOC(iNbItem * sizeof(int));
961 pdblReal = (double *)MALLOC(iNbItem * sizeof(double));
962 pdblImg = (double *)MALLOC(iNbItem * sizeof(double));
963 iRet = readSparseComplexMatrix(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg);
967 piNbItemRow = (int *)MALLOC(iRows * sizeof(int));
968 piColPos = (int *)MALLOC(iNbItem * sizeof(int));
969 pdblReal = (double *)MALLOC(iNbItem * sizeof(double));
970 iRet = readSparseMatrix(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
986 if (_piAddress == NULL)
990 sciErr = createNamedComplexSparseMatrix(pvCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg);
994 sciErr = createNamedSparseMatrix(pvCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
997 else //if not null this variable is in a list
1001 sciErr = createComplexSparseMatrixInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg);
1005 sciErr = createSparseMatrixInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
1019 printError(&sciErr, 0);
1026 static bool import_boolean_sparse(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
1032 int *piNbItemRow = NULL;
1033 int *piColPos = NULL;
1036 iRet = getSparseDimension(_iDatasetId, &iRows, &iCols, &iNbItem);
1042 piNbItemRow = (int *)MALLOC(iRows * sizeof(int));
1043 piColPos = (int *)MALLOC(iNbItem * sizeof(int));
1045 iRet = readBooleanSparseMatrix(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos);
1052 if (_piAddress == NULL)
1054 sciErr = createNamedBooleanSparseMatrix(pvCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos);
1056 else //if not null this variable is in a list
1058 sciErr = createBooleanSparseMatrixInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos);
1066 printError(&sciErr, 0);
1073 static bool import_list(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname)
1078 int *piListAddr = NULL;
1079 hobj_ref_t *piItemRef = NULL;
1082 iRet = getListDims(_iDatasetId, &iItems);
1090 //special case for empty list
1094 iRet = getListItemReferences(_iDatasetId, &piItemRef);
1101 if (_piAddress == 0)
1106 sciErr = createNamedList(pvCtx, _pstVarname, iItems, &piListAddr);
1109 sciErr = createNamedTList(pvCtx, _pstVarname, iItems, &piListAddr);
1112 sciErr = createNamedMList(pvCtx, _pstVarname, iItems, &piListAddr);
1118 else //if not null this variable is in a list
1123 sciErr = createListInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, iItems, &piListAddr);
1126 sciErr = createTListInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, iItems, &piListAddr);
1129 sciErr = createMListInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, iItems, &piListAddr);
1138 printError(&sciErr, 0);
1142 for (i = 0; i < iItems; i++)
1144 int iItemDataset = 0;
1146 iRet = getListItemDataset(_iDatasetId, piItemRef, i, &iItemDataset);
1147 if (iRet || iItemDataset == 0)
1152 bool bRet = import_data(pvCtx, iItemDataset, i + 1, piListAddr, _pstVarname);
1160 iRet = deleteListItemReferences(_iDatasetId, piItemRef);
1169 static bool import_hypermat(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname)
1175 hobj_ref_t *piItemRef = NULL;
1177 // an hypermatrix is stored in an mlist
1178 if (_iVarType != sci_mlist)
1183 iRet = getListDims(_iDatasetId, &iItems);
1191 // hypermatrix have 3 elements
1195 iRet = getListItemReferences(_iDatasetId, &piItemRef);
1198 deleteListItemReferences(_iDatasetId, piItemRef);
1203 int iItemDataset = 0;
1204 iRet = getListItemDataset(_iDatasetId, piItemRef, 0, &iItemDataset);
1205 if (iRet || iItemDataset == 0)
1207 deleteListItemReferences(_iDatasetId, piItemRef);
1211 // get first item type
1212 int iItemType = getScilabTypeFromDataSet(iItemDataset);
1213 if (iItemType != sci_strings)
1215 deleteListItemReferences(_iDatasetId, piItemRef);
1219 // get size of first item
1220 iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
1221 if (iRet < 0 || iDims != 2)
1223 deleteListItemReferences(_iDatasetId, piItemRef);
1227 int* piDims = new int[2];
1228 int iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
1231 deleteListItemReferences(_iDatasetId, piItemRef);
1239 // get data of first item for check the type of mlist
1240 char** pstData = new char*[iSize];
1241 iRet = readStringMatrix(iItemDataset, pstData);
1242 if (iRet || strcmp(pstData[0], "hm") != 0)
1244 // if not the good type, do not h5close (deleteListItemReferences)
1246 freeStringMatrix(iItemDataset, pstData);
1251 freeStringMatrix(iItemDataset, pstData);
1255 // get second item, the Size of hypermatrix
1256 iRet = getListItemDataset(_iDatasetId, piItemRef, 1, &iItemDataset);
1259 deleteListItemReferences(_iDatasetId, piItemRef);
1263 iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
1264 if (iRet < 0 || iDims != 2)
1266 deleteListItemReferences(_iDatasetId, piItemRef);
1270 piDims = new int[2];
1271 iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
1274 deleteListItemReferences(_iDatasetId, piItemRef);
1279 int* piDimsArray = new int[piDims[1]];
1280 iRet = readInteger32Matrix(iItemDataset, piDimsArray);
1283 deleteListItemReferences(_iDatasetId, piItemRef);
1285 delete[] piDimsArray;
1289 // get third item, the Data of hypermatrix
1290 // import data like a "type" (Double, Int, ...) instead of mlist
1291 iRet = getListItemDataset(_iDatasetId, piItemRef, 2, &iItemDataset);
1292 bool bRet = import_data(pvCtx, iItemDataset, _iItemPos, _piAddress, _pstVarname);
1295 deleteListItemReferences(_iDatasetId, piItemRef);
1297 delete[] piDimsArray;
1301 // get imported hypermatrix from List or Context
1302 types::GenericType* pGT = NULL;
1303 types::InternalType* pIT = NULL;
1306 types::List* pL = (types::List*)_piAddress;
1307 pIT = pL->get(_iItemPos - 1);
1311 wchar_t* pwcsName = to_wide_string(_pstVarname);
1312 pIT = symbol::Context::getInstance()->getCurrentLevel(symbol::Symbol(pwcsName));
1316 // reshape data with size of hypermatrix
1317 pGT = pIT->getAs<types::GenericType>();
1318 pGT->reshape(piDimsArray, piDims[1]);
1321 delete[] piDimsArray;
1324 iRet = deleteListItemReferences(_iDatasetId, piItemRef);
1332 /*--------------------------------------------------------------------------*/
1334 static bool import_struct(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname)
1340 hobj_ref_t *piItemRef = NULL;
1342 // an struct is stored in an mlist
1343 if (_iVarType != sci_mlist)
1348 iRet = getListDims(_iDatasetId, &iItems);
1356 // struct have 2 elements minimal
1360 iRet = getListItemReferences(_iDatasetId, &piItemRef);
1363 deleteListItemReferences(_iDatasetId, piItemRef);
1368 int iItemDataset = 0;
1369 iRet = getListItemDataset(_iDatasetId, piItemRef, 0, &iItemDataset);
1370 if (iRet || iItemDataset == 0)
1372 deleteListItemReferences(_iDatasetId, piItemRef);
1376 // get first item type
1377 int iItemType = getScilabTypeFromDataSet(iItemDataset);
1378 if (iItemType != sci_strings)
1380 deleteListItemReferences(_iDatasetId, piItemRef);
1384 // get size of first item
1385 iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
1386 if (iRet < 0 || iDims != 2)
1388 deleteListItemReferences(_iDatasetId, piItemRef);
1392 int* piDims = new int[2];
1393 int iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
1394 if (iSize != iItems)
1396 deleteListItemReferences(_iDatasetId, piItemRef);
1404 // get data of first item for check the type of mlist
1405 char** pstData = new char*[iSize];
1406 char** pstDataSave = new char*[iSize - 2];
1407 iRet = readStringMatrix(iItemDataset, pstData);
1408 if (iRet || strcmp(pstData[0], "st") != 0)
1410 // if not the good type, do not h5close (deleteListItemReferences)
1412 freeStringMatrix(iItemDataset, pstData);
1414 delete[] pstDataSave;
1418 for (int i = 2; i < iSize; ++i)
1420 pstDataSave[-2 + i] = new char[strlen(pstData[i]) + 1];
1421 strcpy(pstDataSave[-2 + i], pstData[i]);
1424 freeStringMatrix(iItemDataset, pstData);
1428 // get second item, the Size of struct
1429 iRet = getListItemDataset(_iDatasetId, piItemRef, 1, &iItemDataset);
1432 deleteListItemReferences(_iDatasetId, piItemRef);
1433 for (int i = 0; i < (-2 + iItems); ++i)
1435 delete pstDataSave[i];
1437 delete[] pstDataSave;
1442 iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
1443 if (iRet < 0 || iDims != 2)
1445 deleteListItemReferences(_iDatasetId, piItemRef);
1446 for (int i = 0; i < (-2 + iItems); ++i)
1448 delete pstDataSave[i];
1450 delete[] pstDataSave;
1455 piDims = new int[2];
1456 iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
1459 deleteListItemReferences(_iDatasetId, piItemRef);
1460 for (int i = 0; i < (-2 + iItems); ++i)
1462 delete pstDataSave[i];
1464 delete[] pstDataSave;
1470 int* piDimsArray = new int[piDims[1]];
1471 iRet = readInteger32Matrix(iItemDataset, piDimsArray);
1474 deleteListItemReferences(_iDatasetId, piItemRef);
1475 for (int i = 0; i < (-2 + iItems); ++i)
1477 delete pstDataSave[i];
1479 delete[] pstDataSave;
1482 delete[] piDimsArray;
1486 types::Struct* pStruct = new types::Struct(piDims[1], piDimsArray);
1488 delete[] piDimsArray;
1490 wchar_t* pwstName = NULL;
1491 for (int i = 0; i < (-2 + iItems); ++i)
1493 pwstName = to_wide_string(pstDataSave[i]);
1494 pStruct->addField(pwstName);
1495 delete pstDataSave[i];
1499 delete[] pstDataSave;
1502 types::SingleStruct** ppSStruct = pStruct->get();
1503 types::String* pStr = pStruct->getFieldNames();
1505 types::List* pList = new types::List();
1506 // fill the list to avoid api_scilab error about the list size.
1507 pList->set(0, types::Double::Empty());
1509 if (pStruct->getSize() == 1)
1511 types::InternalType* pIT = NULL;
1512 for (int i = 0; i < pStr->getSize(); ++i)
1514 int iItemDataset = 0;
1515 iRet = getListItemDataset(_iDatasetId, piItemRef, i + 2, &iItemDataset);
1516 if (iRet || iItemDataset == 0)
1518 deleteListItemReferences(_iDatasetId, piItemRef);
1524 wchar_t* pwcsName = pStr->get(i);
1525 char* pcName = wide_string_to_UTF8(pwcsName);
1527 bool bRet = import_data(pvCtx, iItemDataset, 1, (int*)pList, pcName);
1530 deleteListItemReferences(_iDatasetId, piItemRef);
1536 pIT = pList->get(0);
1537 ppSStruct[0]->set(pwcsName, pIT);
1541 else if (pStruct->getSize() > 1)
1543 for (int i = 0; i < pStr->getSize(); ++i)
1545 int iItemDataset = 0;
1546 iRet = getListItemDataset(_iDatasetId, piItemRef, i + 2, &iItemDataset);
1547 if (iRet || iItemDataset == 0)
1549 deleteListItemReferences(_iDatasetId, piItemRef);
1555 wchar_t* pwcsName = pStr->get(i);
1556 char* pcName = wide_string_to_UTF8(pwcsName);
1558 bool bRet = import_data(pvCtx, iItemDataset, 1, (int*)pList, pcName);
1561 deleteListItemReferences(_iDatasetId, piItemRef);
1567 types::List* pListData = pList->get(0)->getAs<types::List>();
1568 for (int iWriteData = 0; iWriteData < pStruct->getSize(); ++iWriteData)
1570 ppSStruct[iWriteData]->set(pwcsName, pListData->get(iWriteData));
1579 if (_piAddress == NULL)
1581 pwstName = to_wide_string(_pstVarname);
1582 symbol::Context::getInstance()->put(symbol::Symbol(pwstName), pStruct);
1587 types::List* pParentList = (types::List*)_piAddress;
1588 pParentList->set(_iItemPos - 1, pStruct);
1591 iRet = deleteListItemReferences(_iDatasetId, piItemRef);
1599 /*--------------------------------------------------------------------------*/
1602 static bool import_cell(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname)
1608 hobj_ref_t *piItemRef = NULL;
1610 // an hypermatrix is stored in an mlist
1611 if (_iVarType != sci_mlist)
1616 iRet = getListDims(_iDatasetId, &iItems);
1624 // cell have 3 elements
1628 iRet = getListItemReferences(_iDatasetId, &piItemRef);
1631 deleteListItemReferences(_iDatasetId, piItemRef);
1636 int iItemDataset = 0;
1637 iRet = getListItemDataset(_iDatasetId, piItemRef, 0, &iItemDataset);
1638 if (iRet || iItemDataset == 0)
1640 deleteListItemReferences(_iDatasetId, piItemRef);
1644 // get first item type
1645 int iItemType = getScilabTypeFromDataSet(iItemDataset);
1646 if (iItemType != sci_strings)
1648 deleteListItemReferences(_iDatasetId, piItemRef);
1652 // get size of first item
1653 iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
1654 if (iRet < 0 || iDims != 2)
1656 deleteListItemReferences(_iDatasetId, piItemRef);
1660 int* piDims = new int[2];
1661 int iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
1664 deleteListItemReferences(_iDatasetId, piItemRef);
1672 // get data of first item for check the type of mlist
1673 char** pstData = new char*[iSize];
1674 iRet = readStringMatrix(iItemDataset, pstData);
1675 if (iRet || strcmp(pstData[0], "ce") != 0)
1677 // if not the good type, do not h5close (deleteListItemReferences)
1679 freeStringMatrix(iItemDataset, pstData);
1684 freeStringMatrix(iItemDataset, pstData);
1688 // get second item, the Size of cell
1689 iRet = getListItemDataset(_iDatasetId, piItemRef, 1, &iItemDataset);
1692 deleteListItemReferences(_iDatasetId, piItemRef);
1696 iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
1697 if (iRet < 0 || iDims != 2)
1699 deleteListItemReferences(_iDatasetId, piItemRef);
1703 piDims = new int[2];
1704 iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
1707 deleteListItemReferences(_iDatasetId, piItemRef);
1712 int* piDimsArray = new int[piDims[1]];
1713 iRet = readInteger32Matrix(iItemDataset, piDimsArray);
1716 deleteListItemReferences(_iDatasetId, piItemRef);
1718 delete[] piDimsArray;
1722 types::Cell* pCell = new types::Cell(piDims[1], piDimsArray);
1724 delete[] piDimsArray;
1725 types::List* pList = new types::List();
1726 pList->set(0, types::Double::Empty());
1728 iRet = getListItemDataset(_iDatasetId, piItemRef, 2, &iItemDataset);
1729 if (iRet || iItemDataset == 0)
1731 deleteListItemReferences(_iDatasetId, piItemRef);
1737 bool bRet = import_data(pvCtx, iItemDataset, 1, (int*)pList, NULL);
1740 deleteListItemReferences(_iDatasetId, piItemRef);
1746 types::List* pListData = pList->get(0)->getAs<types::List>();
1747 for (int iWriteData = 0; iWriteData < pCell->getSize(); ++iWriteData)
1749 pCell->set(iWriteData, pListData->get(iWriteData));
1754 if (_piAddress == NULL)
1756 wchar_t* pwstName = to_wide_string(_pstVarname);
1757 symbol::Context::getInstance()->put(symbol::Symbol(pwstName), pCell);
1762 types::List* pParentList = (types::List*)_piAddress;
1763 pParentList->set(_iItemPos - 1, pCell);
1766 iRet = deleteListItemReferences(_iDatasetId, piItemRef);
1775 /*--------------------------------------------------------------------------*/