Merge remote-tracking branch 'origin/master' into hdf5
[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 void closeDataSet_v1(int _id)
367 {
368     if (_id > 0)
369     {
370         H5Dclose(_id);
371     }
372 }
373
374 int getDataSetId_v1(int _iFile)
375 {
376     herr_t status = 0;
377     int iDatasetId = 0;
378
379     /*
380     * Begin iteration.
381     */
382     status = H5Giterate(_iFile, "/", NULL, op_func_v1, &iDatasetId);
383     if (status < 0)
384     {
385         return -1;
386     }
387
388     return iDatasetId;
389 }
390
391 int getListDims_v1(int _iDatasetId, int *_piItems)
392 {
393     /*
394     * Get dataspace and dimensions of the dataset. This is a
395     * two dimensional dataset.
396     */
397     if (isEmptyDataset_v1(_iDatasetId))
398     {
399         *_piItems = 0;
400     }
401     else
402     {
403         *_piItems = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_ITEMS);
404     }
405     return 0;
406 }
407
408 int getDatasetDims_v1(int _iDatasetId, int *_piRows, int *_piCols)
409 {
410     /*
411     * Get dataspace and dimensions of the dataset. This is a
412     * two dimensional dataset.
413     */
414     if (isEmptyDataset_v1(_iDatasetId))
415     {
416         *_piCols = 0;
417         *_piRows = 0;
418     }
419     else
420     {
421         *_piRows = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_ROWS);
422         *_piCols = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_COLS);
423     }
424     return 0;
425 }
426
427 int readDouble_v1(int _iDatasetId, int _iRows, int _iCols, double *_pdblData)
428 {
429     herr_t status;
430
431     /*
432     * Read the data.
433     */
434     status = H5Dread(_iDatasetId, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pdblData);
435     if (status < 0)
436     {
437         return -1;
438     }
439
440     status = H5Dclose(_iDatasetId);
441     if (status < 0)
442     {
443         return -1;
444     }
445
446     return 0;
447 }
448
449 int readDoubleMatrix_v1(int _iDatasetId, int _iRows, int _iCols, double *_pdblData)
450 {
451     herr_t status;
452
453     if (_iRows != 0 && _iCols != 0)
454     {
455         hid_t obj;
456         hobj_ref_t Ref;
457
458         //Read the data.
459         status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, &Ref);
460         if (status < 0)
461         {
462             return -1;
463         }
464
465         //Open the referenced object, get its name and type.
466         obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &Ref);
467         readDouble_v1(obj, _iRows, _iCols, _pdblData);
468     }
469
470     status = H5Dclose(_iDatasetId);
471     if (status < 0)
472     {
473         return -1;
474     }
475
476     return 0;
477 }
478
479 int readDoubleComplexMatrix_v1(int _iDatasetId, int _iRows, int _iCols, double *_pdblReal, double *_pdblImg)
480 {
481     hid_t obj;
482     herr_t status;
483     hobj_ref_t pRef[2] = {0};
484
485     //Read the data.
486     status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pRef);
487     if (status < 0)
488     {
489         return -1;
490     }
491
492     //Open the referenced object, get its name and type.
493     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[0]);
494     status = readDouble_v1(obj, _iRows, _iCols, _pdblReal);
495     if (status < 0)
496     {
497         return -1;
498     }
499
500     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
501     status = readDouble_v1(obj, _iRows, _iCols, _pdblImg);
502     if (status < 0)
503     {
504         return -1;
505     }
506
507     status = H5Dclose(_iDatasetId);
508     if (status < 0)
509     {
510         return -1;
511     }
512
513     return 0;
514 }
515
516 int readEmptyMatrix_v1(int _iDatasetId)
517 {
518     //close dataset
519     herr_t status;
520
521     status = H5Dclose(_iDatasetId);
522     if (status < 0)
523     {
524         return -1;
525     }
526
527     return 0;
528 }
529
530 int readBooleanMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int *_piData)
531 {
532     herr_t status = 0;
533
534     /*
535     * Read the data.
536     */
537     status = H5Dread(_iDatasetId, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, _piData);
538     if (status < 0)
539     {
540         return -1;
541     }
542
543     status = H5Dclose(_iDatasetId);
544     if (status < 0)
545     {
546         return -1;
547     }
548
549     return 0;
550 }
551
552 static int readString_v1(int _iDatasetId, char **_pstData)
553 {
554     hid_t iFileType, memtype, iSpace;
555     herr_t status;
556     hsize_t dims[1];
557     size_t iDim;
558
559     /*
560     * Get the datatype and its size.
561     */
562     iFileType = H5Dget_type(_iDatasetId);
563     iDim = H5Tget_size(iFileType);
564     iDim++;                     /* Make room for null terminator */
565
566     /*
567     * Get dataspace and allocate memory for read buffer.  This is a
568     * two dimensional attribute so the dynamic allocation must be done
569     * in steps.
570     */
571     iSpace = H5Dget_space(_iDatasetId);
572     if (iSpace < 0)
573     {
574         return -1;
575     }
576
577     status = H5Sget_simple_extent_dims(iSpace, dims, NULL);
578     if (status < 0)
579     {
580         return -1;
581     }
582
583     /*
584     * Allocate space for string data.
585     */
586     *_pstData = (char *)MALLOC((size_t) ((dims[0] * iDim + 1) * sizeof(char)));
587
588     /*
589     * Create the memory datatype.
590     */
591     memtype = H5Tcopy(H5T_C_S1);
592     status = H5Tset_size(memtype, iDim);
593     if (status < 0)
594     {
595         return -1;
596     }
597
598     /*
599     * Read the data.
600     */
601     status = H5Dread(_iDatasetId, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, *_pstData);
602     if (status < 0)
603     {
604         return -1;
605     }
606
607     status = H5Tclose(memtype);
608     if (status < 0)
609     {
610         return -1;
611     }
612
613     status = H5Sclose(iSpace);
614     if (status < 0)
615     {
616         return -1;
617     }
618
619     status = H5Tclose(iFileType);
620     if (status < 0)
621     {
622         return -1;
623     }
624
625     status = H5Dclose(_iDatasetId);
626     if (status < 0)
627     {
628         return -1;
629     }
630
631     return 0;
632 }
633
634 int readStringMatrix_v1(int _iDatasetId, int _iRows, int _iCols, char **_pstData)
635 {
636     int i;
637     herr_t status;
638     hsize_t dims[1];
639     hsize_t subdims[1] = { 1 };
640     hid_t space, memspace, filetype, memtype;
641     size_t iDim;
642     size_t iAllocSize = 0;
643
644 #ifdef TIME_DEBUG
645     LARGE_INTEGER *piStart;
646     LARGE_INTEGER *piEnd;
647     LARGE_INTEGER iFreq;
648
649     QueryPerformanceFrequency(&iFreq);
650
651     piStart = (LARGE_INTEGER *) MALLOC(sizeof(LARGE_INTEGER) * (_iRows * _iCols + 1));
652     piEnd = (LARGE_INTEGER *) MALLOC(sizeof(LARGE_INTEGER) * (_iRows * _iCols + 1));
653
654     QueryPerformanceCounter(&piStart[0]);
655 #endif
656
657     /*
658     * Get the datatype and its size.
659     */
660     filetype = H5Dget_type(_iDatasetId);
661     iDim = H5Tget_size(filetype);
662     iDim++;                     /* Make room for null terminator */
663
664     /*create sub space */
665     memspace = H5Screate_simple(1, subdims, NULL);
666     if (memspace < 0)
667     {
668         return -1;
669     }
670
671     status = H5Sget_simple_extent_dims(memspace, dims, NULL);
672     if (status < 0)
673     {
674         return -1;
675     }
676
677     space = H5Dget_space(_iDatasetId);
678     if (space < 0)
679     {
680         return -1;
681     }
682
683     /*
684     * Create the memory datatype.
685     */
686     memtype = H5Tcopy(H5T_C_S1);
687     status = H5Tset_size(memtype, iDim);
688     if (status < 0)
689     {
690         return -1;
691     }
692
693     /*
694     * Allocate space for string data.
695     */
696     iAllocSize = (size_t) ((iDim + 1) * sizeof(char));
697     for (i = 0; i < _iRows * _iCols; i++)
698     {
699         _pstData[i] = (char *)MALLOC(iAllocSize);
700     }
701
702     /*
703     * Read the data.
704     */
705     for (i = 0; i < _iRows * _iCols; i++)
706     {
707         hsize_t start[1] = { i };
708         hsize_t count[1] = { 1 };
709 #ifdef TIME_DEBUG
710         QueryPerformanceCounter(&piStart[i + 1]);
711 #endif
712         status = H5Sselect_hyperslab(space, H5S_SELECT_SET, start, NULL, count, NULL);
713         if (status < 0)
714         {
715             return -1;
716         }
717
718         /*
719         * Read the data.
720         */
721         status = H5Dread(_iDatasetId, memtype, memspace, space, H5P_DEFAULT, _pstData[i]);
722         if (status < 0)
723         {
724             return -1;
725         }
726 #ifdef TIME_DEBUG
727         QueryPerformanceCounter(&piEnd[i + 1]);
728 #endif
729     }
730
731     status = H5Sclose(space);
732     if (status < 0)
733     {
734         return -1;
735     }
736
737     status = H5Sclose(memspace);
738     if (status < 0)
739     {
740         return -1;
741     }
742
743     status = H5Tclose(filetype);
744     if (status < 0)
745     {
746         return -1;
747     }
748
749     status = H5Dclose(_iDatasetId);
750     if (status < 0)
751     {
752         return -1;
753     }
754
755 #ifdef TIME_DEBUG
756     QueryPerformanceCounter(&piEnd[0]);
757
758     //print debuf timer
759     printf("\nGlobalTime : %0.3f ms\n", ((piEnd[0].QuadPart - piStart[0].QuadPart) * 1000.0) / iFreq.QuadPart);
760     for (i = 0; i < _iRows * _iCols; i++)
761     {
762         double dblTime = ((piEnd[i + 1].QuadPart - piStart[i + 1].QuadPart) * 1000.0) / iFreq.QuadPart;
763
764         printf("SubTime %d : %0.3f ms\n", i, dblTime);
765     }
766 #endif
767     return 0;
768 }
769
770 static int readComplexPoly_v1(int _iDatasetId, int *_piNbCoef, double **_pdblReal, double **_pdblImg)
771 {
772     int iRows = 0;
773     int iCols = 0;
774
775     //Get the datatype and its size.
776     getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
777
778     //Allocate space for string data.
779     *_piNbCoef = iRows * iCols;
780     *_pdblReal = (double *)MALLOC(*_piNbCoef * sizeof(double));
781     *_pdblImg = (double *)MALLOC(*_piNbCoef * sizeof(double));
782
783     //Read the data and return result.
784     return readDoubleComplexMatrix_v1(_iDatasetId, 1, *_piNbCoef, *_pdblReal, *_pdblImg);
785 }
786
787 static int readPoly_v1(int _iDatasetId, int *_piNbCoef, double **_pdblData)
788 {
789     int iRows = 0;
790     int iCols = 0;
791
792     //Get the datatype and its size.
793     getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
794
795     *_piNbCoef = iRows * iCols;
796     *_pdblData = (double *)MALLOC(*_piNbCoef * sizeof(double));
797
798     //Read the data and return result.
799     return readDoubleMatrix_v1(_iDatasetId, 1, *_piNbCoef, *_pdblData);
800 }
801
802 int readCommonPolyMatrix_v1(int _iDatasetId, char *_pstVarname, int _iComplex, int _iRows, int _iCols, int *_piNbCoef, double **_pdblReal,
803                             double **_pdblImg)
804 {
805     int i = 0;
806     hid_t obj = 0;
807     char *pstVarName = 0;
808     hobj_ref_t *pData = (hobj_ref_t *) MALLOC(_iRows * _iCols * sizeof(hobj_ref_t));
809     herr_t status;
810
811     /*
812     * Read the data.
813     */
814     status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pData);
815     if (status < 0)
816     {
817         FREE(pData);
818         return -1;
819     }
820
821     for (i = 0; i < _iRows * _iCols; i++)
822     {
823         /*
824         * Open the referenced object, get its name and type.
825         */
826         obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pData[i]);
827         if (_iComplex)
828         {
829             status = readComplexPoly_v1(obj, &_piNbCoef[i], &_pdblReal[i], &_pdblImg[i]);
830         }
831         else
832         {
833             status = readPoly_v1(obj, &_piNbCoef[i], &_pdblReal[i]);
834         }
835
836         if (status < 0)
837         {
838             FREE(pData);
839             return -1;
840         }
841     }
842
843     pstVarName = readAttribute_v1(_iDatasetId, g_SCILAB_CLASS_VARNAME);
844     strcpy(_pstVarname, pstVarName);
845     FREE(pstVarName);
846     status = H5Dclose(_iDatasetId);
847     if (status < 0)
848     {
849         FREE(pData);
850         return -1;
851     }
852
853     FREE(pData);
854
855     return 0;
856 }
857
858 int readPolyMatrix_v1(int _iDatasetId, char *_pstVarname, int _iRows, int _iCols, int *_piNbCoef, double **_pdblData)
859 {
860     return readCommonPolyMatrix_v1(_iDatasetId, _pstVarname, 0, _iRows, _iCols, _piNbCoef, _pdblData, NULL);
861 }
862
863 int readPolyComplexMatrix_v1(int _iDatasetId, char *_pstVarname, int _iRows, int _iCols, int *_piNbCoef, double **_pdblReal, double **_pdblImg)
864 {
865     return readCommonPolyMatrix_v1(_iDatasetId, _pstVarname, 1, _iRows, _iCols, _piNbCoef, _pdblReal, _pdblImg);
866 }
867
868 int readInteger8Matrix_v1(int _iDatasetId, int _iRows, int _iCols, char *_pcData)
869 {
870     herr_t status = 0;
871
872     /*
873     * Read the data.
874     */
875     status = H5Dread(_iDatasetId, H5T_NATIVE_INT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pcData);
876     if (status < 0)
877     {
878         return -1;
879     }
880
881     status = H5Dclose(_iDatasetId);
882     if (status < 0)
883     {
884         return -1;
885     }
886
887     return 0;
888 }
889
890 int readInteger16Matrix_v1(int _iDatasetId, int _iRows, int _iCols, short *_psData)
891 {
892     herr_t status = 0;
893
894     /*
895     * Read the data.
896     */
897     status = H5Dread(_iDatasetId, H5T_NATIVE_INT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, _psData);
898     if (status < 0)
899     {
900         return -1;
901     }
902
903     status = H5Dclose(_iDatasetId);
904     if (status < 0)
905     {
906         return -1;
907     }
908
909     return 0;
910 }
911
912 int readInteger32Matrix_v1(int _iDatasetId, int _iRows, int _iCols, int *_piData)
913 {
914     herr_t status = 0;
915
916     /*
917     * Read the data.
918     */
919     status = H5Dread(_iDatasetId, H5T_NATIVE_INT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, _piData);
920     if (status < 0)
921     {
922         return -1;
923     }
924
925     status = H5Dclose(_iDatasetId);
926     if (status < 0)
927     {
928         return -1;
929     }
930
931     return 0;
932 }
933
934 int readInteger64Matrix_v1(int _iDatasetId, int _iRows, int _iCols, long long *_pllData)
935 {
936     herr_t status = 0;
937
938     /*
939     * Read the data.
940     */
941     status = H5Dread(_iDatasetId, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pllData);
942     if (status < 0)
943     {
944         return -1;
945     }
946
947     status = H5Dclose(_iDatasetId);
948     if (status < 0)
949     {
950         return -1;
951     }
952
953     return 0;
954 }
955
956 int readUnsignedInteger8Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned char *_pucData)
957 {
958     herr_t status = 0;
959
960     /*
961     * Read the data.
962     */
963     status = H5Dread(_iDatasetId, H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pucData);
964     if (status < 0)
965     {
966         return -1;
967     }
968
969     status = H5Dclose(_iDatasetId);
970     if (status < 0)
971     {
972         return -1;
973     }
974
975     return 0;
976 }
977
978 int readUnsignedInteger16Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned short *_pusData)
979 {
980     herr_t status = 0;
981
982     /*
983     * Read the data.
984     */
985     status = H5Dread(_iDatasetId, H5T_NATIVE_UINT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pusData);
986     if (status < 0)
987     {
988         return -1;
989     }
990
991     status = H5Dclose(_iDatasetId);
992     if (status < 0)
993     {
994         return -1;
995     }
996
997     return 0;
998 }
999
1000 int readUnsignedInteger32Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned int *_puiData)
1001 {
1002     herr_t status = 0;
1003
1004     /*
1005     * Read the data.
1006     */
1007     status = H5Dread(_iDatasetId, H5T_NATIVE_UINT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, _puiData);
1008     if (status < 0)
1009     {
1010         return -1;
1011     }
1012
1013     status = H5Dclose(_iDatasetId);
1014     if (status < 0)
1015     {
1016         return -1;
1017     }
1018
1019     return 0;
1020 }
1021
1022 int readUnsignedInteger64Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned long long *_pullData)
1023 {
1024     herr_t status = 0;
1025
1026     /*
1027     * Read the data.
1028     */
1029     status = H5Dread(_iDatasetId, H5T_NATIVE_UINT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pullData);
1030     if (status < 0)
1031     {
1032         return -1;
1033     }
1034
1035     status = H5Dclose(_iDatasetId);
1036     if (status < 0)
1037     {
1038         return -1;
1039     }
1040
1041     return 0;
1042 }
1043
1044 int readCommonSparseComplexMatrix_v1(int _iDatasetId, int _iComplex, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos,
1045                                      double *_pdblReal, double *_pdblImg)
1046 {
1047     hid_t obj = 0;
1048     hobj_ref_t pRef[3] = {0};
1049     herr_t status;
1050
1051     /*
1052     * Read the data.
1053     */
1054     status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pRef);
1055     if (status < 0)
1056     {
1057         return -1;
1058     }
1059
1060     //read Row data
1061     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[0]);
1062     status = readInteger32Matrix_v1(obj, 1, _iRows, _piNbItemRow);
1063     if (status < 0)
1064     {
1065         return -1;
1066     }
1067
1068     //read cols data
1069     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
1070     status = readInteger32Matrix_v1(obj, 1, _iNbItem, _piColPos);
1071     if (status < 0)
1072     {
1073         return -1;
1074     }
1075
1076     //read sparse data
1077     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[2]);
1078
1079     if (_iComplex)
1080     {
1081         status = readDoubleComplexMatrix_v1(obj, 1, _iNbItem, _pdblReal, _pdblImg);
1082     }
1083     else
1084     {
1085         status = readDoubleMatrix_v1(obj, 1, _iNbItem, _pdblReal);
1086     }
1087
1088     if (status < 0)
1089     {
1090         return -1;
1091     }
1092
1093     return 0;
1094 }
1095
1096 int readSparseMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos, double *_pdblReal)
1097 {
1098     return readCommonSparseComplexMatrix_v1(_iDatasetId, 0, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, NULL);
1099 }
1100
1101 int readSparseComplexMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos, double *_pdblReal,
1102                                double *_pdblImg)
1103 {
1104     return readCommonSparseComplexMatrix_v1(_iDatasetId, 1, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, _pdblImg);
1105 }
1106
1107 int readBooleanSparseMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos)
1108 {
1109     hid_t obj = 0;
1110     hobj_ref_t pRef[2] = {0};
1111     herr_t status;
1112
1113     /*
1114     * Read the data.
1115     */
1116     status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pRef);
1117     if (status < 0)
1118     {
1119         return -1;
1120     }
1121
1122     //read Row data
1123     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[0]);
1124     status = readInteger32Matrix_v1(obj, 1, _iRows, _piNbItemRow);
1125     if (status < 0)
1126     {
1127         return -1;
1128     }
1129
1130     //read cols data
1131     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
1132     status = readInteger32Matrix_v1(obj, 1, _iNbItem, _piColPos);
1133     if (status < 0)
1134     {
1135         return -1;
1136     }
1137
1138     return 0;
1139 }
1140
1141 int getScilabTypeFromDataSet_v1(int _iDatasetId)
1142 {
1143     int iVarType = 0;
1144     char *pstScilabClass = readAttribute_v1(_iDatasetId, g_SCILAB_CLASS);
1145
1146     if (pstScilabClass == NULL)
1147     {
1148         return unknow_type;
1149     }
1150     /* HDF5 Float type + SCILAB_Class = double <=> double */
1151     if (strcmp(pstScilabClass, g_SCILAB_CLASS_DOUBLE) == 0)
1152     {
1153         iVarType = sci_matrix;
1154     }
1155     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_STRING) == 0)
1156     {
1157         iVarType = sci_strings;
1158     }
1159     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_BOOLEAN) == 0)
1160     {
1161         iVarType = sci_boolean;
1162     }
1163     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_BOOLEAN) == 0)
1164     {
1165         iVarType = sci_boolean;
1166     }
1167     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_POLY) == 0)
1168     {
1169         iVarType = sci_poly;
1170     }
1171     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_INT) == 0)
1172     {
1173         iVarType = sci_ints;
1174     }
1175     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_SPARSE) == 0)
1176     {
1177         iVarType = sci_sparse;
1178     }
1179     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_BSPARSE) == 0)
1180     {
1181         iVarType = sci_boolean_sparse;
1182     }
1183     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_LIST) == 0)
1184     {
1185         iVarType = sci_list;
1186     }
1187     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_TLIST) == 0)
1188     {
1189         iVarType = sci_tlist;
1190     }
1191     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_MLIST) == 0)
1192     {
1193         iVarType = sci_mlist;
1194     }
1195     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_VOID) == 0)
1196     {
1197         iVarType = sci_void;
1198     }
1199     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_UNDEFINED) == 0)
1200     {
1201         iVarType = sci_undefined;
1202     }
1203
1204     FREE(pstScilabClass);
1205     return iVarType;
1206 }
1207
1208 int getListItemReferences_v1(int _iDatasetId, hobj_ref_t ** _piItemRef)
1209 {
1210     int iItem = 0;
1211     herr_t status = 0;
1212
1213     getListDims_v1(_iDatasetId, &iItem);
1214
1215     *_piItemRef = (hobj_ref_t *) MALLOC(iItem * sizeof(hobj_ref_t));
1216
1217     status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, *_piItemRef);
1218     if (status < 0)
1219     {
1220         return -1;
1221     }
1222
1223     return 0;
1224 }
1225
1226 int getListItemDataset_v1(int _iDatasetId, void *_piItemRef, int _iItemPos, int *_piItemDataset)
1227 {
1228     hobj_ref_t poRef = ((hobj_ref_t *) _piItemRef)[_iItemPos];
1229
1230     *_piItemDataset = H5Rdereference(_iDatasetId, H5R_OBJECT, &poRef);
1231
1232     if (*_piItemDataset == 0)
1233     {
1234         return -1;
1235     }
1236
1237     return 0;
1238 }
1239
1240 int deleteListItemReferences_v1(int _iDatasetId, void *_piItemRef)
1241 {
1242     herr_t status;
1243
1244     if (_piItemRef)
1245     {
1246         hobj_ref_t *poRef = (hobj_ref_t *) _piItemRef;
1247
1248         FREE(poRef);
1249     }
1250
1251     status = H5Dclose(_iDatasetId);
1252     if (status < 0)
1253     {
1254         return -1;
1255     }
1256
1257     return 0;
1258 }