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