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