Force the usage of HDF5 API 1.8
[scilab.git] / scilab / modules / hdf5 / src / c / h5_readDataFromFile_v1.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 "h5_attributeConstants.h"
28 #include "h5_readDataFromFile_v1.h"
29
30 //#define TIME_DEBUG
31
32 static herr_t find_attr_by_name_v1(hid_t loc_id, const char *name, const H5A_info_t *ainfo, void *data)
33 {
34     return !strcmp(name, (const char *)data);
35 }
36
37 /************************************************************
38
39 Operator function.  Prints the name and type of the object
40 being examined.
41
42 ************************************************************/
43 static herr_t op_func_v1(hid_t loc_id, const char *name, const H5L_info_t *info, void *operator_data)
44 {
45     H5O_info_t oinfo;
46     herr_t status = 0;
47     int *pDataSetId = (int*)operator_data;
48     hid_t obj = H5Oopen(loc_id, name, H5P_DEFAULT);
49     if (obj < 0)
50     {
51         return -1;
52     }
53
54     /*
55      * Get type of the object and return only datasetId
56      * through operator_data.
57      */
58     status = H5Oget_info(obj, &oinfo);
59     if (status < 0)
60     {
61         H5Oclose(obj);
62         return -1;
63     }
64
65     if (oinfo.type == H5O_TYPE_DATASET)
66     {
67         *pDataSetId = obj;
68     }
69     else
70     {
71         H5Oclose(obj);
72     }
73
74     return 0;
75 }
76
77 static int readIntAttribute_v1(int _iDatasetId, const char *_pstName)
78 {
79     hid_t iAttributeId;
80     herr_t status;
81     hsize_t n = 0;
82     int iVal = -1;
83
84     if (H5Aiterate(_iDatasetId, H5_INDEX_NAME, H5_ITER_NATIVE, &n, find_attr_by_name_v1, (void *)_pstName) > 0)
85     {
86         iAttributeId = H5Aopen_by_name(_iDatasetId, ".", _pstName, H5P_DEFAULT, H5P_DEFAULT);
87         if (iAttributeId < 0)
88         {
89             return -1;
90         }
91
92         status = H5Aread(iAttributeId, H5T_NATIVE_INT, &iVal);
93         if (status < 0)
94         {
95             return -1;
96         }
97
98         status = H5Aclose(iAttributeId);
99         if (status < 0)
100         {
101             return -1;
102         }
103     }
104     return iVal;
105 }
106
107 /*
108 ** WARNING : this function returns an allocated value that must be freed.
109 */
110 static char* readAttribute_v1(int _iDatasetId, const char *_pstName)
111 {
112     hid_t iAttributeId;
113     hid_t iFileType, memtype, iSpace;
114     herr_t status;
115     hsize_t dims[1];
116     hsize_t n = 0;
117     size_t iDim;
118
119     char *pstValue = NULL;
120
121     if (H5Aiterate(_iDatasetId, H5_INDEX_NAME, H5_ITER_NATIVE, &n, find_attr_by_name_v1, (void *)_pstName) > 0)
122     {
123         iAttributeId = H5Aopen_by_name(_iDatasetId, ".", _pstName, H5P_DEFAULT, H5P_DEFAULT);
124         if (iAttributeId < 0)
125         {
126             return NULL;
127         }
128         /*
129         * Get the datatype and its size.
130         */
131         iFileType = H5Aget_type(iAttributeId);
132         iDim = H5Tget_size(iFileType);
133         iDim++;                 /* Make room for null terminator */
134
135         /*
136         * Get dataspace and allocate memory for read buffer.  This is a
137         * two dimensional attribute so the dynamic allocation must be done
138         * in steps.
139         */
140         iSpace = H5Aget_space(iAttributeId);
141         if (iSpace < 0)
142         {
143             return NULL;
144         }
145
146         status = H5Sget_simple_extent_dims(iSpace, dims, NULL);
147         if (status < 0)
148         {
149             return NULL;
150         }
151
152         /*
153         * Allocate space for string data.
154         */
155         pstValue = (char *)MALLOC((size_t) ((dims[0] * iDim + 1) * sizeof(char)));
156
157         /*
158         * Create the memory datatype.
159         */
160         memtype = H5Tcopy(H5T_C_S1);
161         status = H5Tset_size(memtype, iDim);
162         if (status < 0)
163         {
164             return NULL;
165         }
166
167         /*
168         * Read the data.
169         */
170         status = H5Aread(iAttributeId, memtype, pstValue);
171         if (status < 0)
172         {
173             FREE(pstValue);
174             return NULL;
175         }
176
177         status = H5Tclose(memtype);
178         if (status < 0)
179         {
180             FREE(pstValue);
181             return NULL;
182         }
183
184         status = H5Sclose(iSpace);
185         if (status < 0)
186         {
187             FREE(pstValue);
188             return NULL;
189         }
190
191         status = H5Tclose(iFileType);
192         if (status < 0)
193         {
194             FREE(pstValue);
195             return NULL;
196         }
197
198         status = H5Aclose(iAttributeId);
199         if (status < 0)
200         {
201             FREE(pstValue);
202             return NULL;
203         }
204     }
205     return pstValue;
206
207 }
208
209 static int checkAttribute_v1(int _iDatasetId, char *_pstAttribute, char *_pstValue)
210 {
211     int iRet = 0;
212     char *pstScilabClass = NULL;
213
214     //status = H5Giterate (_iFile, "/", NULL, op_func, &iDatasetId);
215     pstScilabClass = readAttribute_v1(_iDatasetId, _pstAttribute);
216     if (pstScilabClass != NULL && strcmp(pstScilabClass, _pstValue) == 0)
217     {
218         iRet = 1;
219     }
220     if (pstScilabClass)
221     {
222         FREE(pstScilabClass);
223     }
224     return iRet;
225 }
226
227 /*
228 ** WARNING : this function returns an allocated value that must be freed.
229 */
230 char* getScilabVersionAttribute_v1(int _iFile)
231 {
232     return readAttribute_v1(_iFile, g_SCILAB_CLASS_SCI_VERSION);
233 }
234
235 int getSODFormatAttribute_v1(int _iFile)
236 {
237     return readIntAttribute_v1(_iFile, g_SCILAB_CLASS_SOD_VERSION);
238 }
239
240 int getDatasetDimension_v1(int _iDatasetId, int *_piRows, int *_piCols)
241 {
242     int iRet = 0;
243     int iDummy = 0;
244
245     *_piRows = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_ROWS);
246     *_piCols = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_COLS);
247
248     return iRet;
249 }
250
251 int getSparseDimension_v1(int _iDatasetId, int *_piRows, int *_piCols, int *_piNbItem)
252 {
253     int iRet = 0;
254     int iDummy = 0;
255
256     //get number of item in the sparse matrix
257     getDatasetDims_v1(_iDatasetId, _piRows, _piCols);
258     *_piNbItem = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_ITEMS);
259
260     return iRet;
261 }
262
263 static int isEmptyDataset_v1(int _iDatasetId)
264 {
265     return checkAttribute_v1(_iDatasetId, (char *)g_SCILAB_CLASS_EMPTY, "true");
266 }
267
268 int isComplexData_v1(int _iDatasetId)
269 {
270     return checkAttribute_v1(_iDatasetId, (char *)g_SCILAB_CLASS_COMPLEX, "true");
271 }
272
273 int getDatasetPrecision_v1(int _iDatasetId, int *_piPrec)
274 {
275     int iRet = 0;
276     char *pstScilabClass = readAttribute_v1(_iDatasetId, g_SCILAB_CLASS_PREC);
277
278     if (pstScilabClass == NULL)
279     {
280         return -1;
281     }
282     else if (strcmp(pstScilabClass, "8") == 0)
283     {
284         *_piPrec = SCI_INT8;
285     }
286     else if (strcmp(pstScilabClass, "u8") == 0)
287     {
288         *_piPrec = SCI_UINT8;
289     }
290     else if (strcmp(pstScilabClass, "16") == 0)
291     {
292         *_piPrec = SCI_INT16;
293     }
294     else if (strcmp(pstScilabClass, "u16") == 0)
295     {
296         *_piPrec = SCI_UINT16;
297     }
298     else if (strcmp(pstScilabClass, "32") == 0)
299     {
300         *_piPrec = SCI_INT32;
301     }
302     else if (strcmp(pstScilabClass, "u32") == 0)
303     {
304         *_piPrec = SCI_UINT32;
305     }
306     else if (strcmp(pstScilabClass, "64") == 0)
307     {
308         *_piPrec = SCI_INT64;
309     }
310     else if (strcmp(pstScilabClass, "u64") == 0)
311     {
312         *_piPrec = SCI_UINT64;
313     }
314     else
315     {
316         iRet = 1;
317     }
318
319     FREE(pstScilabClass);
320     return iRet;
321 }
322
323 int getVariableNames_v1(int _iFile, char **pstNameList)
324 {
325     hsize_t i = 0;
326     hsize_t iCount = 0;
327     herr_t status = 0;
328     int iNbItem = 0;
329     H5O_info_t oinfo;
330
331     status = H5Gget_num_objs(_iFile, &iCount);
332     if (status != 0)
333     {
334         return 0;
335     }
336
337     for (i = 0; i < iCount; i++)
338     {
339         status = H5Oget_info_by_idx(_iFile, "/", H5_INDEX_NAME, H5_ITER_NATIVE, i, &oinfo, H5P_DEFAULT);
340         if (status < 0)
341         {
342             return 0;
343         }
344
345         if (oinfo.type == H5O_TYPE_DATASET)
346         {
347             if (pstNameList != NULL)
348             {
349                 int iLen = 0;
350
351                 iLen = (int)H5Gget_objname_by_idx(_iFile, i, NULL, iLen);
352                 pstNameList[iNbItem] = (char *)MALLOC(sizeof(char) * (iLen + 1));   //null terminated
353                 H5Gget_objname_by_idx(_iFile, i, pstNameList[iNbItem], iLen + 1);
354             }
355             iNbItem++;
356         }
357     }
358     return iNbItem;
359 }
360
361 int getDataSetIdFromName_v1(int _iFile, char *_pstName)
362 {
363     return H5Dopen(_iFile, _pstName, H5P_DEFAULT);
364 }
365
366 int getDataSetId_v1(int _iFile)
367 {
368     herr_t status = 0;
369     int iDatasetId = 0;
370
371     /*
372     * Begin iteration.
373     */
374     status = H5Giterate(_iFile, "/", NULL, op_func_v1, &iDatasetId);
375     if (status < 0)
376     {
377         return -1;
378     }
379
380     return iDatasetId;
381 }
382
383 int getListDims_v1(int _iDatasetId, int *_piItems)
384 {
385     /*
386     * Get dataspace and dimensions of the dataset. This is a
387     * two dimensional dataset.
388     */
389     if (isEmptyDataset_v1(_iDatasetId))
390     {
391         *_piItems = 0;
392     }
393     else
394     {
395         *_piItems = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_ITEMS);
396     }
397     return 0;
398 }
399
400 int getDatasetDims_v1(int _iDatasetId, int *_piRows, int *_piCols)
401 {
402     /*
403     * Get dataspace and dimensions of the dataset. This is a
404     * two dimensional dataset.
405     */
406     if (isEmptyDataset_v1(_iDatasetId))
407     {
408         *_piCols = 0;
409         *_piRows = 0;
410     }
411     else
412     {
413         *_piRows = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_ROWS);
414         *_piCols = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_COLS);
415     }
416     return 0;
417 }
418
419 int readDouble_v1(int _iDatasetId, int _iRows, int _iCols, double *_pdblData)
420 {
421     herr_t status;
422
423     /*
424     * Read the data.
425     */
426     status = H5Dread(_iDatasetId, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pdblData);
427     if (status < 0)
428     {
429         return -1;
430     }
431
432     status = H5Dclose(_iDatasetId);
433     if (status < 0)
434     {
435         return -1;
436     }
437
438     return 0;
439 }
440
441 int readDoubleMatrix_v1(int _iDatasetId, int _iRows, int _iCols, double *_pdblData)
442 {
443     herr_t status;
444
445     if (_iRows != 0 && _iCols != 0)
446     {
447         hid_t obj;
448         hobj_ref_t Ref;
449
450         //Read the data.
451         status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, &Ref);
452         if (status < 0)
453         {
454             return -1;
455         }
456
457         //Open the referenced object, get its name and type.
458         obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &Ref);
459         readDouble_v1(obj, _iRows, _iCols, _pdblData);
460     }
461
462     status = H5Dclose(_iDatasetId);
463     if (status < 0)
464     {
465         return -1;
466     }
467
468     return 0;
469 }
470
471 int readDoubleComplexMatrix_v1(int _iDatasetId, int _iRows, int _iCols, double *_pdblReal, double *_pdblImg)
472 {
473     hid_t obj;
474     herr_t status;
475     hobj_ref_t pRef[2] = {0};
476
477     //Read the data.
478     status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pRef);
479     if (status < 0)
480     {
481         return -1;
482     }
483
484     //Open the referenced object, get its name and type.
485     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[0]);
486     status = readDouble_v1(obj, _iRows, _iCols, _pdblReal);
487     if (status < 0)
488     {
489         return -1;
490     }
491
492     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
493     status = readDouble_v1(obj, _iRows, _iCols, _pdblImg);
494     if (status < 0)
495     {
496         return -1;
497     }
498
499     status = H5Dclose(_iDatasetId);
500     if (status < 0)
501     {
502         return -1;
503     }
504
505     return 0;
506 }
507
508 int readEmptyMatrix_v1(int _iDatasetId)
509 {
510     //close dataset
511     herr_t status;
512
513     status = H5Dclose(_iDatasetId);
514     if (status < 0)
515     {
516         return -1;
517     }
518
519     return 0;
520 }
521
522 int readBooleanMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int *_piData)
523 {
524     herr_t status = 0;
525
526     /*
527     * Read the data.
528     */
529     status = H5Dread(_iDatasetId, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, _piData);
530     if (status < 0)
531     {
532         return -1;
533     }
534
535     status = H5Dclose(_iDatasetId);
536     if (status < 0)
537     {
538         return -1;
539     }
540
541     return 0;
542 }
543
544 static int readString_v1(int _iDatasetId, char **_pstData)
545 {
546     hid_t iFileType, memtype, iSpace;
547     herr_t status;
548     hsize_t dims[1];
549     size_t iDim;
550
551     /*
552     * Get the datatype and its size.
553     */
554     iFileType = H5Dget_type(_iDatasetId);
555     iDim = H5Tget_size(iFileType);
556     iDim++;                     /* Make room for null terminator */
557
558     /*
559     * Get dataspace and allocate memory for read buffer.  This is a
560     * two dimensional attribute so the dynamic allocation must be done
561     * in steps.
562     */
563     iSpace = H5Dget_space(_iDatasetId);
564     if (iSpace < 0)
565     {
566         return -1;
567     }
568
569     status = H5Sget_simple_extent_dims(iSpace, dims, NULL);
570     if (status < 0)
571     {
572         return -1;
573     }
574
575     /*
576     * Allocate space for string data.
577     */
578     *_pstData = (char *)MALLOC((size_t) ((dims[0] * iDim + 1) * sizeof(char)));
579
580     /*
581     * Create the memory datatype.
582     */
583     memtype = H5Tcopy(H5T_C_S1);
584     status = H5Tset_size(memtype, iDim);
585     if (status < 0)
586     {
587         return -1;
588     }
589
590     /*
591     * Read the data.
592     */
593     status = H5Dread(_iDatasetId, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, *_pstData);
594     if (status < 0)
595     {
596         return -1;
597     }
598
599     status = H5Tclose(memtype);
600     if (status < 0)
601     {
602         return -1;
603     }
604
605     status = H5Sclose(iSpace);
606     if (status < 0)
607     {
608         return -1;
609     }
610
611     status = H5Tclose(iFileType);
612     if (status < 0)
613     {
614         return -1;
615     }
616
617     status = H5Dclose(_iDatasetId);
618     if (status < 0)
619     {
620         return -1;
621     }
622
623     return 0;
624 }
625
626 int readStringMatrix_v1(int _iDatasetId, int _iRows, int _iCols, char **_pstData)
627 {
628     int i;
629     herr_t status;
630     hsize_t dims[1];
631     hsize_t subdims[1] = { 1 };
632     hid_t space, memspace, filetype, memtype;
633     size_t iDim;
634     size_t iAllocSize = 0;
635
636 #ifdef TIME_DEBUG
637     LARGE_INTEGER *piStart;
638     LARGE_INTEGER *piEnd;
639     LARGE_INTEGER iFreq;
640
641     QueryPerformanceFrequency(&iFreq);
642
643     piStart = (LARGE_INTEGER *) MALLOC(sizeof(LARGE_INTEGER) * (_iRows * _iCols + 1));
644     piEnd = (LARGE_INTEGER *) MALLOC(sizeof(LARGE_INTEGER) * (_iRows * _iCols + 1));
645
646     QueryPerformanceCounter(&piStart[0]);
647 #endif
648
649     /*
650     * Get the datatype and its size.
651     */
652     filetype = H5Dget_type(_iDatasetId);
653     iDim = H5Tget_size(filetype);
654     iDim++;                     /* Make room for null terminator */
655
656     /*create sub space */
657     memspace = H5Screate_simple(1, subdims, NULL);
658     if (memspace < 0)
659     {
660         return -1;
661     }
662
663     status = H5Sget_simple_extent_dims(memspace, dims, NULL);
664     if (status < 0)
665     {
666         return -1;
667     }
668
669     space = H5Dget_space(_iDatasetId);
670     if (space < 0)
671     {
672         return -1;
673     }
674
675     /*
676     * Create the memory datatype.
677     */
678     memtype = H5Tcopy(H5T_C_S1);
679     status = H5Tset_size(memtype, iDim);
680     if (status < 0)
681     {
682         return -1;
683     }
684
685     /*
686     * Allocate space for string data.
687     */
688     iAllocSize = (size_t) ((iDim + 1) * sizeof(char));
689     for (i = 0; i < _iRows * _iCols; i++)
690     {
691         _pstData[i] = (char *)MALLOC(iAllocSize);
692     }
693
694     /*
695     * Read the data.
696     */
697     for (i = 0; i < _iRows * _iCols; i++)
698     {
699         hsize_t start[1] = { i };
700         hsize_t count[1] = { 1 };
701 #ifdef TIME_DEBUG
702         QueryPerformanceCounter(&piStart[i + 1]);
703 #endif
704         status = H5Sselect_hyperslab(space, H5S_SELECT_SET, start, NULL, count, NULL);
705         if (status < 0)
706         {
707             return -1;
708         }
709
710         /*
711         * Read the data.
712         */
713         status = H5Dread(_iDatasetId, memtype, memspace, space, H5P_DEFAULT, _pstData[i]);
714         if (status < 0)
715         {
716             return -1;
717         }
718 #ifdef TIME_DEBUG
719         QueryPerformanceCounter(&piEnd[i + 1]);
720 #endif
721     }
722
723     status = H5Sclose(space);
724     if (status < 0)
725     {
726         return -1;
727     }
728
729     status = H5Sclose(memspace);
730     if (status < 0)
731     {
732         return -1;
733     }
734
735     status = H5Tclose(filetype);
736     if (status < 0)
737     {
738         return -1;
739     }
740
741     status = H5Dclose(_iDatasetId);
742     if (status < 0)
743     {
744         return -1;
745     }
746
747 #ifdef TIME_DEBUG
748     QueryPerformanceCounter(&piEnd[0]);
749
750     //print debuf timer
751     printf("\nGlobalTime : %0.3f ms\n", ((piEnd[0].QuadPart - piStart[0].QuadPart) * 1000.0) / iFreq.QuadPart);
752     for (i = 0; i < _iRows * _iCols; i++)
753     {
754         double dblTime = ((piEnd[i + 1].QuadPart - piStart[i + 1].QuadPart) * 1000.0) / iFreq.QuadPart;
755
756         printf("SubTime %d : %0.3f ms\n", i, dblTime);
757     }
758 #endif
759     return 0;
760 }
761
762 static int readComplexPoly_v1(int _iDatasetId, int *_piNbCoef, double **_pdblReal, double **_pdblImg)
763 {
764     int iRows = 0;
765     int iCols = 0;
766
767     //Get the datatype and its size.
768     getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
769
770     //Allocate space for string data.
771     *_piNbCoef = iRows * iCols;
772     *_pdblReal = (double *)MALLOC(*_piNbCoef * sizeof(double));
773     *_pdblImg = (double *)MALLOC(*_piNbCoef * sizeof(double));
774
775     //Read the data and return result.
776     return readDoubleComplexMatrix_v1(_iDatasetId, 1, *_piNbCoef, *_pdblReal, *_pdblImg);
777 }
778
779 static int readPoly_v1(int _iDatasetId, int *_piNbCoef, double **_pdblData)
780 {
781     int iRows = 0;
782     int iCols = 0;
783
784     //Get the datatype and its size.
785     getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
786
787     *_piNbCoef = iRows * iCols;
788     *_pdblData = (double *)MALLOC(*_piNbCoef * sizeof(double));
789
790     //Read the data and return result.
791     return readDoubleMatrix_v1(_iDatasetId, 1, *_piNbCoef, *_pdblData);
792 }
793
794 int readCommonPolyMatrix_v1(int _iDatasetId, char *_pstVarname, int _iComplex, int _iRows, int _iCols, int *_piNbCoef, double **_pdblReal,
795                             double **_pdblImg)
796 {
797     int i = 0;
798     hid_t obj = 0;
799     char *pstVarName = 0;
800     hobj_ref_t *pData = (hobj_ref_t *) MALLOC(_iRows * _iCols * sizeof(hobj_ref_t));
801     herr_t status;
802
803     /*
804     * Read the data.
805     */
806     status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pData);
807     if (status < 0)
808     {
809         FREE(pData);
810         return -1;
811     }
812
813     for (i = 0; i < _iRows * _iCols; i++)
814     {
815         /*
816         * Open the referenced object, get its name and type.
817         */
818         obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pData[i]);
819         if (_iComplex)
820         {
821             status = readComplexPoly_v1(obj, &_piNbCoef[i], &_pdblReal[i], &_pdblImg[i]);
822         }
823         else
824         {
825             status = readPoly_v1(obj, &_piNbCoef[i], &_pdblReal[i]);
826         }
827
828         if (status < 0)
829         {
830             FREE(pData);
831             return -1;
832         }
833     }
834
835     pstVarName = readAttribute_v1(_iDatasetId, g_SCILAB_CLASS_VARNAME);
836     strcpy(_pstVarname, pstVarName);
837     FREE(pstVarName);
838     status = H5Dclose(_iDatasetId);
839     if (status < 0)
840     {
841         FREE(pData);
842         return -1;
843     }
844
845     FREE(pData);
846
847     return 0;
848 }
849
850 int readPolyMatrix_v1(int _iDatasetId, char *_pstVarname, int _iRows, int _iCols, int *_piNbCoef, double **_pdblData)
851 {
852     return readCommonPolyMatrix_v1(_iDatasetId, _pstVarname, 0, _iRows, _iCols, _piNbCoef, _pdblData, NULL);
853 }
854
855 int readPolyComplexMatrix_v1(int _iDatasetId, char *_pstVarname, int _iRows, int _iCols, int *_piNbCoef, double **_pdblReal, double **_pdblImg)
856 {
857     return readCommonPolyMatrix_v1(_iDatasetId, _pstVarname, 1, _iRows, _iCols, _piNbCoef, _pdblReal, _pdblImg);
858 }
859
860 int readInteger8Matrix_v1(int _iDatasetId, int _iRows, int _iCols, char *_pcData)
861 {
862     herr_t status = 0;
863
864     /*
865     * Read the data.
866     */
867     status = H5Dread(_iDatasetId, H5T_NATIVE_INT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pcData);
868     if (status < 0)
869     {
870         return -1;
871     }
872
873     status = H5Dclose(_iDatasetId);
874     if (status < 0)
875     {
876         return -1;
877     }
878
879     return 0;
880 }
881
882 int readInteger16Matrix_v1(int _iDatasetId, int _iRows, int _iCols, short *_psData)
883 {
884     herr_t status = 0;
885
886     /*
887     * Read the data.
888     */
889     status = H5Dread(_iDatasetId, H5T_NATIVE_INT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, _psData);
890     if (status < 0)
891     {
892         return -1;
893     }
894
895     status = H5Dclose(_iDatasetId);
896     if (status < 0)
897     {
898         return -1;
899     }
900
901     return 0;
902 }
903
904 int readInteger32Matrix_v1(int _iDatasetId, int _iRows, int _iCols, int *_piData)
905 {
906     herr_t status = 0;
907
908     /*
909     * Read the data.
910     */
911     status = H5Dread(_iDatasetId, H5T_NATIVE_INT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, _piData);
912     if (status < 0)
913     {
914         return -1;
915     }
916
917     status = H5Dclose(_iDatasetId);
918     if (status < 0)
919     {
920         return -1;
921     }
922
923     return 0;
924 }
925
926 int readInteger64Matrix_v1(int _iDatasetId, int _iRows, int _iCols, long long *_pllData)
927 {
928     herr_t status = 0;
929
930     /*
931     * Read the data.
932     */
933     status = H5Dread(_iDatasetId, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pllData);
934     if (status < 0)
935     {
936         return -1;
937     }
938
939     status = H5Dclose(_iDatasetId);
940     if (status < 0)
941     {
942         return -1;
943     }
944
945     return 0;
946 }
947
948 int readUnsignedInteger8Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned char *_pucData)
949 {
950     herr_t status = 0;
951
952     /*
953     * Read the data.
954     */
955     status = H5Dread(_iDatasetId, H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pucData);
956     if (status < 0)
957     {
958         return -1;
959     }
960
961     status = H5Dclose(_iDatasetId);
962     if (status < 0)
963     {
964         return -1;
965     }
966
967     return 0;
968 }
969
970 int readUnsignedInteger16Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned short *_pusData)
971 {
972     herr_t status = 0;
973
974     /*
975     * Read the data.
976     */
977     status = H5Dread(_iDatasetId, H5T_NATIVE_UINT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pusData);
978     if (status < 0)
979     {
980         return -1;
981     }
982
983     status = H5Dclose(_iDatasetId);
984     if (status < 0)
985     {
986         return -1;
987     }
988
989     return 0;
990 }
991
992 int readUnsignedInteger32Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned int *_puiData)
993 {
994     herr_t status = 0;
995
996     /*
997     * Read the data.
998     */
999     status = H5Dread(_iDatasetId, H5T_NATIVE_UINT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, _puiData);
1000     if (status < 0)
1001     {
1002         return -1;
1003     }
1004
1005     status = H5Dclose(_iDatasetId);
1006     if (status < 0)
1007     {
1008         return -1;
1009     }
1010
1011     return 0;
1012 }
1013
1014 int readUnsignedInteger64Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned long long *_pullData)
1015 {
1016     herr_t status = 0;
1017
1018     /*
1019     * Read the data.
1020     */
1021     status = H5Dread(_iDatasetId, H5T_NATIVE_UINT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pullData);
1022     if (status < 0)
1023     {
1024         return -1;
1025     }
1026
1027     status = H5Dclose(_iDatasetId);
1028     if (status < 0)
1029     {
1030         return -1;
1031     }
1032
1033     return 0;
1034 }
1035
1036 int readCommonSparseComplexMatrix_v1(int _iDatasetId, int _iComplex, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos,
1037                                      double *_pdblReal, double *_pdblImg)
1038 {
1039     hid_t obj = 0;
1040     hobj_ref_t pRef[3] = {0};
1041     herr_t status;
1042
1043     /*
1044     * Read the data.
1045     */
1046     status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pRef);
1047     if (status < 0)
1048     {
1049         return -1;
1050     }
1051
1052     //read Row data
1053     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[0]);
1054     status = readInteger32Matrix_v1(obj, 1, _iRows, _piNbItemRow);
1055     if (status < 0)
1056     {
1057         return -1;
1058     }
1059
1060     //read cols data
1061     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
1062     status = readInteger32Matrix_v1(obj, 1, _iNbItem, _piColPos);
1063     if (status < 0)
1064     {
1065         return -1;
1066     }
1067
1068     //read sparse data
1069     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[2]);
1070
1071     if (_iComplex)
1072     {
1073         status = readDoubleComplexMatrix_v1(obj, 1, _iNbItem, _pdblReal, _pdblImg);
1074     }
1075     else
1076     {
1077         status = readDoubleMatrix_v1(obj, 1, _iNbItem, _pdblReal);
1078     }
1079
1080     if (status < 0)
1081     {
1082         return -1;
1083     }
1084
1085     return 0;
1086 }
1087
1088 int readSparseMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos, double *_pdblReal)
1089 {
1090     return readCommonSparseComplexMatrix_v1(_iDatasetId, 0, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, NULL);
1091 }
1092
1093 int readSparseComplexMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos, double *_pdblReal,
1094                                double *_pdblImg)
1095 {
1096     return readCommonSparseComplexMatrix_v1(_iDatasetId, 1, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, _pdblImg);
1097 }
1098
1099 int readBooleanSparseMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos)
1100 {
1101     hid_t obj = 0;
1102     hobj_ref_t pRef[2] = {0};
1103     herr_t status;
1104
1105     /*
1106     * Read the data.
1107     */
1108     status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pRef);
1109     if (status < 0)
1110     {
1111         return -1;
1112     }
1113
1114     //read Row data
1115     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[0]);
1116     status = readInteger32Matrix_v1(obj, 1, _iRows, _piNbItemRow);
1117     if (status < 0)
1118     {
1119         return -1;
1120     }
1121
1122     //read cols data
1123     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
1124     status = readInteger32Matrix_v1(obj, 1, _iNbItem, _piColPos);
1125     if (status < 0)
1126     {
1127         return -1;
1128     }
1129
1130     return 0;
1131 }
1132
1133 int getScilabTypeFromDataSet_v1(int _iDatasetId)
1134 {
1135     int iVarType = 0;
1136     char *pstScilabClass = readAttribute_v1(_iDatasetId, g_SCILAB_CLASS);
1137
1138     if (pstScilabClass == NULL)
1139     {
1140         return unknow_type;
1141     }
1142     /* HDF5 Float type + SCILAB_Class = double <=> double */
1143     if (strcmp(pstScilabClass, g_SCILAB_CLASS_DOUBLE) == 0)
1144     {
1145         iVarType = sci_matrix;
1146     }
1147     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_STRING) == 0)
1148     {
1149         iVarType = sci_strings;
1150     }
1151     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_BOOLEAN) == 0)
1152     {
1153         iVarType = sci_boolean;
1154     }
1155     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_BOOLEAN) == 0)
1156     {
1157         iVarType = sci_boolean;
1158     }
1159     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_POLY) == 0)
1160     {
1161         iVarType = sci_poly;
1162     }
1163     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_INT) == 0)
1164     {
1165         iVarType = sci_ints;
1166     }
1167     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_SPARSE) == 0)
1168     {
1169         iVarType = sci_sparse;
1170     }
1171     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_BSPARSE) == 0)
1172     {
1173         iVarType = sci_boolean_sparse;
1174     }
1175     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_LIST) == 0)
1176     {
1177         iVarType = sci_list;
1178     }
1179     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_TLIST) == 0)
1180     {
1181         iVarType = sci_tlist;
1182     }
1183     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_MLIST) == 0)
1184     {
1185         iVarType = sci_mlist;
1186     }
1187     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_VOID) == 0)
1188     {
1189         iVarType = sci_void;
1190     }
1191     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_UNDEFINED) == 0)
1192     {
1193         iVarType = sci_undefined;
1194     }
1195
1196     FREE(pstScilabClass);
1197     return iVarType;
1198 }
1199
1200 int getListItemReferences_v1(int _iDatasetId, hobj_ref_t ** _piItemRef)
1201 {
1202     int iItem = 0;
1203     herr_t status = 0;
1204
1205     getListDims_v1(_iDatasetId, &iItem);
1206
1207     *_piItemRef = (hobj_ref_t *) MALLOC(iItem * sizeof(hobj_ref_t));
1208
1209     status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, *_piItemRef);
1210     if (status < 0)
1211     {
1212         return -1;
1213     }
1214
1215     return 0;
1216 }
1217
1218 int getListItemDataset_v1(int _iDatasetId, void *_piItemRef, int _iItemPos, int *_piItemDataset)
1219 {
1220     hobj_ref_t poRef = ((hobj_ref_t *) _piItemRef)[_iItemPos];
1221
1222     *_piItemDataset = H5Rdereference(_iDatasetId, H5R_OBJECT, &poRef);
1223
1224     if (*_piItemDataset == 0)
1225     {
1226         return -1;
1227     }
1228
1229     return 0;
1230 }
1231
1232 int deleteListItemReferences_v1(int _iDatasetId, void *_piItemRef)
1233 {
1234     herr_t status;
1235
1236     if (_piItemRef)
1237     {
1238         hobj_ref_t *poRef = (hobj_ref_t *) _piItemRef;
1239
1240         FREE(poRef);
1241     }
1242
1243     status = H5Dclose(_iDatasetId);
1244     if (status < 0)
1245     {
1246         return -1;
1247     }
1248
1249     return 0;
1250 }