2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2009 - 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 "h5_attributeConstants.h"
27 #include "intmacr2tree.h"
28 #include "expandPathVariable.h"
35 static int iCloseList = 0;
37 void print_tree_v1(char *_pstMsg);
39 static bool import_variable_v1(int _iFile, char* _pstVarName);
40 static bool import_data_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
41 static bool import_double_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
42 static bool import_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
43 static bool import_boolean_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
44 static bool import_integer_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
45 static bool import_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
46 static bool import_boolean_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
47 static bool import_poly_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
48 static bool import_list_v1(int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname);
49 static bool import_void_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
50 static bool import_undefined_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
52 int sci_import_from_hdf5_v1(char *fname, unsigned long fname_len)
57 char* pstFilename = NULL;
58 char* pstExpandedFilename = NULL;
61 int iSelectedVar = Rhs - 1;
63 checkInputArgumentAtLeast(pvApiCtx, 1);
68 sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
71 printError(&sciErr, 0);
75 if (getAllocatedSingleString(pvApiCtx, piAddr, &pstFilename))
77 Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 2);
82 pstExpandedFilename = expandPathVariable(pstFilename);
83 int iFile = openHDF5File(pstExpandedFilename, 0);
86 FREE(pstExpandedFilename);
87 Scierror(999, _("%s: Unable to open file: %s\n"), fname, pstFilename);
92 FREE(pstExpandedFilename);
98 char* pstVarName = NULL;
99 for (int i = 0 ; i < iSelectedVar ; i++)
101 sciErr = getVarAddressFromPosition(pvApiCtx, i + 2, &piAddr);
104 printError(&sciErr, 0);
108 if (getAllocatedSingleString(pvApiCtx, piAddr, &pstVarName))
110 Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, i + 1);
114 if (import_variable_v1(iFile, pstVarName) == false)
127 iNbItem = getVariableNames_v1(iFile, NULL);
130 char **pstVarNameList = (char **)MALLOC(sizeof(char *) * iNbItem);
132 iNbItem = getVariableNames_v1(iFile, pstVarNameList);
135 for (int i = 0; i < iNbItem; i++)
137 if (import_variable_v1(iFile, pstVarNameList[i]) == false)
146 closeHDF5File(iFile);
148 int *piReturn = NULL;
150 sciErr = allocMatrixOfBoolean(pvApiCtx, Rhs + 1, 1, 1, &piReturn);
153 printError(&sciErr, 0);
169 // printf("End gateway !!!\n");
173 static bool import_variable_v1(int _iFile, char* _pstVarName)
175 int iDataSetId = getDataSetIdFromName_v1(_iFile, _pstVarName);
181 return import_data_v1(iDataSetId, 0, NULL, _pstVarName);
184 static bool import_data_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
189 int iVarType = getScilabTypeFromDataSet_v1(_iDatasetId);
195 bRet = import_double_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
200 bRet = import_string_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
207 bRet = import_list_v1(_iDatasetId, iVarType, _iItemPos, _piAddress, _pstVarname);
212 bRet = import_boolean_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
217 bRet = import_poly_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
222 bRet = import_integer_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
227 bRet = import_sparse_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
230 case sci_boolean_sparse:
232 bRet = import_boolean_sparse_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
235 case sci_void: //void item only on list variable
237 bRet = import_void_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
240 case sci_undefined: //undefined item only on list variable
242 bRet = import_undefined_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
247 Scierror(999, _("%s: Invalid HDF5 Scilab format.\n"), "import_from_hdf5");
252 sprintf(pstMsg, "Unknown type : %d", iVarType);
262 static bool import_void_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
268 sciErr = createVoidInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos);
277 printError(&sciErr, 0);
283 static bool import_undefined_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
289 sciErr = createUndefinedInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos);
298 printError(&sciErr, 0);
304 static bool import_double_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
307 double *pdblReal = NULL;
308 double *pdblImg = NULL;
315 LARGE_INTEGER iStart, iEnd, iFreq;
317 QueryPerformanceFrequency(&iFreq);
318 QueryPerformanceCounter(&iStart);
321 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
322 iComplex = isComplexData_v1(_iDatasetId);
328 if (iRows * iCols != 0)
332 pdblReal = (double *)MALLOC(iRows * iCols * sizeof(double));
333 pdblImg = (double *)MALLOC(iRows * iCols * sizeof(double));
334 iRet = readDoubleComplexMatrix_v1(_iDatasetId, iRows, iCols, pdblReal, pdblImg);
338 pdblReal = (double *)MALLOC(iRows * iCols * sizeof(double));
339 iRet = readDoubleMatrix_v1(_iDatasetId, iRows, iCols, pdblReal);
349 /*bug 7224 : to close dataset */
350 iRet = readEmptyMatrix_v1(_iDatasetId);
357 if (_piAddress == NULL)
361 sciErr = createNamedComplexMatrixOfDouble(pvApiCtx, _pstVarname, iRows, iCols, pdblReal, pdblImg);
365 sciErr = createNamedMatrixOfDouble(pvApiCtx, _pstVarname, iRows, iCols, pdblReal);
368 else //if not null this variable is in a list
372 sciErr = createComplexMatrixOfDoubleInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pdblReal, pdblImg);
376 sciErr = createMatrixOfDoubleInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pdblReal);
382 printError(&sciErr, 0);
389 sprintf(pstMsg, "double_%d (%d x %d)", _iItemPos, iRows, iCols);
409 QueryPerformanceCounter(&iEnd);
410 double dblTime = ((iEnd.QuadPart - iStart.QuadPart) * 1000.0) / iFreq.QuadPart;
412 printf("Total Double : %0.3f ms\n\n", dblTime);
418 static bool import_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
424 char **pstData = NULL;
428 LARGE_INTEGER iStart1, iEnd1, iStart2, iEnd2, iStart3, iEnd3, iFreq;
430 QueryPerformanceFrequency(&iFreq);
431 QueryPerformanceCounter(&iStart1);
433 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
439 pstData = (char **)MALLOC(iRows * iCols * sizeof(char *));
442 QueryPerformanceCounter(&iStart1);
445 iRet = readStringMatrix_v1(_iDatasetId, iRows, iCols, pstData);
452 QueryPerformanceCounter(&iEnd1);
455 QueryPerformanceCounter(&iStart2);
458 if (_piAddress == NULL)
460 sciErr = createNamedMatrixOfString(pvApiCtx, _pstVarname, iRows, iCols, pstData);
462 else //if not null this variable is in a list
464 sciErr = createMatrixOfStringInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pstData);
469 printError(&sciErr, 0);
474 QueryPerformanceCounter(&iEnd2);
475 QueryPerformanceCounter(&iStart3);
480 sprintf(pstMsg, "string_%d (%d x %d)", _iItemPos, iRows, iCols);
483 for (i = 0; i < iRows * iCols; i++)
495 QueryPerformanceCounter(&iEnd3);
497 //double dblTime =((iEnd1.QuadPart - iStart1.QuadPart) * 1000.0) / iFreq.QuadPart;
498 //printf("HDF5 : %0.3f ms\n", dblTime);
499 //dblTime =((iEnd2.QuadPart - iStart2.QuadPart) * 1000.0) / iFreq.QuadPart;
500 //printf("Stack : %0.3f ms\n", dblTime);
501 //dblTime =((iEnd3.QuadPart - iStart3.QuadPart) * 1000.0) / iFreq.QuadPart;
502 //printf("Clear : %0.3f ms\n", dblTime);
503 double dblTime = ((iEnd3.QuadPart - iStart1.QuadPart) * 1000.0) / iFreq.QuadPart;
505 printf("Total String: %0.3f ms\n\n", dblTime);
510 static bool import_integer_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
518 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
524 iRet = getDatasetPrecision_v1(_iDatasetId, &iPrec);
536 pcData = (char *)MALLOC(sizeof(char) * iRows * iCols);
537 iRet = readInteger8Matrix_v1(_iDatasetId, iRows, iCols, pcData);
543 if (_piAddress == NULL)
545 sciErr = createNamedMatrixOfInteger8(pvApiCtx, _pstVarname, iRows, iCols, pcData);
549 sciErr = createMatrixOfInteger8InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pcData);
555 unsigned char *pucData = NULL;
557 pucData = (unsigned char *)MALLOC(sizeof(unsigned char) * iRows * iCols);
558 iRet = readUnsignedInteger8Matrix_v1(_iDatasetId, iRows, iCols, pucData);
564 if (_piAddress == NULL)
566 sciErr = createNamedMatrixOfUnsignedInteger8(pvApiCtx, _pstVarname, iRows, iCols, pucData);
570 sciErr = createMatrixOfUnsignedInteger8InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pucData);
576 short *psData = NULL;
578 psData = (short *)MALLOC(sizeof(short) * iRows * iCols);
579 iRet = readInteger16Matrix_v1(_iDatasetId, iRows, iCols, psData);
585 if (_piAddress == NULL)
587 sciErr = createNamedMatrixOfInteger16(pvApiCtx, _pstVarname, iRows, iCols, psData);
591 sciErr = createMatrixOfInteger16InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, psData);
597 unsigned short *pusData = NULL;
599 pusData = (unsigned short *)MALLOC(sizeof(unsigned short) * iRows * iCols);
600 iRet = readUnsignedInteger16Matrix_v1(_iDatasetId, iRows, iCols, pusData);
606 if (_piAddress == NULL)
608 sciErr = createNamedMatrixOfUnsignedInteger16(pvApiCtx, _pstVarname, iRows, iCols, pusData);
612 sciErr = createMatrixOfUnsignedInteger16InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pusData);
620 piData = (int *)MALLOC(sizeof(int) * iRows * iCols);
621 iRet = readInteger32Matrix_v1(_iDatasetId, iRows, iCols, piData);
627 if (_piAddress == NULL)
629 sciErr = createNamedMatrixOfInteger32(pvApiCtx, _pstVarname, iRows, iCols, piData);
633 sciErr = createMatrixOfInteger32InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, piData);
639 unsigned int *puiData = NULL;
641 puiData = (unsigned int *)MALLOC(sizeof(unsigned int) * iRows * iCols);
642 iRet = readUnsignedInteger32Matrix_v1(_iDatasetId, iRows, iCols, puiData);
648 if (_piAddress == NULL)
650 sciErr = createNamedMatrixOfUnsignedInteger32(pvApiCtx, _pstVarname, iRows, iCols, puiData);
654 sciErr = createMatrixOfUnsignedInteger32InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, puiData);
660 #ifdef __SCILAB_INT64__
661 long long *pllData = NULL;
663 pllData = (long long *)MALLOC(sizeof(long long) * iRows * iCols);
664 iRet = readInteger64Matrix_v1(_iDatasetId, iRows, iCols, pllData);
670 if (_piAddress == NULL)
672 sciErr = createNamedMatrixOfInteger64(_pstVarname, iRows, iCols, pllData);
676 sciErr = createMatrixOfInteger64InNamedList(_pstVarname, _piAddress, _iItemPos, iRows, iCols, pllData);
685 #ifdef __SCILAB_INT64__
686 unsigned long long *pullData = NULL;
688 pullData = (unsigned long long *)MALLOC(sizeof(unsigned long long) * iRows * iCols);
689 iRet = readUnsignedInteger64Matrix_v1(_iDatasetId, iRows, iCols, pullData);
695 if (_piAddress == NULL)
697 sciErr = createNamedMatrixOfUnsignedInteger64(_pstVarname, iRows, iCols, pullData);
701 sciErr = createMatrixOfUnsignedInteger64InNamedList(_pstVarname, _piAddress, _iItemPos, iRows, iCols, pullData);
715 sprintf(pstMsg, "integer_%d (%d x %d)", _iItemPos, iRows, iCols);
721 printError(&sciErr, 0);
728 static bool import_boolean_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
736 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
742 if (iRows * iCols != 0)
744 piData = (int *)MALLOC(iRows * iCols * sizeof(int));
745 iRet = readBooleanMatrix_v1(_iDatasetId, iRows, iCols, piData);
752 if (_piAddress == NULL)
754 sciErr = createNamedMatrixOfBoolean(pvApiCtx, _pstVarname, iRows, iCols, piData);
756 else //if not null this variable is in a list
758 sciErr = createMatrixOfBooleanInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, piData);
763 printError(&sciErr, 0);
770 sprintf(pstMsg, "boolean_%d (%d x %d)", _iItemPos, iRows, iCols);
787 static bool import_poly_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
794 char pstVarName[64] = { 0 };
795 double **pdblReal = NULL;
796 double **pdblImg = NULL;
797 int *piNbCoef = NULL;
800 iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
806 iComplex = isComplexData_v1(_iDatasetId);
810 piNbCoef = (int *)MALLOC(iRows * iCols * sizeof(int));
811 pdblReal = (double **)MALLOC(iRows * iCols * sizeof(double *));
812 pdblImg = (double **)MALLOC(iRows * iCols * sizeof(double *));
813 iRet = readPolyComplexMatrix_v1(_iDatasetId, pstVarName, iRows, iCols, piNbCoef, pdblReal, pdblImg);
817 piNbCoef = (int *)MALLOC(iRows * iCols * sizeof(int));
818 pdblReal = (double **)MALLOC(iRows * iCols * sizeof(double *));
819 iRet = readPolyMatrix_v1(_iDatasetId, pstVarName, iRows, iCols, piNbCoef, pdblReal);
827 if (_piAddress == NULL)
831 sciErr = createNamedComplexMatrixOfPoly(pvApiCtx, _pstVarname, pstVarName, iRows, iCols, piNbCoef, pdblReal, pdblImg);
835 sciErr = createNamedMatrixOfPoly(pvApiCtx, _pstVarname, pstVarName, iRows, iCols, piNbCoef, pdblReal);
838 else //if not null this variable is in a list
843 createComplexMatrixOfPolyInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, pstVarName, iRows, iCols, piNbCoef, pdblReal,
848 sciErr = createMatrixOfPolyInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, pstVarName, iRows, iCols, piNbCoef, pdblReal);
854 printError(&sciErr, 0);
861 sprintf(pstMsg, "poly_%d (%d x %d)", _iItemPos, iRows, iCols);
865 for (i = 0; i < iRows * iCols; i++)
880 static bool import_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
886 double *pdblReal = NULL;
887 double *pdblImg = NULL;
889 int *piNbItemRow = NULL;
890 int *piColPos = NULL;
893 iRet = getSparseDimension_v1(_iDatasetId, &iRows, &iCols, &iNbItem);
899 iComplex = isComplexData_v1(_iDatasetId);
903 piNbItemRow = (int *)MALLOC(iRows * sizeof(int));
904 piColPos = (int *)MALLOC(iNbItem * sizeof(int));
905 pdblReal = (double *)MALLOC(iNbItem * sizeof(double));
906 pdblImg = (double *)MALLOC(iNbItem * sizeof(double));
907 iRet = readSparseComplexMatrix_v1(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg);
911 piNbItemRow = (int *)MALLOC(iRows * sizeof(int));
912 piColPos = (int *)MALLOC(iNbItem * sizeof(int));
913 pdblReal = (double *)MALLOC(iNbItem * sizeof(double));
914 iRet = readSparseMatrix_v1(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
922 if (_piAddress == NULL)
926 sciErr = createNamedComplexSparseMatrix(pvApiCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg);
930 sciErr = createNamedSparseMatrix(pvApiCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
933 else //if not null this variable is in a list
938 createComplexSparseMatrixInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos,
944 createSparseMatrixInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
950 printError(&sciErr, 0);
957 sprintf(pstMsg, "sparse_%d (%d x %d)", _iItemPos, iRows, iCols);
977 static bool import_boolean_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
983 int *piNbItemRow = NULL;
984 int *piColPos = NULL;
987 iRet = getSparseDimension_v1(_iDatasetId, &iRows, &iCols, &iNbItem);
993 piNbItemRow = (int *)MALLOC(iRows * sizeof(int));
994 piColPos = (int *)MALLOC(iNbItem * sizeof(int));
995 iRet = readBooleanSparseMatrix_v1(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos);
1001 if (_piAddress == NULL)
1003 sciErr = createNamedBooleanSparseMatrix(pvApiCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos);
1005 else //if not null this variable is in a list
1007 sciErr = createBooleanSparseMatrixInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos);
1012 printError(&sciErr, 0);
1019 sprintf(pstMsg, "boolean sparse_%d (%d x %d)", _iItemPos, iRows, iCols);
1034 static bool import_list_v1(int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname)
1039 int *piListAddr = NULL;
1040 hobj_ref_t *piItemRef = NULL;
1043 iRet = getListDims_v1(_iDatasetId, &iItems);
1051 //special case for empty list
1055 iRet = getListItemReferences_v1(_iDatasetId, &piItemRef);
1065 sprintf(pstMsg, "list_%d (%d)", _iItemPos, iItems);
1069 if (_piAddress == 0)
1074 sciErr = createNamedList(pvApiCtx, _pstVarname, iItems, &piListAddr);
1077 sciErr = createNamedTList(pvApiCtx, _pstVarname, iItems, &piListAddr);
1080 sciErr = createNamedMList(pvApiCtx, _pstVarname, iItems, &piListAddr);
1086 else //if not null this variable is in a list
1091 sciErr = createListInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iItems, &piListAddr);
1094 sciErr = createTListInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iItems, &piListAddr);
1097 sciErr = createMListInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iItems, &piListAddr);
1106 printError(&sciErr, 0);
1111 for (i = 0; i < iItems; i++)
1113 int iItemDataset = 0;
1115 iRet = getListItemDataset_v1(_iDatasetId, piItemRef, i, &iItemDataset);
1116 if (iRet || iItemDataset == 0)
1121 bool bRet = import_data_v1(iItemDataset, i + 1, piListAddr, _pstVarname);
1130 iRet = deleteListItemReferences_v1(_iDatasetId, piItemRef);
1137 printf("Close List %d\n\n", iCloseList++);
1143 sprintf(pstMsg1, "ListEnd_%d", _iItemPos);
1144 print_tree(pstMsg1);
1149 void print_tree(char *_pstMsg)
1152 for (int i = 0; i < iTab; i++)
1156 printf("%s\n", _pstMsg);
1160 /*--------------------------------------------------------------------------*/