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