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