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);
759 printError(&sciErr, 0);
766 static bool import_boolean(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
776 iRet = getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
782 piDims = (int*)MALLOC(sizeof(int) * iDims);
783 iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
791 piData = (int *)MALLOC(iSize * sizeof(int));
792 iRet = readBooleanMatrix(_iDatasetId, piData);
800 if (_piAddress == NULL)
802 sciErr = createNamedMatrixOfBoolean(pvCtx, _pstVarname, piDims[0], piDims[1], piData);
804 else //if not null this variable is in a list
806 sciErr = createMatrixOfBooleanInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], piData);
817 printError(&sciErr, 0);
824 static bool import_poly(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
828 char pstVarName[64] = { 0 };
829 double **pdblReal = NULL;
830 double **pdblImg = NULL;
831 int *piNbCoef = NULL;
837 iRet = getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
843 piDims = (int*)MALLOC(sizeof(int) * iDims);
844 iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
848 piNbCoef = (int *)MALLOC(iSize * sizeof(int));
849 pdblReal = (double **)MALLOC(iSize * sizeof(double *));
850 pdblImg = (double **)MALLOC(iSize * sizeof(double *));
851 iRet = readPolyComplexMatrix(_iDatasetId, pstVarName, iDims, piDims, piNbCoef, pdblReal, pdblImg);
855 piNbCoef = (int *)MALLOC(iSize * sizeof(int));
856 pdblReal = (double **)MALLOC(iSize * sizeof(double *));
857 iRet = readPolyMatrix(_iDatasetId, pstVarName, iDims, piDims, piNbCoef, pdblReal);
864 for (int i = 0; i < iSize; i++)
872 for (int i = 0; i < iSize; i++)
882 if (_piAddress == NULL)
886 sciErr = createNamedComplexMatrixOfPoly(pvCtx, _pstVarname, pstVarName, piDims[0], piDims[1], piNbCoef, pdblReal, pdblImg);
890 sciErr = createNamedMatrixOfPoly(pvCtx, _pstVarname, pstVarName, piDims[0], piDims[1], piNbCoef, pdblReal);
893 else //if not null this variable is in a list
898 createComplexMatrixOfPolyInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, pstVarName, piDims[0], piDims[1], piNbCoef, pdblReal,
903 sciErr = createMatrixOfPolyInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, pstVarName, piDims[0], piDims[1], piNbCoef, pdblReal);
909 for (int i = 0; i < iSize; i++)
918 for (int i = 0; i < iSize; i++)
928 printError(&sciErr, 0);
935 static bool import_sparse(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
941 double *pdblReal = NULL;
942 double *pdblImg = NULL;
944 int *piNbItemRow = NULL;
945 int *piColPos = NULL;
948 iRet = getSparseDimension(_iDatasetId, &iRows, &iCols, &iNbItem);
954 iComplex = isComplexData(_iDatasetId);
958 piNbItemRow = (int *)MALLOC(iRows * sizeof(int));
959 piColPos = (int *)MALLOC(iNbItem * sizeof(int));
960 pdblReal = (double *)MALLOC(iNbItem * sizeof(double));
961 pdblImg = (double *)MALLOC(iNbItem * sizeof(double));
962 iRet = readSparseComplexMatrix(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg);
966 piNbItemRow = (int *)MALLOC(iRows * sizeof(int));
967 piColPos = (int *)MALLOC(iNbItem * sizeof(int));
968 pdblReal = (double *)MALLOC(iNbItem * sizeof(double));
969 iRet = readSparseMatrix(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
985 if (_piAddress == NULL)
989 sciErr = createNamedComplexSparseMatrix(pvCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg);
993 sciErr = createNamedSparseMatrix(pvCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
996 else //if not null this variable is in a list
1000 sciErr = createComplexSparseMatrixInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg);
1004 sciErr = createSparseMatrixInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
1018 printError(&sciErr, 0);
1025 static bool import_boolean_sparse(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
1031 int *piNbItemRow = NULL;
1032 int *piColPos = NULL;
1035 iRet = getSparseDimension(_iDatasetId, &iRows, &iCols, &iNbItem);
1041 piNbItemRow = (int *)MALLOC(iRows * sizeof(int));
1042 piColPos = (int *)MALLOC(iNbItem * sizeof(int));
1044 iRet = readBooleanSparseMatrix(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos);
1051 if (_piAddress == NULL)
1053 sciErr = createNamedBooleanSparseMatrix(pvCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos);
1055 else //if not null this variable is in a list
1057 sciErr = createBooleanSparseMatrixInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos);
1065 printError(&sciErr, 0);
1072 static bool import_list(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname)
1077 int *piListAddr = NULL;
1078 hobj_ref_t *piItemRef = NULL;
1081 iRet = getListDims(_iDatasetId, &iItems);
1089 //special case for empty list
1093 iRet = getListItemReferences(_iDatasetId, &piItemRef);
1100 if (_piAddress == 0)
1105 sciErr = createNamedList(pvCtx, _pstVarname, iItems, &piListAddr);
1108 sciErr = createNamedTList(pvCtx, _pstVarname, iItems, &piListAddr);
1111 sciErr = createNamedMList(pvCtx, _pstVarname, iItems, &piListAddr);
1117 else //if not null this variable is in a list
1122 sciErr = createListInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, iItems, &piListAddr);
1125 sciErr = createTListInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, iItems, &piListAddr);
1128 sciErr = createMListInNamedList(pvCtx, _pstVarname, _piAddress, _iItemPos, iItems, &piListAddr);
1137 printError(&sciErr, 0);
1141 for (i = 0; i < iItems; i++)
1143 int iItemDataset = 0;
1145 iRet = getListItemDataset(_iDatasetId, piItemRef, i, &iItemDataset);
1146 if (iRet || iItemDataset == 0)
1151 bool bRet = import_data(pvCtx, iItemDataset, i + 1, piListAddr, _pstVarname);
1159 iRet = deleteListItemReferences(_iDatasetId, piItemRef);
1168 static bool import_hypermat(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname)
1174 hobj_ref_t *piItemRef = NULL;
1176 // an hypermatrix is stored in an mlist
1177 if (_iVarType != sci_mlist)
1182 iRet = getListDims(_iDatasetId, &iItems);
1190 // hypermatrix have 3 elements
1194 iRet = getListItemReferences(_iDatasetId, &piItemRef);
1197 deleteListItemReferences(_iDatasetId, piItemRef);
1202 int iItemDataset = 0;
1203 iRet = getListItemDataset(_iDatasetId, piItemRef, 0, &iItemDataset);
1204 if (iRet || iItemDataset == 0)
1206 deleteListItemReferences(_iDatasetId, piItemRef);
1210 // get first item type
1211 int iItemType = getScilabTypeFromDataSet(iItemDataset);
1212 if (iItemType != sci_strings)
1214 deleteListItemReferences(_iDatasetId, piItemRef);
1218 // get size of first item
1219 iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
1220 if (iRet < 0 || iDims != 2)
1222 deleteListItemReferences(_iDatasetId, piItemRef);
1226 int* piDims = new int[2];
1227 int iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
1230 deleteListItemReferences(_iDatasetId, piItemRef);
1238 // get data of first item for check the type of mlist
1239 char** pstData = new char*[iSize];
1240 iRet = readStringMatrix(iItemDataset, pstData);
1241 if (iRet || strcmp(pstData[0], "hm") != 0)
1243 // if not the good type, do not h5close (deleteListItemReferences)
1245 freeStringMatrix(iItemDataset, pstData);
1250 freeStringMatrix(iItemDataset, pstData);
1254 // get second item, the Size of hypermatrix
1255 iRet = getListItemDataset(_iDatasetId, piItemRef, 1, &iItemDataset);
1258 deleteListItemReferences(_iDatasetId, piItemRef);
1262 iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
1263 if (iRet < 0 || iDims != 2)
1265 deleteListItemReferences(_iDatasetId, piItemRef);
1269 piDims = new int[2];
1270 iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
1273 deleteListItemReferences(_iDatasetId, piItemRef);
1278 int* piDimsArray = new int[piDims[1]];
1279 iRet = readInteger32Matrix(iItemDataset, piDimsArray);
1282 deleteListItemReferences(_iDatasetId, piItemRef);
1284 delete[] piDimsArray;
1288 // get third item, the Data of hypermatrix
1289 // import data like a "type" (Double, Int, ...) instead of mlist
1290 iRet = getListItemDataset(_iDatasetId, piItemRef, 2, &iItemDataset);
1291 bool bRet = import_data(pvCtx, iItemDataset, _iItemPos, _piAddress, _pstVarname);
1294 deleteListItemReferences(_iDatasetId, piItemRef);
1296 delete[] piDimsArray;
1300 // get imported hypermatrix from List or Context
1301 types::GenericType* pGT = NULL;
1302 types::InternalType* pIT = NULL;
1305 types::List* pL = (types::List*)_piAddress;
1306 pIT = pL->get(_iItemPos - 1);
1310 wchar_t* pwcsName = to_wide_string(_pstVarname);
1311 pIT = symbol::Context::getInstance()->getCurrentLevel(symbol::Symbol(pwcsName));
1315 // reshape data with size of hypermatrix
1316 pGT = pIT->getAs<types::GenericType>();
1317 pGT->reshape(piDimsArray, piDims[1]);
1320 delete[] piDimsArray;
1323 iRet = deleteListItemReferences(_iDatasetId, piItemRef);
1331 /*--------------------------------------------------------------------------*/
1333 static bool import_struct(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname)
1339 hobj_ref_t *piItemRef = NULL;
1341 // an struct is stored in an mlist
1342 if (_iVarType != sci_mlist)
1347 iRet = getListDims(_iDatasetId, &iItems);
1355 // struct have 2 elements minimal
1359 iRet = getListItemReferences(_iDatasetId, &piItemRef);
1362 deleteListItemReferences(_iDatasetId, piItemRef);
1367 int iItemDataset = 0;
1368 iRet = getListItemDataset(_iDatasetId, piItemRef, 0, &iItemDataset);
1369 if (iRet || iItemDataset == 0)
1371 deleteListItemReferences(_iDatasetId, piItemRef);
1375 // get first item type
1376 int iItemType = getScilabTypeFromDataSet(iItemDataset);
1377 if (iItemType != sci_strings)
1379 deleteListItemReferences(_iDatasetId, piItemRef);
1383 // get size of first item
1384 iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
1385 if (iRet < 0 || iDims != 2)
1387 deleteListItemReferences(_iDatasetId, piItemRef);
1391 int* piDims = new int[2];
1392 int iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
1393 if (iSize != iItems)
1395 deleteListItemReferences(_iDatasetId, piItemRef);
1403 // get data of first item for check the type of mlist
1404 char** pstData = new char*[iSize];
1405 char** pstDataSave = new char*[iSize - 2];
1406 iRet = readStringMatrix(iItemDataset, pstData);
1407 if (iRet || strcmp(pstData[0], "st") != 0)
1409 // if not the good type, do not h5close (deleteListItemReferences)
1411 freeStringMatrix(iItemDataset, pstData);
1413 delete[] pstDataSave;
1417 for (int i = 2; i < iSize; ++i)
1419 pstDataSave[-2 + i] = new char[strlen(pstData[i]) + 1];
1420 strcpy(pstDataSave[-2 + i], pstData[i]);
1423 freeStringMatrix(iItemDataset, pstData);
1427 // get second item, the Size of struct
1428 iRet = getListItemDataset(_iDatasetId, piItemRef, 1, &iItemDataset);
1431 deleteListItemReferences(_iDatasetId, piItemRef);
1432 for (int i = 0; i < (-2 + iItems); ++i)
1434 delete pstDataSave[i];
1436 delete[] pstDataSave;
1441 iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
1442 if (iRet < 0 || iDims != 2)
1444 deleteListItemReferences(_iDatasetId, piItemRef);
1445 for (int i = 0; i < (-2 + iItems); ++i)
1447 delete pstDataSave[i];
1449 delete[] pstDataSave;
1454 piDims = new int[2];
1455 iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
1458 deleteListItemReferences(_iDatasetId, piItemRef);
1459 for (int i = 0; i < (-2 + iItems); ++i)
1461 delete pstDataSave[i];
1463 delete[] pstDataSave;
1469 int* piDimsArray = new int[piDims[1]];
1470 iRet = readInteger32Matrix(iItemDataset, piDimsArray);
1473 deleteListItemReferences(_iDatasetId, piItemRef);
1474 for (int i = 0; i < (-2 + iItems); ++i)
1476 delete pstDataSave[i];
1478 delete[] pstDataSave;
1481 delete[] piDimsArray;
1485 types::Struct* pStruct = new types::Struct(piDims[1], piDimsArray);
1487 wchar_t* pwstName = NULL;
1488 for (int i = 0; i < (-2 + iItems); ++i)
1490 pwstName = to_wide_string(pstDataSave[i]);
1491 pStruct->addField(pwstName);
1492 delete pstDataSave[i];
1496 delete[] pstDataSave;
1499 types::SingleStruct** ppSStruct = pStruct->get();
1500 types::String* pStr = pStruct->getFieldNames();
1502 types::List* pList = new types::List();
1503 // fill the list to avoid api_scilab error about the list size.
1504 pList->set(0, types::Double::Empty());
1506 if (pStruct->getSize() == 1)
1508 types::InternalType* pIT = NULL;
1509 for (int i = 0; i < pStr->getSize(); ++i)
1511 int iItemDataset = 0;
1512 iRet = getListItemDataset(_iDatasetId, piItemRef, i + 2, &iItemDataset);
1513 if (iRet || iItemDataset == 0)
1515 deleteListItemReferences(_iDatasetId, piItemRef);
1521 wchar_t* pwcsName = pStr->get(i);
1522 char* pcName = wide_string_to_UTF8(pwcsName);
1524 bool bRet = import_data(pvCtx, iItemDataset, 1, (int*)pList, pcName);
1527 deleteListItemReferences(_iDatasetId, piItemRef);
1533 pIT = pList->get(0);
1534 ppSStruct[0]->set(pwcsName, pIT);
1538 else if (pStruct->getSize() > 1)
1540 for (int i = 0; i < pStr->getSize(); ++i)
1542 int iItemDataset = 0;
1543 iRet = getListItemDataset(_iDatasetId, piItemRef, i + 2, &iItemDataset);
1544 if (iRet || iItemDataset == 0)
1546 deleteListItemReferences(_iDatasetId, piItemRef);
1552 wchar_t* pwcsName = pStr->get(i);
1553 char* pcName = wide_string_to_UTF8(pwcsName);
1555 bool bRet = import_data(pvCtx, iItemDataset, 1, (int*)pList, pcName);
1558 deleteListItemReferences(_iDatasetId, piItemRef);
1564 types::List* pListData = pList->get(0)->getAs<types::List>();
1565 for (int iWriteData = 0; iWriteData < pStruct->getSize(); ++iWriteData)
1567 ppSStruct[iWriteData]->set(pwcsName, pListData->get(iWriteData));
1576 if (_piAddress == NULL)
1578 pwstName = to_wide_string(_pstVarname);
1579 symbol::Context::getInstance()->put(symbol::Symbol(pwstName), pStruct);
1584 types::List* pParentList = (types::List*)_piAddress;
1585 pParentList->set(_iItemPos - 1, pStruct);
1588 iRet = deleteListItemReferences(_iDatasetId, piItemRef);
1596 /*--------------------------------------------------------------------------*/
1599 static bool import_cell(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname)
1605 hobj_ref_t *piItemRef = NULL;
1607 // an hypermatrix is stored in an mlist
1608 if (_iVarType != sci_mlist)
1613 iRet = getListDims(_iDatasetId, &iItems);
1621 // cell have 3 elements
1625 iRet = getListItemReferences(_iDatasetId, &piItemRef);
1628 deleteListItemReferences(_iDatasetId, piItemRef);
1633 int iItemDataset = 0;
1634 iRet = getListItemDataset(_iDatasetId, piItemRef, 0, &iItemDataset);
1635 if (iRet || iItemDataset == 0)
1637 deleteListItemReferences(_iDatasetId, piItemRef);
1641 // get first item type
1642 int iItemType = getScilabTypeFromDataSet(iItemDataset);
1643 if (iItemType != sci_strings)
1645 deleteListItemReferences(_iDatasetId, piItemRef);
1649 // get size of first item
1650 iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
1651 if (iRet < 0 || iDims != 2)
1653 deleteListItemReferences(_iDatasetId, piItemRef);
1657 int* piDims = new int[2];
1658 int iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
1661 deleteListItemReferences(_iDatasetId, piItemRef);
1669 // get data of first item for check the type of mlist
1670 char** pstData = new char*[iSize];
1671 iRet = readStringMatrix(iItemDataset, pstData);
1672 if (iRet || strcmp(pstData[0], "ce") != 0)
1674 // if not the good type, do not h5close (deleteListItemReferences)
1676 freeStringMatrix(iItemDataset, pstData);
1681 freeStringMatrix(iItemDataset, pstData);
1685 // get second item, the Size of cell
1686 iRet = getListItemDataset(_iDatasetId, piItemRef, 1, &iItemDataset);
1689 deleteListItemReferences(_iDatasetId, piItemRef);
1693 iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
1694 if (iRet < 0 || iDims != 2)
1696 deleteListItemReferences(_iDatasetId, piItemRef);
1700 piDims = new int[2];
1701 iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
1704 deleteListItemReferences(_iDatasetId, piItemRef);
1709 int* piDimsArray = new int[piDims[1]];
1710 iRet = readInteger32Matrix(iItemDataset, piDimsArray);
1713 deleteListItemReferences(_iDatasetId, piItemRef);
1715 delete[] piDimsArray;
1719 types::Cell* pCell = new types::Cell(piDims[1], piDimsArray);
1720 types::List* pList = new types::List();
1721 pList->set(0, types::Double::Empty());
1723 iRet = getListItemDataset(_iDatasetId, piItemRef, 2, &iItemDataset);
1724 if (iRet || iItemDataset == 0)
1726 deleteListItemReferences(_iDatasetId, piItemRef);
1732 bool bRet = import_data(pvCtx, iItemDataset, 1, (int*)pList, NULL);
1735 deleteListItemReferences(_iDatasetId, piItemRef);
1741 types::List* pListData = pList->get(0)->getAs<types::List>();
1742 for (int iWriteData = 0; iWriteData < pCell->getSize(); ++iWriteData)
1744 pCell->set(iWriteData, pListData->get(iWriteData));
1749 if (_piAddress == NULL)
1751 wchar_t* pwstName = to_wide_string(_pstVarname);
1752 symbol::Context::getInstance()->put(symbol::Symbol(pwstName), pCell);
1757 types::List* pParentList = (types::List*)_piAddress;
1758 pParentList->set(_iItemPos - 1, pCell);
1761 iRet = deleteListItemReferences(_iDatasetId, piItemRef);
1770 /*--------------------------------------------------------------------------*/