hdf5: force some hdf5 lib functions, force no depreacated functions, convert code...
[scilab.git] / scilab / modules / hdf5 / src / c / h5_readDataFromFile.c
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
4 *
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-en.txt
10 *
11 */
12
13 #define H5_NO_DEPRECATED_SYMBOLS
14
15 #ifndef _MSC_VER
16 #include <sys/time.h>
17 #else
18 #include <windows.h>
19 //#include <winbase.h>
20 #endif
21
22 #include <string.h>
23 #include <hdf5.h>
24 #include <stdlib.h>
25 #include "MALLOC.h"
26 #include "sci_types.h"
27 #include "stack3.h"
28 #include "h5_attributeConstants.h"
29 #include "h5_readDataFromFile.h"
30
31 //#define TIME_DEBUG
32
33 static herr_t find_attr_by_name(hid_t loc_id, const char *name, const H5A_info_t *ainfo, void *data)
34 {
35     return !strcmp(name, (const char *)data);
36 }
37
38 /************************************************************
39
40 Operator function.  Prints the name and type of the object
41 being examined.
42
43 ************************************************************/
44 static herr_t op_func(hid_t loc_id, const char *name, const H5L_info_t *info, void *operator_data)
45 {
46     H5O_info_t oinfo;
47     herr_t status = 0;
48     int *pDataSetId = (int*)operator_data;
49     hid_t obj = H5Oopen(loc_id, name, H5P_DEFAULT);
50     if (obj < 0)
51     {
52         return -1;
53     }
54
55     /*
56      * Get type of the object and return only datasetId
57      * through operator_data.
58      */
59     status = H5Oget_info(obj, &oinfo);
60     if (status < 0)
61     {
62         H5Oclose(obj);
63         return -1;
64     }
65
66     if (oinfo.type == H5O_TYPE_DATASET)
67     {
68         *pDataSetId = obj;
69     }
70     else
71     {
72         H5Oclose(obj);
73     }
74
75     return 0;
76 }
77
78 static int readIntAttribute(int _iDatasetId, const char *_pstName)
79 {
80     hid_t iAttributeId;
81     herr_t status;
82     int iVal = -1;
83     hsize_t n = 0;
84
85     if (H5Aiterate(_iDatasetId, H5_INDEX_NAME, H5_ITER_NATIVE, &n, find_attr_by_name, (void *)_pstName) > 0)
86     {
87         iAttributeId = H5Aopen(_iDatasetId, _pstName, H5P_DEFAULT);
88         if (iAttributeId < 0)
89         {
90             return -1;
91         }
92
93         status = H5Aread(iAttributeId, H5T_NATIVE_INT, &iVal);
94         if (status < 0)
95         {
96             return -1;
97         }
98
99         status = H5Aclose(iAttributeId);
100         if (status < 0)
101         {
102             return -1;
103         }
104     }
105     return iVal;
106 }
107
108 /*
109 ** WARNING : this function returns an allocated value that must be freed.
110 */
111 static char* readAttribute(int _iDatasetId, const char *_pstName)
112 {
113     hid_t iAttributeId;
114     hid_t iFileType, memtype, iSpace;
115     herr_t status;
116     hsize_t dims[1];
117     size_t iDim;
118     hsize_t n = 0;
119
120     char *pstValue = NULL;
121
122     if (H5Aiterate(_iDatasetId, H5_INDEX_NAME, H5_ITER_NATIVE, &n, find_attr_by_name, (void *)_pstName) > 0)
123     {
124         iAttributeId = H5Aopen(_iDatasetId, _pstName, H5P_DEFAULT);
125         if (iAttributeId < 0)
126         {
127             return NULL;
128         }
129         /*
130          * Get the datatype and its size.
131          */
132         iFileType = H5Aget_type(iAttributeId);
133         iDim = H5Tget_size(iFileType);
134         iDim++;                 /* Make room for null terminator */
135
136         /*
137          * Get dataspace and allocate memory for read buffer.  This is a
138          * two dimensional attribute so the dynamic allocation must be done
139          * in steps.
140          */
141         iSpace = H5Aget_space(iAttributeId);
142         if (iSpace < 0)
143         {
144             return NULL;
145         }
146
147         status = H5Sget_simple_extent_dims(iSpace, dims, NULL);
148         if (status < 0)
149         {
150             return NULL;
151         }
152
153         /*
154          * Allocate space for string data.
155          */
156         pstValue = (char *)MALLOC((size_t) ((dims[0] * iDim + 1) * sizeof(char)));
157
158         /*
159          * Create the memory datatype.
160          */
161         memtype = H5Tcopy(H5T_C_S1);
162         status = H5Tset_size(memtype, iDim);
163         if (status < 0)
164         {
165             FREE(pstValue);
166             return NULL;
167         }
168
169         /*
170          * Read the data.
171          */
172         status = H5Aread(iAttributeId, memtype, pstValue);
173         if (status < 0)
174         {
175             FREE(pstValue);
176             return NULL;
177         }
178
179         status = H5Tclose(memtype);
180         if (status < 0)
181         {
182             FREE(pstValue);
183             return NULL;
184         }
185
186         status = H5Sclose(iSpace);
187         if (status < 0)
188         {
189             FREE(pstValue);
190             return NULL;
191         }
192
193         status = H5Tclose(iFileType);
194         if (status < 0)
195         {
196             FREE(pstValue);
197             return NULL;
198         }
199
200         status = H5Aclose(iAttributeId);
201         if (status < 0)
202         {
203             FREE(pstValue);
204             return NULL;
205         }
206     }
207     return pstValue;
208
209 }
210
211 static int checkAttribute(int _iDatasetId, char *_pstAttribute, char *_pstValue)
212 {
213     int iRet = 0;
214     char *pstScilabClass = NULL;
215
216     //status = H5Giterate (_iFile, "/", NULL, op_func, &iDatasetId);
217     pstScilabClass = readAttribute(_iDatasetId, _pstAttribute);
218     if (pstScilabClass != NULL && strcmp(pstScilabClass, _pstValue) == 0)
219     {
220         iRet = 1;
221     }
222     if (pstScilabClass)
223     {
224         FREE(pstScilabClass);
225     }
226     return iRet;
227 }
228
229 /*
230 ** WARNING : this function returns an allocated value that must be freed.
231 */
232 char* getScilabVersionAttribute(int _iFile)
233 {
234     return readAttribute(_iFile, g_SCILAB_CLASS_SCI_VERSION);
235 }
236
237 int getSODFormatAttribute(int _iFile)
238 {
239     return readIntAttribute(_iFile, g_SCILAB_CLASS_SOD_VERSION);
240 }
241
242 int getDatasetInfo(int _iDatasetId, int* _iComplex, int* _iDims, int* _piDims)
243 {
244     int iSize = 1;
245     hid_t data_type;
246     H5T_class_t data_class;
247     hid_t space = H5Dget_space(_iDatasetId);
248     if (space < 0)
249     {
250         return -1;
251     }
252
253     data_type = H5Dget_type(_iDatasetId);
254     data_class = H5Tget_class(data_type);
255     if (data_class == H5T_COMPOUND)
256     {
257         *_iComplex = 1;
258     }
259     else if (data_class == H5T_REFERENCE)
260     {
261         *_iComplex = isComplexData(_iDatasetId);
262     }
263     else
264     {
265         *_iComplex = 0;
266     }
267
268     *_iDims = H5Sget_simple_extent_ndims(space);
269     if (*_iDims < 0)
270     {
271         H5Sclose(space);
272         return -1;
273     }
274
275     if (_piDims != 0 && *_iDims != 0)
276     {
277         int i = 0;
278         hsize_t* dims = (hsize_t*)MALLOC(sizeof(hsize_t) * *_iDims);
279         if (H5Sget_simple_extent_dims(space, dims, NULL) < 0)
280         {
281             FREE(dims);
282             return -1;
283         }
284
285         //reverse dimensions
286         for (i = 0 ; i < *_iDims ; i++)
287         {
288             //reverse dimensions to improve rendering in external tools
289             _piDims[i] = (int)dims[*_iDims - 1 - i];
290             iSize *= _piDims[i];
291         }
292
293     }
294     else
295     {
296         iSize = 0;
297     }
298
299     H5Sclose(space);
300     return iSize;
301 }
302
303 int getSparseDimension(int _iDatasetId, int *_piRows, int *_piCols, int *_piNbItem)
304 {
305     int iRet = 0;
306     int iDummy = 0;
307
308     //get number of item in the sparse matrix
309     getDatasetDims(_iDatasetId, _piRows, _piCols);
310     *_piNbItem = readIntAttribute(_iDatasetId, g_SCILAB_CLASS_ITEMS);
311
312     return iRet;
313 }
314
315 static int isEmptyDataset(int _iDatasetId)
316 {
317     return checkAttribute(_iDatasetId, (char *)g_SCILAB_CLASS_EMPTY, "true");
318 }
319
320 int isComplexData(int _iDatasetId)
321 {
322     return checkAttribute(_iDatasetId, (char *)g_SCILAB_CLASS_COMPLEX, "true");
323 }
324
325 int getDatasetPrecision(int _iDatasetId, int *_piPrec)
326 {
327     int iRet = 0;
328     char *pstScilabClass = readAttribute(_iDatasetId, g_SCILAB_CLASS_PREC);
329
330     if (pstScilabClass == NULL)
331     {
332         return -1;
333     }
334     else if (strcmp(pstScilabClass, "8") == 0)
335     {
336         *_piPrec = SCI_INT8;
337     }
338     else if (strcmp(pstScilabClass, "u8") == 0)
339     {
340         *_piPrec = SCI_UINT8;
341     }
342     else if (strcmp(pstScilabClass, "16") == 0)
343     {
344         *_piPrec = SCI_INT16;
345     }
346     else if (strcmp(pstScilabClass, "u16") == 0)
347     {
348         *_piPrec = SCI_UINT16;
349     }
350     else if (strcmp(pstScilabClass, "32") == 0)
351     {
352         *_piPrec = SCI_INT32;
353     }
354     else if (strcmp(pstScilabClass, "u32") == 0)
355     {
356         *_piPrec = SCI_UINT32;
357     }
358     else if (strcmp(pstScilabClass, "64") == 0)
359     {
360         *_piPrec = SCI_INT64;
361     }
362     else if (strcmp(pstScilabClass, "u64") == 0)
363     {
364         *_piPrec = SCI_UINT64;
365     }
366     else
367     {
368         iRet = 1;
369     }
370
371     FREE(pstScilabClass);
372     return iRet;
373 }
374
375 int getVariableNames(int _iFile, char **pstNameList)
376 {
377     hsize_t i = 0;
378     hsize_t iCount = 0;
379     herr_t status = 0;
380     int iNbItem = 0;
381     H5O_info_t oinfo;
382     H5G_info_t ginfo;
383
384     status = H5Gget_info(_iFile, &ginfo);
385     if (status != 0)
386     {
387         return 0;
388     }
389
390     iCount = ginfo.nlinks;
391     for (i = 0; i < iCount; i++)
392     {
393         status = H5Oget_info_by_idx(_iFile, "/", H5_INDEX_NAME, H5_ITER_NATIVE, i, &oinfo, H5P_DEFAULT);
394         if (status < 0)
395         {
396             return 0;
397         }
398
399         if (oinfo.type == H5O_TYPE_DATASET)
400         {
401             if (pstNameList != NULL)
402             {
403                 ssize_t iLen = H5Lget_name_by_idx(_iFile, ".", H5_INDEX_NAME, H5_ITER_INC, i, 0, 0, H5P_DEFAULT) + 1;
404                 pstNameList[iNbItem] = (char*)MALLOC(sizeof(char) * iLen);
405                 H5Lget_name_by_idx(_iFile, ".", H5_INDEX_NAME, H5_ITER_INC, i, pstNameList[iNbItem], iLen, H5P_DEFAULT);
406             }
407             iNbItem++;
408         }
409     }
410     return iNbItem;
411 }
412
413 int getDataSetIdFromName(int _iFile, char *_pstName)
414 {
415     return H5Dopen(_iFile, _pstName, H5P_DEFAULT);
416 }
417
418 void closeDataSet(int _id)
419 {
420     if (_id > 0)
421     {
422         H5Dclose(_id);
423     }
424 }
425
426 int getDataSetId(int _iFile)
427 {
428     herr_t status = 0;
429     int iDatasetId = 0;
430     hsize_t idx = 0;
431
432     /*
433      * Begin iteration.
434      */
435     status = H5Literate(_iFile, H5_INDEX_NAME, H5_ITER_NATIVE, &idx, op_func, &iDatasetId);
436     if (status < 0)
437     {
438         return -1;
439     }
440
441     return iDatasetId;
442 }
443
444 int getListDims(int _iDatasetId, int *_piItems)
445 {
446     /*
447      * Get dataspace and dimensions of the dataset. This is a
448      * two dimensional dataset.
449      */
450     if (isEmptyDataset(_iDatasetId))
451     {
452         *_piItems = 0;
453     }
454     else
455     {
456         *_piItems = readIntAttribute(_iDatasetId, g_SCILAB_CLASS_ITEMS);
457     }
458     return 0;
459 }
460
461 int getDatasetDims(int _iDatasetId, int *_piRows, int *_piCols)
462 {
463     /*
464      * Get dataspace and dimensions of the dataset. This is a
465      * two dimensional dataset.
466      */
467     if (isEmptyDataset(_iDatasetId))
468     {
469         *_piCols = 0;
470         *_piRows = 0;
471     }
472     else
473     {
474         *_piRows = readIntAttribute(_iDatasetId, g_SCILAB_CLASS_ROWS);
475         *_piCols = readIntAttribute(_iDatasetId, g_SCILAB_CLASS_COLS);
476     }
477     return 0;
478 }
479
480 int readDoubleMatrix(int _iDatasetId, double *_pdblData)
481 {
482     herr_t status;
483
484     //Read the data.
485     status = H5Dread(_iDatasetId, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pdblData);
486     if (status < 0)
487     {
488         return -1;
489     }
490
491     status = H5Dclose(_iDatasetId);
492     if (status < 0)
493     {
494         return -1;
495     }
496
497     return 0;
498 }
499
500 int readDoubleComplexMatrix(int _iDatasetId, double *_pdblReal, double *_pdblImg)
501 {
502     hid_t compoundId;
503     herr_t status;
504     int iDims = 0;
505     int* piDims = NULL;
506     int iComplex = 0;
507     int iSize = 1;
508     doublecomplex* pData = NULL;
509     int i = 0;
510
511     /*define compound dataset*/
512     compoundId = H5Tcreate(H5T_COMPOUND, sizeof(doublecomplex));
513     H5Tinsert(compoundId, "real", HOFFSET(doublecomplex, r), H5T_NATIVE_DOUBLE);
514     H5Tinsert(compoundId, "imag", HOFFSET(doublecomplex, i), H5T_NATIVE_DOUBLE);
515
516     //get dimension from dataset
517     getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
518     piDims = (int*)MALLOC(sizeof(int) * iDims);
519     iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
520
521     FREE(piDims);
522     //alloc temp array
523     pData = (doublecomplex*)MALLOC(sizeof(doublecomplex) * iSize);
524     //Read the data.
525     status = H5Dread(_iDatasetId, compoundId, H5S_ALL, H5S_ALL, H5P_DEFAULT, pData);
526     if (status < 0)
527     {
528         FREE(pData);
529         return -1;
530     }
531
532
533     vGetPointerFromDoubleComplex(pData, iSize, _pdblReal, _pdblImg);
534     FREE(pData);
535     status = H5Dclose(_iDatasetId);
536     if (status < 0)
537     {
538         return -1;
539     }
540
541     return 0;
542 }
543
544 int readEmptyMatrix(int _iDatasetId)
545 {
546     //close dataset
547     herr_t status;
548
549     status = H5Dclose(_iDatasetId);
550     if (status < 0)
551     {
552         return -1;
553     }
554
555     return 0;
556 }
557
558 int readBooleanMatrix(int _iDatasetId, int *_piData)
559 {
560     herr_t status = 0;
561
562     /*
563      * Read the data.
564      */
565     status = H5Dread(_iDatasetId, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, _piData);
566     if (status < 0)
567     {
568         return -1;
569     }
570
571     status = H5Dclose(_iDatasetId);
572     if (status < 0)
573     {
574         return -1;
575     }
576
577     return 0;
578 }
579
580 int readStringMatrix(int _iDatasetId, char **_pstData)
581 {
582     herr_t status;
583     hid_t typeId;
584
585     typeId = H5Tcopy(H5T_C_S1);
586     status = H5Tset_size(typeId, H5T_VARIABLE);
587     if (status < 0)
588     {
589         return -1;
590     }
591
592     //Read the data.
593     status = H5Dread(_iDatasetId, typeId, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pstData);
594     if (status < 0)
595     {
596         return -1;
597     }
598
599     status = H5Tclose(typeId);
600     if (status < 0)
601     {
602         return -1;
603     }
604
605     status = H5Dclose(_iDatasetId);
606     if (status < 0)
607     {
608         return -1;
609     }
610
611     return 0;
612 }
613
614 static int readComplexPoly(int _iDatasetId, int *_piNbCoef, double **_pdblReal, double **_pdblImg)
615 {
616     int iComplex = 0;
617     int iSize = 0;
618     int iDims = 0;
619     //Get the datatype and its size.
620
621     iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, _piNbCoef);
622
623     //Allocate space for string data.
624     *_pdblReal = (double *)MALLOC(*_piNbCoef * sizeof(double));
625     *_pdblImg = (double *)MALLOC(*_piNbCoef * sizeof(double));
626
627     //Read the data and return result.
628     return readDoubleComplexMatrix(_iDatasetId, *_pdblReal, *_pdblImg);
629 }
630
631 static int readPoly(int _iDatasetId, int *_piNbCoef, double **_pdblData)
632 {
633     int iComplex = 0;
634     int iSize = 0;
635     int iDims = 0;
636     //Get the datatype and its size.
637     iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, _piNbCoef);
638
639     *_pdblData = (double *)MALLOC(*_piNbCoef * sizeof(double));
640
641     //Read the data and return result.
642     return readDoubleMatrix(_iDatasetId, *_pdblData);
643 }
644
645 int readCommonPolyMatrix(int _iDatasetId, char *_pstVarname, int _iComplex, int _iDims, int* _piDims, int *_piNbCoef, double **_pdblReal, double **_pdblImg)
646 {
647     int i = 0;
648     hid_t obj = 0;
649     char *pstVarName = 0;
650     hsize_t* piDims = NULL;
651     hobj_ref_t *pData = NULL;
652     herr_t status;
653     int iSize = 1;
654
655     for (i = 0 ; i < _iDims ; i++)
656     {
657         iSize *= _piDims[i];
658     }
659
660     pData = (hobj_ref_t *) MALLOC(iSize * sizeof(hobj_ref_t));
661
662     /*
663      * Read the data.
664      */
665     status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pData);
666     if (status < 0)
667     {
668         FREE(pData);
669         return -1;
670     }
671
672     for (i = 0; i < iSize; i++)
673     {
674         /*
675          * Open the referenced object, get its name and type.
676          */
677         obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pData[i]);
678         if (_iComplex)
679         {
680             status = readComplexPoly(obj, &_piNbCoef[i], &_pdblReal[i], &_pdblImg[i]);
681         }
682         else
683         {
684             status = readPoly(obj, &_piNbCoef[i], &_pdblReal[i]);
685         }
686
687         if (status < 0)
688         {
689             FREE(pData);
690             return -1;
691         }
692     }
693
694     pstVarName = readAttribute(_iDatasetId, g_SCILAB_CLASS_VARNAME);
695     strcpy(_pstVarname, pstVarName);
696     FREE(pstVarName);
697     status = H5Dclose(_iDatasetId);
698     if (status < 0)
699     {
700         FREE(pData);
701         return -1;
702     }
703
704     FREE(pData);
705
706     return 0;
707 }
708
709 int readPolyMatrix(int _iDatasetId, char *_pstVarname, int _iDims, int* _piDims, int *_piNbCoef, double **_pdblData)
710 {
711     return readCommonPolyMatrix(_iDatasetId, _pstVarname, 0, _iDims, _piDims, _piNbCoef, _pdblData, NULL);
712 }
713
714 int readPolyComplexMatrix(int _iDatasetId, char *_pstVarname, int _iDims, int* _piDims, int *_piNbCoef, double **_pdblReal, double **_pdblImg)
715 {
716     return readCommonPolyMatrix(_iDatasetId, _pstVarname, 1, _iDims, _piDims, _piNbCoef, _pdblReal, _pdblImg);
717 }
718
719 int readInteger8Matrix(int _iDatasetId, char *_pcData)
720 {
721     herr_t status = 0;
722
723     /*
724      * Read the data.
725      */
726     status = H5Dread(_iDatasetId, H5T_NATIVE_INT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pcData);
727     if (status < 0)
728     {
729         return -1;
730     }
731
732     status = H5Dclose(_iDatasetId);
733     if (status < 0)
734     {
735         return -1;
736     }
737
738     return 0;
739 }
740
741 int readInteger16Matrix(int _iDatasetId, short *_psData)
742 {
743     herr_t status = 0;
744
745     /*
746      * Read the data.
747      */
748     status = H5Dread(_iDatasetId, H5T_NATIVE_INT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, _psData);
749     if (status < 0)
750     {
751         return -1;
752     }
753
754     status = H5Dclose(_iDatasetId);
755     if (status < 0)
756     {
757         return -1;
758     }
759
760     return 0;
761 }
762
763 int readInteger32Matrix(int _iDatasetId, int *_piData)
764 {
765     herr_t status = 0;
766
767     /*
768      * Read the data.
769      */
770     status = H5Dread(_iDatasetId, H5T_NATIVE_INT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, _piData);
771     if (status < 0)
772     {
773         return -1;
774     }
775
776     status = H5Dclose(_iDatasetId);
777     if (status < 0)
778     {
779         return -1;
780     }
781
782     return 0;
783 }
784
785 int readInteger64Matrix(int _iDatasetId, long long *_pllData)
786 {
787     herr_t status = 0;
788
789     /*
790      * Read the data.
791      */
792     status = H5Dread(_iDatasetId, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pllData);
793     if (status < 0)
794     {
795         return -1;
796     }
797
798     status = H5Dclose(_iDatasetId);
799     if (status < 0)
800     {
801         return -1;
802     }
803
804     return 0;
805 }
806
807 int readUnsignedInteger8Matrix(int _iDatasetId, unsigned char *_pucData)
808 {
809     herr_t status = 0;
810
811     /*
812      * Read the data.
813      */
814     status = H5Dread(_iDatasetId, H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pucData);
815     if (status < 0)
816     {
817         return -1;
818     }
819
820     status = H5Dclose(_iDatasetId);
821     if (status < 0)
822     {
823         return -1;
824     }
825
826     return 0;
827 }
828
829 int readUnsignedInteger16Matrix(int _iDatasetId, unsigned short *_pusData)
830 {
831     herr_t status = 0;
832
833     /*
834      * Read the data.
835      */
836     status = H5Dread(_iDatasetId, H5T_NATIVE_UINT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pusData);
837     if (status < 0)
838     {
839         return -1;
840     }
841
842     status = H5Dclose(_iDatasetId);
843     if (status < 0)
844     {
845         return -1;
846     }
847
848     return 0;
849 }
850
851 int readUnsignedInteger32Matrix(int _iDatasetId, unsigned int *_puiData)
852 {
853     herr_t status = 0;
854
855     /*
856      * Read the data.
857      */
858     status = H5Dread(_iDatasetId, H5T_NATIVE_UINT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, _puiData);
859     if (status < 0)
860     {
861         return -1;
862     }
863
864     status = H5Dclose(_iDatasetId);
865     if (status < 0)
866     {
867         return -1;
868     }
869
870     return 0;
871 }
872
873 int readUnsignedInteger64Matrix(int _iDatasetId, unsigned long long *_pullData)
874 {
875     herr_t status = 0;
876
877     /*
878      * Read the data.
879      */
880     status = H5Dread(_iDatasetId, H5T_NATIVE_UINT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pullData);
881     if (status < 0)
882     {
883         return -1;
884     }
885
886     status = H5Dclose(_iDatasetId);
887     if (status < 0)
888     {
889         return -1;
890     }
891
892     return 0;
893 }
894
895 int readCommonSparseComplexMatrix(int _iDatasetId, int _iComplex, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos, double *_pdblReal, double *_pdblImg)
896 {
897     hid_t obj = 0;
898     hobj_ref_t pRef[3] = {0};
899     herr_t status;
900
901     /*
902      * Read the data.
903      */
904     status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pRef);
905     if (status < 0)
906     {
907         return -1;
908     }
909
910     //read Row data
911     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[0]);
912     status = readInteger32Matrix(obj, _piNbItemRow);
913     if (status < 0)
914     {
915         return -1;
916     }
917
918     //read cols data
919     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
920     status = readInteger32Matrix(obj, _piColPos);
921     if (status < 0)
922     {
923         return -1;
924     }
925
926     //read sparse data
927     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[2]);
928
929     if (_iComplex)
930     {
931         status = readDoubleComplexMatrix(obj, _pdblReal, _pdblImg);
932     }
933     else
934     {
935         status = readDoubleMatrix(obj, _pdblReal);
936     }
937
938     if (status < 0)
939     {
940         return -1;
941     }
942
943     status = H5Dclose(_iDatasetId);
944     if (status < 0)
945     {
946         return -1;
947     }
948
949     return 0;
950 }
951
952 int readSparseMatrix(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos, double *_pdblReal)
953 {
954     return readCommonSparseComplexMatrix(_iDatasetId, 0, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, NULL);
955 }
956
957 int readSparseComplexMatrix(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos, double *_pdblReal, double *_pdblImg)
958 {
959     return readCommonSparseComplexMatrix(_iDatasetId, 1, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, _pdblImg);
960 }
961
962 int readBooleanSparseMatrix(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos)
963 {
964     hid_t obj = 0;
965     hobj_ref_t pRef[2] = {0};
966     herr_t status;
967
968     /*
969      * Read the data.
970      */
971     status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pRef);
972     if (status < 0)
973     {
974         return -1;
975     }
976
977     //read Row data
978     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[0]);
979     status = readInteger32Matrix(obj, _piNbItemRow);
980     if (status < 0)
981     {
982         return -1;
983     }
984
985     if (_iNbItem != 0)
986     {
987         //read cols data
988         obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
989         status = readInteger32Matrix(obj, _piColPos);
990         if (status < 0)
991         {
992             return -1;
993         }
994     }
995
996     status = H5Dclose(_iDatasetId);
997     if (status < 0)
998     {
999         return -1;
1000     }
1001     return 0;
1002 }
1003
1004 int getScilabTypeFromDataSet(int _iDatasetId)
1005 {
1006     int iVarType = 0;
1007     char *pstScilabClass = readAttribute(_iDatasetId, g_SCILAB_CLASS);
1008
1009     if (pstScilabClass == NULL)
1010     {
1011         return unknow_type;
1012     }
1013     /* HDF5 Float type + SCILAB_Class = double <=> double */
1014     if (strcmp(pstScilabClass, g_SCILAB_CLASS_DOUBLE) == 0)
1015     {
1016         iVarType = sci_matrix;
1017     }
1018     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_STRING) == 0)
1019     {
1020         iVarType = sci_strings;
1021     }
1022     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_BOOLEAN) == 0)
1023     {
1024         iVarType = sci_boolean;
1025     }
1026     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_BOOLEAN) == 0)
1027     {
1028         iVarType = sci_boolean;
1029     }
1030     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_POLY) == 0)
1031     {
1032         iVarType = sci_poly;
1033     }
1034     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_INT) == 0)
1035     {
1036         iVarType = sci_ints;
1037     }
1038     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_SPARSE) == 0)
1039     {
1040         iVarType = sci_sparse;
1041     }
1042     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_BSPARSE) == 0)
1043     {
1044         iVarType = sci_boolean_sparse;
1045     }
1046     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_LIST) == 0)
1047     {
1048         iVarType = sci_list;
1049     }
1050     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_TLIST) == 0)
1051     {
1052         iVarType = sci_tlist;
1053     }
1054     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_MLIST) == 0)
1055     {
1056         iVarType = sci_mlist;
1057     }
1058     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_VOID) == 0)
1059     {
1060         iVarType = sci_void;
1061     }
1062     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_UNDEFINED) == 0)
1063     {
1064         iVarType = sci_undefined;
1065     }
1066
1067     FREE(pstScilabClass);
1068     return iVarType;
1069 }
1070
1071 int getListItemReferences(int _iDatasetId, hobj_ref_t ** _piItemRef)
1072 {
1073     int iItem = 0;
1074     herr_t status = 0;
1075
1076     getListDims(_iDatasetId, &iItem);
1077
1078     *_piItemRef = (hobj_ref_t *) MALLOC(iItem * sizeof(hobj_ref_t));
1079
1080     status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, *_piItemRef);
1081     if (status < 0)
1082     {
1083         return -1;
1084     }
1085
1086     return 0;
1087 }
1088
1089 int getListItemDataset(int _iDatasetId, void *_piItemRef, int _iItemPos, int *_piItemDataset)
1090 {
1091     hobj_ref_t poRef = ((hobj_ref_t *) _piItemRef)[_iItemPos];
1092
1093     *_piItemDataset = H5Rdereference(_iDatasetId, H5R_OBJECT, &poRef);
1094
1095     if (*_piItemDataset == 0)
1096     {
1097         return -1;
1098     }
1099
1100     return 0;
1101 }
1102
1103 int deleteListItemReferences(int _iDatasetId, void *_piItemRef)
1104 {
1105     herr_t status;
1106
1107     if (_piItemRef)
1108     {
1109         hobj_ref_t *poRef = (hobj_ref_t *) _piItemRef;
1110
1111         FREE(poRef);
1112     }
1113
1114     status = H5Dclose(_iDatasetId);
1115     if (status < 0)
1116     {
1117         return -1;
1118     }
1119
1120     return 0;
1121 }