update SOD format to version 2 57/8657/8
Antoine ELIAS [Fri, 10 Aug 2012 17:48:15 +0000 (19:48 +0200)]
test_run("hdf5","loadhdf5data")
test_run("hdf5","loadhdf5data_v1")

Change-Id: I07a9d52034c4f90ea9b1f51092ca5c51c12df69d

79 files changed:
scilab/modules/hdf5/Makefile.am
scilab/modules/hdf5/Makefile.in
scilab/modules/hdf5/includes/h5_attributeConstants.h
scilab/modules/hdf5/includes/h5_fileManagement.h
scilab/modules/hdf5/includes/h5_readDataFromFile.h
scilab/modules/hdf5/includes/h5_readDataFromFile_v1.h [new file with mode: 0644]
scilab/modules/hdf5/includes/h5_writeDataToFile.h
scilab/modules/hdf5/includes/import_from_hdf5_v1.hxx [new file with mode: 0644]
scilab/modules/hdf5/includes/listvar_in_hdf5_v1.hxx [new file with mode: 0644]
scilab/modules/hdf5/sci_gateway/cpp/sci_export_to_hdf5.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_import_from_hdf5.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_listvar_in_hdf5.cpp
scilab/modules/hdf5/src/c/core_Import.def
scilab/modules/hdf5/src/c/h5_fileManagement.c
scilab/modules/hdf5/src/c/h5_readDataFromFile.c
scilab/modules/hdf5/src/c/h5_readDataFromFile_v1.c [new file with mode: 0644]
scilab/modules/hdf5/src/c/h5_writeDataToFile.c
scilab/modules/hdf5/src/c/hdf5.vcxproj
scilab/modules/hdf5/src/c/hdf5.vcxproj.filters
scilab/modules/hdf5/src/cpp/import_from_hdf5_v1.cpp [new file with mode: 0644]
scilab/modules/hdf5/src/cpp/listvar_in_hdf5_v1.cpp [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/booleanmatrix.sod
scilab/modules/hdf5/tests/sample_scilab_data/booleanmatrix_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/booleanscalar.sod
scilab/modules/hdf5/tests/sample_scilab_data/booleanscalar_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/booleansparse.sod
scilab/modules/hdf5/tests/sample_scilab_data/booleansparse_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/emptysparse.sod
scilab/modules/hdf5/tests/sample_scilab_data/emptysparse_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/hypermatrix.sod
scilab/modules/hdf5/tests/sample_scilab_data/hypermatrix_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/hypermatrixcomplex.sod
scilab/modules/hdf5/tests/sample_scilab_data/hypermatrixcomplex_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/int16.sod
scilab/modules/hdf5/tests/sample_scilab_data/int16_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/int32.sod
scilab/modules/hdf5/tests/sample_scilab_data/int32_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/int8.sod
scilab/modules/hdf5/tests/sample_scilab_data/int8_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/list.sod
scilab/modules/hdf5/tests/sample_scilab_data/list_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/listnested.sod
scilab/modules/hdf5/tests/sample_scilab_data/listnested_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/matricedouble.sod
scilab/modules/hdf5/tests/sample_scilab_data/matricedouble_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/matricedoublecomplex.sod
scilab/modules/hdf5/tests/sample_scilab_data/matricedoublecomplex_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/matricedoublecomplexscalar.sod
scilab/modules/hdf5/tests/sample_scilab_data/matricedoublecomplexscalar_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/matricedoublescalar.sod
scilab/modules/hdf5/tests/sample_scilab_data/matricedoublescalar_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/matricestring.sod
scilab/modules/hdf5/tests/sample_scilab_data/matricestring_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/matricestringscalar.sod
scilab/modules/hdf5/tests/sample_scilab_data/matricestringscalar_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/mlist.sod
scilab/modules/hdf5/tests/sample_scilab_data/mlist_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/polynomials.sod
scilab/modules/hdf5/tests/sample_scilab_data/polynomials_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/polynomialscoef.sod
scilab/modules/hdf5/tests/sample_scilab_data/polynomialscoef_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/sparsematrix.sod
scilab/modules/hdf5/tests/sample_scilab_data/sparsematrix_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/tlist.sod
scilab/modules/hdf5/tests/sample_scilab_data/tlist_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/uint16.sod
scilab/modules/hdf5/tests/sample_scilab_data/uint16_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/uint32.sod
scilab/modules/hdf5/tests/sample_scilab_data/uint32_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/uint8.sod
scilab/modules/hdf5/tests/sample_scilab_data/uint8_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/undefinedelement.sod
scilab/modules/hdf5/tests/sample_scilab_data/undefinedelement_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/sample_scilab_data/voidelement.sod
scilab/modules/hdf5/tests/sample_scilab_data/voidelement_v1.sod [new file with mode: 0644]
scilab/modules/hdf5/tests/unit_tests/loadhdf5data.dia.ref
scilab/modules/hdf5/tests/unit_tests/loadhdf5data.tst
scilab/modules/hdf5/tests/unit_tests/loadhdf5data_v1.dia.ref [new file with mode: 0644]
scilab/modules/hdf5/tests/unit_tests/loadhdf5data_v1.tst [new file with mode: 0644]

index f19ea28..25a1f1c 100644 (file)
@@ -17,7 +17,12 @@ endif
 
 HDF5_SOURCES = src/c/h5_fileManagement.c \
 src/c/h5_writeDataToFile.c \
-src/c/h5_readDataFromFile.c
+src/c/h5_readDataFromFile.c \
+src/c/h5_readDataFromFile_v1.c \
+src/cpp/import_from_hdf5_v1.cpp \
+src/cpp/listvar_in_hdf5_v1.cpp
+
+
 
 GATEWAY_C_SOURCES = sci_gateway/c/gw_hdf5.c
 
index 44016ce..528333e 100644 (file)
@@ -140,7 +140,10 @@ LTLIBRARIES = $(noinst_LTLIBRARIES) $(pkglib_LTLIBRARIES)
 libscihdf5_algo_la_LIBADD =
 am__objects_1 = libscihdf5_algo_la-h5_fileManagement.lo \
        libscihdf5_algo_la-h5_writeDataToFile.lo \
-       libscihdf5_algo_la-h5_readDataFromFile.lo
+       libscihdf5_algo_la-h5_readDataFromFile.lo \
+       libscihdf5_algo_la-h5_readDataFromFile_v1.lo \
+       libscihdf5_algo_la-import_from_hdf5_v1.lo \
+       libscihdf5_algo_la-listvar_in_hdf5_v1.lo
 am_libscihdf5_algo_la_OBJECTS = $(am__objects_1)
 libscihdf5_algo_la_OBJECTS = $(am_libscihdf5_algo_la_OBJECTS)
 libscihdf5_la_DEPENDENCIES = libscihdf5-algo.la
@@ -446,7 +449,10 @@ top_srcdir = @top_srcdir@
 @GUI_TRUE@@XCOS_TRUE@USEANT = 1
 HDF5_SOURCES = src/c/h5_fileManagement.c \
 src/c/h5_writeDataToFile.c \
-src/c/h5_readDataFromFile.c
+src/c/h5_readDataFromFile.c \
+src/c/h5_readDataFromFile_v1.c \
+src/cpp/import_from_hdf5_v1.cpp \
+src/cpp/listvar_in_hdf5_v1.cpp
 
 GATEWAY_C_SOURCES = sci_gateway/c/gw_hdf5.c
 GATEWAY_CXX_SOURCES = sci_gateway/cpp/sci_export_to_hdf5.cpp \
@@ -682,7 +688,7 @@ clean-pkglibLTLIBRARIES:
          rm -f "$${dir}/so_locations"; \
        done
 libscihdf5-algo.la: $(libscihdf5_algo_la_OBJECTS) $(libscihdf5_algo_la_DEPENDENCIES) $(EXTRA_libscihdf5_algo_la_DEPENDENCIES) 
-       $(LINK)  $(libscihdf5_algo_la_OBJECTS) $(libscihdf5_algo_la_LIBADD) $(LIBS)
+       $(CXXLINK)  $(libscihdf5_algo_la_OBJECTS) $(libscihdf5_algo_la_LIBADD) $(LIBS)
 libscihdf5.la: $(libscihdf5_la_OBJECTS) $(libscihdf5_la_DEPENDENCIES) $(EXTRA_libscihdf5_la_DEPENDENCIES) 
        $(libscihdf5_la_LINK) -rpath $(pkglibdir) $(libscihdf5_la_OBJECTS) $(libscihdf5_la_LIBADD) $(LIBS)
 
@@ -694,7 +700,10 @@ distclean-compile:
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-h5_fileManagement.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-h5_readDataFromFile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-h5_readDataFromFile_v1.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-h5_writeDataToFile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-import_from_hdf5_v1.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-listvar_in_hdf5_v1.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-gw_hdf5.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_export_to_hdf5.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_import_from_hdf5.Plo@am__quote@
@@ -743,6 +752,13 @@ libscihdf5_algo_la-h5_readDataFromFile.lo: src/c/h5_readDataFromFile.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscihdf5_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libscihdf5_algo_la-h5_readDataFromFile.lo `test -f 'src/c/h5_readDataFromFile.c' || echo '$(srcdir)/'`src/c/h5_readDataFromFile.c
 
+libscihdf5_algo_la-h5_readDataFromFile_v1.lo: src/c/h5_readDataFromFile_v1.c
+@am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscihdf5_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libscihdf5_algo_la-h5_readDataFromFile_v1.lo -MD -MP -MF $(DEPDIR)/libscihdf5_algo_la-h5_readDataFromFile_v1.Tpo -c -o libscihdf5_algo_la-h5_readDataFromFile_v1.lo `test -f 'src/c/h5_readDataFromFile_v1.c' || echo '$(srcdir)/'`src/c/h5_readDataFromFile_v1.c
+@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscihdf5_algo_la-h5_readDataFromFile_v1.Tpo $(DEPDIR)/libscihdf5_algo_la-h5_readDataFromFile_v1.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='src/c/h5_readDataFromFile_v1.c' object='libscihdf5_algo_la-h5_readDataFromFile_v1.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscihdf5_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libscihdf5_algo_la-h5_readDataFromFile_v1.lo `test -f 'src/c/h5_readDataFromFile_v1.c' || echo '$(srcdir)/'`src/c/h5_readDataFromFile_v1.c
+
 libscihdf5_la-gw_hdf5.lo: sci_gateway/c/gw_hdf5.c
 @am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscihdf5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libscihdf5_la-gw_hdf5.lo -MD -MP -MF $(DEPDIR)/libscihdf5_la-gw_hdf5.Tpo -c -o libscihdf5_la-gw_hdf5.lo `test -f 'sci_gateway/c/gw_hdf5.c' || echo '$(srcdir)/'`sci_gateway/c/gw_hdf5.c
 @am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscihdf5_la-gw_hdf5.Tpo $(DEPDIR)/libscihdf5_la-gw_hdf5.Plo
@@ -771,6 +787,20 @@ libscihdf5_la-gw_hdf5.lo: sci_gateway/c/gw_hdf5.c
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
 
+libscihdf5_algo_la-import_from_hdf5_v1.lo: src/cpp/import_from_hdf5_v1.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscihdf5_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscihdf5_algo_la-import_from_hdf5_v1.lo -MD -MP -MF $(DEPDIR)/libscihdf5_algo_la-import_from_hdf5_v1.Tpo -c -o libscihdf5_algo_la-import_from_hdf5_v1.lo `test -f 'src/cpp/import_from_hdf5_v1.cpp' || echo '$(srcdir)/'`src/cpp/import_from_hdf5_v1.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscihdf5_algo_la-import_from_hdf5_v1.Tpo $(DEPDIR)/libscihdf5_algo_la-import_from_hdf5_v1.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='src/cpp/import_from_hdf5_v1.cpp' object='libscihdf5_algo_la-import_from_hdf5_v1.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscihdf5_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscihdf5_algo_la-import_from_hdf5_v1.lo `test -f 'src/cpp/import_from_hdf5_v1.cpp' || echo '$(srcdir)/'`src/cpp/import_from_hdf5_v1.cpp
+
+libscihdf5_algo_la-listvar_in_hdf5_v1.lo: src/cpp/listvar_in_hdf5_v1.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscihdf5_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscihdf5_algo_la-listvar_in_hdf5_v1.lo -MD -MP -MF $(DEPDIR)/libscihdf5_algo_la-listvar_in_hdf5_v1.Tpo -c -o libscihdf5_algo_la-listvar_in_hdf5_v1.lo `test -f 'src/cpp/listvar_in_hdf5_v1.cpp' || echo '$(srcdir)/'`src/cpp/listvar_in_hdf5_v1.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscihdf5_algo_la-listvar_in_hdf5_v1.Tpo $(DEPDIR)/libscihdf5_algo_la-listvar_in_hdf5_v1.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='src/cpp/listvar_in_hdf5_v1.cpp' object='libscihdf5_algo_la-listvar_in_hdf5_v1.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscihdf5_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscihdf5_algo_la-listvar_in_hdf5_v1.lo `test -f 'src/cpp/listvar_in_hdf5_v1.cpp' || echo '$(srcdir)/'`src/cpp/listvar_in_hdf5_v1.cpp
+
 libscihdf5_la-sci_export_to_hdf5.lo: sci_gateway/cpp/sci_export_to_hdf5.cpp
 @am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscihdf5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscihdf5_la-sci_export_to_hdf5.lo -MD -MP -MF $(DEPDIR)/libscihdf5_la-sci_export_to_hdf5.Tpo -c -o libscihdf5_la-sci_export_to_hdf5.lo `test -f 'sci_gateway/cpp/sci_export_to_hdf5.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_export_to_hdf5.cpp
 @am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscihdf5_la-sci_export_to_hdf5.Tpo $(DEPDIR)/libscihdf5_la-sci_export_to_hdf5.Plo
index 9290473..d8282eb 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2009-2009 - DIGITEO - Bruno JOFRET
+ *  Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
  *
  *  This file must be used under the terms of the CeCILL.
  *  This source file is licensed as described in the file COPYING, which
@@ -13,7 +13,7 @@
 #ifndef __H5_ATTRIBUTECONSTATS_H__
 #define __H5_ATTRIBUTECONSTATS_H__
 
-#define SOD_FILE_VERSION     1
+#define SOD_FILE_VERSION     2
 
 static const char g_SCILAB_CLASS[]              =      "SCILAB_Class";
 static const char g_SCILAB_CLASS_EMPTY[]        =      "SCILAB_empty";
index a245021..f0dc841 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2009-2009 - DIGITEO - Bruno JOFRET
- * 
+ *  Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
+ *
  *  This file must be used under the terms of the CeCILL.
  *  This source file is licensed as described in the file COPYING, which
  *  you should have received as part of this distribution.  The terms
index f728255..73acaf8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2009-2009 - DIGITEO - Bruno JOFRET
+ *  Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
  *
  *  This file must be used under the terms of the CeCILL.
  *  This source file is licensed as described in the file COPYING, which
@@ -32,6 +32,7 @@ HDF5_SCILAB_IMPEXP int getDataSetId(int  _iFile);
 
 HDF5_SCILAB_IMPEXP int getDataSetIdFromName(int _iFile, char *_pstName);
 
+HDF5_SCILAB_IMPEXP int getDatasetInfo(int _iDatasetId, int* _iComplex, int* _iDims, int* _piDims);
 HDF5_SCILAB_IMPEXP int getDatasetDims(int _iDatasetId, int *_piRows, int *_piCols);
 HDF5_SCILAB_IMPEXP int getListDims(int _iDatasetId, int *_piItem);
 
@@ -43,25 +44,25 @@ HDF5_SCILAB_IMPEXP int getSparseDimension(int _iDatasetId, int* _piRows, int * _
 
 HDF5_SCILAB_IMPEXP int readEmptyMatrix(int _iDatasetId);
 
-HDF5_SCILAB_IMPEXP int readDoubleMatrix(int _iDatasetId, int _iRows, int _iCols, double *_pdblData);
-HDF5_SCILAB_IMPEXP int readDoubleComplexMatrix(int _iDatasetId, int _iRows, int _iCols, double *_pdblReal, double *_pdblImg);
+HDF5_SCILAB_IMPEXP int readDoubleMatrix(int _iDatasetId, double *_pdblData);
+HDF5_SCILAB_IMPEXP int readDoubleComplexMatrix(int _iDatasetId, double *_pdblReal, double *_pdblImg);
 
-HDF5_SCILAB_IMPEXP int readStringMatrix(int _iDatasetId, int _iRows, int _iCols, char **_pstData);
+HDF5_SCILAB_IMPEXP int readStringMatrix(int _iDatasetId, char **_pstData);
 
-HDF5_SCILAB_IMPEXP int readBooleanMatrix(int _iDatasetId, int _iRows, int _iCols, int* _piData);
+HDF5_SCILAB_IMPEXP int readBooleanMatrix(int _iDatasetId, int* _piData);
 
-HDF5_SCILAB_IMPEXP int readPolyMatrix(int _iDatasetId, char* _pstVarname, int _iRows, int _iCols, int* _piNbCoef, double **_pdblData);
-HDF5_SCILAB_IMPEXP int readPolyComplexMatrix(int _iDatasetId, char* _pstVarname, int _iRows, int _iCols, int* _piNbCoef, double **_pdblReal, double **_pdblImg);
+HDF5_SCILAB_IMPEXP int readPolyMatrix(int _iDatasetId, char* _pstVarname, int _iDims, int* _piDims, int* _piNbCoef, double **_pdblData);
+HDF5_SCILAB_IMPEXP int readPolyComplexMatrix(int _iDatasetId, char* _pstVarname, int _iDims, int* _piDims, int* _piNbCoef, double **_pdblReal, double **_pdblImg);
 
-HDF5_SCILAB_IMPEXP int readInteger8Matrix(int _iDatasetId, int _iRows, int _iCols, char* _pcData);
-HDF5_SCILAB_IMPEXP int readInteger16Matrix(int _iDatasetId, int _iRows, int _iCols, short* _psData);
-HDF5_SCILAB_IMPEXP int readInteger32Matrix(int _iDatasetId, int _iRows, int _iCols, int* _piData);
-HDF5_SCILAB_IMPEXP int readInteger64Matrix(int _iDatasetId, int _iRows, int _iCols, long long* _pllData);
+HDF5_SCILAB_IMPEXP int readInteger8Matrix(int _iDatasetId, char* _pcData);
+HDF5_SCILAB_IMPEXP int readInteger16Matrix(int _iDatasetId, short* _psData);
+HDF5_SCILAB_IMPEXP int readInteger32Matrix(int _iDatasetId, int* _piData);
+HDF5_SCILAB_IMPEXP int readInteger64Matrix(int _iDatasetId, long long* _pllData);
 
-HDF5_SCILAB_IMPEXP int readUnsignedInteger8Matrix(int _iDatasetId, int _iRows, int _iCols, unsigned char* _pucData);
-HDF5_SCILAB_IMPEXP int readUnsignedInteger16Matrix(int _iDatasetId, int _iRows, int _iCols, unsigned short* _pusData);
-HDF5_SCILAB_IMPEXP int readUnsignedInteger32Matrix(int _iDatasetId, int _iRows, int _iCols, unsigned int* _puiData);
-HDF5_SCILAB_IMPEXP int readUnsignedInteger64Matrix(int _iDatasetId, int _iRows, int _iCols, unsigned long long* _pullData);
+HDF5_SCILAB_IMPEXP int readUnsignedInteger8Matrix(int _iDatasetId, unsigned char* _pucData);
+HDF5_SCILAB_IMPEXP int readUnsignedInteger16Matrix(int _iDatasetId, unsigned short* _pusData);
+HDF5_SCILAB_IMPEXP int readUnsignedInteger32Matrix(int _iDatasetId, unsigned int* _puiData);
+HDF5_SCILAB_IMPEXP int readUnsignedInteger64Matrix(int _iDatasetId, unsigned long long* _pullData);
 
 HDF5_SCILAB_IMPEXP int readSparseComplexMatrix(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int* _piNbItemRow,       int* _piColPos, double *_pdblReal, double *_pdblImg);
 HDF5_SCILAB_IMPEXP int readSparseMatrix(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int* _piNbItemRow,      int* _piColPos, double *_pdblReal);
diff --git a/scilab/modules/hdf5/includes/h5_readDataFromFile_v1.h b/scilab/modules/hdf5/includes/h5_readDataFromFile_v1.h
new file mode 100644 (file)
index 0000000..02b88b6
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ *  Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
+ *
+ *  This file must be used under the terms of the CeCILL.
+ *  This source file is licensed as described in the file COPYING, which
+ *  you should have received as part of this distribution.  The terms
+ *  are also available at
+ *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#ifndef __H5_READDATATOFILE_V1_H__
+#define __H5_READDATATOFILE_V1_H__
+
+#include <hdf5.h>
+#include "dynlib_hdf5_scilab.h"
+
+
+#define unknow_type     -2
+#define sci_undefined   -1
+#define sci_void        0
+
+HDF5_SCILAB_IMPEXP int isComplexData_v1(int _iDatasetId);
+
+HDF5_SCILAB_IMPEXP int getVariableNames_v1(int _iFile, char **pstNameList);
+
+HDF5_SCILAB_IMPEXP int getDataSetId_v1(int  _iFile);
+
+HDF5_SCILAB_IMPEXP int getDataSetIdFromName_v1(int _iFile, char *_pstName);
+
+HDF5_SCILAB_IMPEXP int getDatasetDims_v1(int _iDatasetId, int *_piRows, int *_piCols);
+HDF5_SCILAB_IMPEXP int getListDims_v1(int _iDatasetId, int *_piItem);
+
+HDF5_SCILAB_IMPEXP int getScilabTypeFromDataSet_v1(int _iDatasetId);
+
+HDF5_SCILAB_IMPEXP int getDatasetPrecision_v1(int _iDatasetId, int* _piPrec);
+
+HDF5_SCILAB_IMPEXP int getSparseDimension_v1(int _iDatasetId, int* _piRows, int * _piCols, int* _piNbItem);
+
+HDF5_SCILAB_IMPEXP int readEmptyMatrix_v1(int _iDatasetId);
+
+HDF5_SCILAB_IMPEXP int readDoubleMatrix_v1(int _iDatasetId, int _iRows, int _iCols, double *_pdblData);
+HDF5_SCILAB_IMPEXP int readDoubleComplexMatrix_v1(int _iDatasetId, int _iRows, int _iCols, double *_pdblReal, double *_pdblImg);
+
+HDF5_SCILAB_IMPEXP int readStringMatrix_v1(int _iDatasetId, int _iRows, int _iCols, char **_pstData);
+
+HDF5_SCILAB_IMPEXP int readBooleanMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int* _piData);
+
+HDF5_SCILAB_IMPEXP int readPolyMatrix_v1(int _iDatasetId, char* _pstVarname, int _iRows, int _iCols, int* _piNbCoef, double **_pdblData);
+HDF5_SCILAB_IMPEXP int readPolyComplexMatrix_v1(int _iDatasetId, char* _pstVarname, int _iRows, int _iCols, int* _piNbCoef, double **_pdblReal, double **_pdblImg);
+
+HDF5_SCILAB_IMPEXP int readInteger8Matrix_v1(int _iDatasetId, int _iRows, int _iCols, char* _pcData);
+HDF5_SCILAB_IMPEXP int readInteger16Matrix_v1(int _iDatasetId, int _iRows, int _iCols, short* _psData);
+HDF5_SCILAB_IMPEXP int readInteger32Matrix_v1(int _iDatasetId, int _iRows, int _iCols, int* _piData);
+HDF5_SCILAB_IMPEXP int readInteger64Matrix_v1(int _iDatasetId, int _iRows, int _iCols, long long* _pllData);
+
+HDF5_SCILAB_IMPEXP int readUnsignedInteger8Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned char* _pucData);
+HDF5_SCILAB_IMPEXP int readUnsignedInteger16Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned short* _pusData);
+HDF5_SCILAB_IMPEXP int readUnsignedInteger32Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned int* _puiData);
+HDF5_SCILAB_IMPEXP int readUnsignedInteger64Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned long long* _pullData);
+
+HDF5_SCILAB_IMPEXP int readSparseComplexMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int* _piNbItemRow,    int* _piColPos, double *_pdblReal, double *_pdblImg);
+HDF5_SCILAB_IMPEXP int readSparseMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int* _piNbItemRow,   int* _piColPos, double *_pdblReal);
+
+HDF5_SCILAB_IMPEXP int readBooleanSparseMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int* _piNbItemRow,    int* _piColPos);
+
+HDF5_SCILAB_IMPEXP int getListItemReferences_v1(int _iDatasetId, hobj_ref_t** _piItemRef);
+
+HDF5_SCILAB_IMPEXP int getListItemDataset_v1(int _iDatasetId, void* _piItemRef, int _iItemPos, int* _piItemDataset);
+
+HDF5_SCILAB_IMPEXP int deleteListItemReferences_v1(int _iDatasetId, void* _piItemRef);
+
+HDF5_SCILAB_IMPEXP  void reset_item_count();
+
+#endif /* !__H5_READDATATOFILE_V1_H__ */
index 1034178..c72fce1 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2009-2009 - DIGITEO - Bruno JOFRET
+ *  Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
  *
  *  This file must be used under the terms of the CeCILL.
  *  This source file is licensed as described in the file COPYING, which
@@ -22,25 +22,25 @@ HDF5_SCILAB_IMPEXP char* createGroupName(char* _pstGroupName);
 HDF5_SCILAB_IMPEXP char* createPathName(char* _pstGroupName, int _iIndex);
 
 
-HDF5_SCILAB_IMPEXP int writeDoubleMatrix(int _iFile, char* _pstDatasetName, int _iRows, int _iCols, double *_pdblData);
-HDF5_SCILAB_IMPEXP int writeDoubleComplexMatrix(int _iFile, char* _pstDatasetName, int _iRows, int _iCols, double *_pdblReal, double *_pdblImg);
+HDF5_SCILAB_IMPEXP int writeDoubleMatrix(int _iFile, char* _pstDatasetName, int _iDims, int* _piDims, double *_pdblData);
+HDF5_SCILAB_IMPEXP int writeDoubleComplexMatrix(int _iFile, char* _pstDatasetName, int _iDims, int* _piDims, double *_pdblReal, double *_pdblImg);
 
-HDF5_SCILAB_IMPEXP int writeStringMatrix(int _iFile, char* _pstDatasetName, int _iRows, int _iCols, char **_pstData);
+HDF5_SCILAB_IMPEXP int writeStringMatrix(int _iFile, char* _pstDatasetName, int _iDims, int* _piDims, char **_pstData);
 
-HDF5_SCILAB_IMPEXP int writeBooleanMatrix(int _iFile, char* _pstDatasetName, int _iRows, int _iCols, int *_piData);
+HDF5_SCILAB_IMPEXP int writeBooleanMatrix(int _iFile, char* _pstDatasetName, int _iDims, int* _piDims, int *_piData);
 
-HDF5_SCILAB_IMPEXP int writePolyMatrix(int _iFile, char* _pstDatasetName, char* _pstVarName, int _iRows, int _iCols, int* _piNbCoef, double** _pdblData);
-HDF5_SCILAB_IMPEXP int writePolyComplexMatrix(int _iFile, char* _pstDatasetName, char* _pstVarName, int _iRows, int _iCols, int* _piNbCoef, double** _pdblReal, double** _pdblImg);
+HDF5_SCILAB_IMPEXP int writePolyMatrix(int _iFile, char* _pstDatasetName, char* _pstVarName, int _iDims, int* _piDims, int* _piNbCoef, double** _pdblData);
+HDF5_SCILAB_IMPEXP int writePolyComplexMatrix(int _iFile, char* _pstDatasetName, char* _pstVarName, int _iDims, int* _piDims, int* _piNbCoef, double** _pdblReal, double** _pdblImg);
 
-HDF5_SCILAB_IMPEXP int writeInteger8Matrix(int _iFile, char* _pstDatasetName, int _iRows, int _iCols, char* _piData8);
-HDF5_SCILAB_IMPEXP int writeInteger16Matrix(int _iFile, char* _pstDatasetName, int _iRows, int _iCols, short* _piData16);
-HDF5_SCILAB_IMPEXP int writeInteger32Matrix(int _iFile, char* _pstDatasetName, int _iRows, int _iCols, int* _piData32);
-HDF5_SCILAB_IMPEXP int writeInteger64Matrix(int _iFile, char* _pstDatasetName, int _iRows, int _iCols, long long* _piData64);
+HDF5_SCILAB_IMPEXP int writeInteger8Matrix(int _iFile, char* _pstDatasetName, int _iDims, int* _piDims, char* _piData8);
+HDF5_SCILAB_IMPEXP int writeInteger16Matrix(int _iFile, char* _pstDatasetName, int _iDims, int* _piDims, short* _piData16);
+HDF5_SCILAB_IMPEXP int writeInteger32Matrix(int _iFile, char* _pstDatasetName, int _iDims, int* _piDims, int* _piData32);
+HDF5_SCILAB_IMPEXP int writeInteger64Matrix(int _iFile, char* _pstDatasetName, int _iDims, int* _piDims, long long* _piData64);
 
-HDF5_SCILAB_IMPEXP int writeUnsignedInteger8Matrix(int _iFile, char* _pstDatasetName, int _iRows, int _iCols, unsigned char* _piData8);
-HDF5_SCILAB_IMPEXP int writeUnsignedInteger16Matrix(int _iFile, char* _pstDatasetName, int _iRows, int _iCols, unsigned short* _piData16);
-HDF5_SCILAB_IMPEXP int writeUnsignedInteger32Matrix(int _iFile, char* _pstDatasetName, int _iRows, int _iCols, unsigned int* _piData32);
-HDF5_SCILAB_IMPEXP int writeUnsignedInteger64Matrix(int _iFile, char* _pstDatasetName, int _iRows, int _iCols, unsigned long long* _piData64);
+HDF5_SCILAB_IMPEXP int writeUnsignedInteger8Matrix(int _iFile, char* _pstDatasetName, int _iDims, int* _piDims, unsigned char* _piData8);
+HDF5_SCILAB_IMPEXP int writeUnsignedInteger16Matrix(int _iFile, char* _pstDatasetName, int _iDims, int* _piDims, unsigned short* _piData16);
+HDF5_SCILAB_IMPEXP int writeUnsignedInteger32Matrix(int _iFile, char* _pstDatasetName, int _iDims, int* _piDims, unsigned int* _piData32);
+HDF5_SCILAB_IMPEXP int writeUnsignedInteger64Matrix(int _iFile, char* _pstDatasetName, int _iDims, int* _piDims, unsigned long long* _piData64);
 
 HDF5_SCILAB_IMPEXP int writeSparseMatrix(int _iFile, char* _pstDatasetName, int _iRows, int _iCols, int _iNbItem, int* _piNbItemRow, int* _piColPos, double* _pdblReal);
 HDF5_SCILAB_IMPEXP int writeSparseComplexMatrix(int _iFile, char* _pstDatasetName, int _iRows, int _iCols, int _iNbItem, int* _piNbItemRow, int* _piColPos, double* _pdblReal, double* _pdblImg);
diff --git a/scilab/modules/hdf5/includes/import_from_hdf5_v1.hxx b/scilab/modules/hdf5/includes/import_from_hdf5_v1.hxx
new file mode 100644 (file)
index 0000000..112c599
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+*  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+*  Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
+*
+*  This file must be used under the terms of the CeCILL.
+*  This source file is licensed as described in the file COPYING, which
+*  you should have received as part of this distribution.  The terms
+*  are also available at
+*  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*
+*/
+
+int sci_import_from_hdf5_v1(char *fname, unsigned long fname_len);
diff --git a/scilab/modules/hdf5/includes/listvar_in_hdf5_v1.hxx b/scilab/modules/hdf5/includes/listvar_in_hdf5_v1.hxx
new file mode 100644 (file)
index 0000000..0349ad3
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+*  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+*  Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
+*
+*  This file must be used under the terms of the CeCILL.
+*  This source file is licensed as described in the file COPYING, which
+*  you should have received as part of this distribution.  The terms
+*  are also available at
+*  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*
+*/
+
+int sci_listvar_in_hdf5_v1(char *fname, unsigned long fname_len);
index 6ade5aa..76449c3 100644 (file)
@@ -82,29 +82,6 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
         return 1;
     }
 
-    //if(Rhs == 1)
-    //{
-    //    pstFileName = expandPathVariable(pstNameList[0]);
-    //    int iH5File = createHDF5File(pstFileName);
-
-    //    if (iH5File < 0)
-    //    {
-    //        FREE(pstFileName);
-    //        if (iH5File == -2)
-    //        {
-    //            Scierror(999, _("%s: Wrong value for input argument #%d: \"%s\" is a directory"), fname, 1, pstNameList[0]);
-    //        }
-    //        else
-    //        {
-    //            Scierror(999, _("%s: Cannot open file %s.\n"), fname, pstNameList[0]);
-    //        }
-
-    //        return 1;
-    //    }
-
-    //}
-
-
     piAddrList = (int**)MALLOC(sizeof(int*) * (iNbVar));
     for (int i = 1 ; i < Rhs ; i++)
     {
@@ -287,88 +264,88 @@ static bool export_data(int _iH5File, int* _piVar, char* _pstName)
     switch (iType)
     {
         case sci_matrix :
-        {
-            bReturn = export_double(_iH5File, _piVar, _pstName);
-            break;
-        }
+            {
+                bReturn = export_double(_iH5File, _piVar, _pstName);
+                break;
+            }
         case sci_poly :
-        {
-            bReturn = export_poly(_iH5File, _piVar, _pstName);
-            break;
-        }
+            {
+                bReturn = export_poly(_iH5File, _piVar, _pstName);
+                break;
+            }
         case sci_boolean :
-        {
-            bReturn = export_boolean(_iH5File, _piVar, _pstName);
-            break;
-        }
+            {
+                bReturn = export_boolean(_iH5File, _piVar, _pstName);
+                break;
+            }
         case sci_sparse :
-        {
-            bReturn = export_sparse(_iH5File, _piVar, _pstName);
-            break;
-        }
+            {
+                bReturn = export_sparse(_iH5File, _piVar, _pstName);
+                break;
+            }
         case sci_boolean_sparse :
-        {
-            bReturn = export_boolean_sparse(_iH5File, _piVar, _pstName);
-            break;
-        }
+            {
+                bReturn = export_boolean_sparse(_iH5File, _piVar, _pstName);
+                break;
+            }
         case sci_matlab_sparse :
-        {
-            bReturn = export_matlab_sparse(_piVar, _pstName);
-            break;
-        }
+            {
+                bReturn = export_matlab_sparse(_piVar, _pstName);
+                break;
+            }
         case sci_ints :
-        {
-            bReturn = export_ints(_iH5File, _piVar, _pstName);
-            break;
-        }
+            {
+                bReturn = export_ints(_iH5File, _piVar, _pstName);
+                break;
+            }
         case sci_handles :
-        {
-            bReturn = export_handles(_piVar, _pstName);
-            break;
-        }
+            {
+                bReturn = export_handles(_piVar, _pstName);
+                break;
+            }
         case sci_strings :
-        {
-            bReturn = export_strings(_iH5File, _piVar, _pstName);
-            break;
-        }
+            {
+                bReturn = export_strings(_iH5File, _piVar, _pstName);
+                break;
+            }
         case sci_u_function :
-        {
-            bReturn = export_u_function(_piVar, _pstName);
-            break;
-        }
+            {
+                bReturn = export_u_function(_piVar, _pstName);
+                break;
+            }
         case sci_c_function :
-        {
-            bReturn = export_c_function(_piVar, _pstName);
-            break;
-        }
+            {
+                bReturn = export_c_function(_piVar, _pstName);
+                break;
+            }
         case sci_lib :
-        {
-            bReturn = export_lib(_piVar, _pstName);
-            break;
-        }
+            {
+                bReturn = export_lib(_piVar, _pstName);
+                break;
+            }
         case sci_list :
         case sci_tlist :
         case sci_mlist :
-        {
-            bReturn = export_list(_iH5File, _piVar, _pstName, iType);
-            break;
-        }
+            {
+                bReturn = export_list(_iH5File, _piVar, _pstName, iType);
+                break;
+            }
         case sci_lufact_pointer :
-        {
-            bReturn = export_lufact_pointer(_piVar, _pstName);
-            break;
-        }
+            {
+                bReturn = export_lufact_pointer(_piVar, _pstName);
+                break;
+            }
         case 0 : //void case to "null" items in list
-        {
-            bReturn = export_void(_iH5File, _piVar, _pstName);
-            break;
-        }
+            {
+                bReturn = export_void(_iH5File, _piVar, _pstName);
+                break;
+            }
 
         default :
-        {
-            bReturn = false;
-            break;
-        }
+            {
+                bReturn = false;
+                break;
+            }
     }
     return bReturn;
 }
@@ -452,10 +429,9 @@ static bool export_list(int _iH5File, int *_piVar, char* _pstName, int _iVarType
 
 static bool export_double(int _iH5File, int *_piVar, char* _pstName)
 {
-    int iRet                                   = 0;
-    int iComplex                       = isVarComplex(pvApiCtx, _piVar);
-    int iRows                                  = 0;
-    int iCols                                  = 0;
+    int iRet            = 0;
+    int iComplex        = isVarComplex(pvApiCtx, _piVar);
+    int piDims[2];
     int iType = 0;
     double *pdblReal   = NULL;
     double *pdblImg            = NULL;
@@ -474,25 +450,25 @@ static bool export_double(int _iH5File, int *_piVar, char* _pstName)
 
     if (iComplex)
     {
-        sciErr = getComplexMatrixOfDouble(pvApiCtx, _piVar, &iRows, &iCols, &pdblReal, &pdblImg);
+        sciErr = getComplexMatrixOfDouble(pvApiCtx, _piVar, &piDims[0], &piDims[1], &pdblReal, &pdblImg);
         if (sciErr.iErr)
         {
             printError(&sciErr, 0);
             return false;
         }
 
-        iRet = writeDoubleComplexMatrix(_iH5File, _pstName, iRows, iCols, pdblReal, pdblImg);
+        iRet = writeDoubleComplexMatrix(_iH5File, _pstName, 2, piDims, pdblReal, pdblImg);
     }
     else
     {
-        sciErr = getMatrixOfDouble(pvApiCtx, _piVar, &iRows, &iCols, &pdblReal);
+        sciErr = getMatrixOfDouble(pvApiCtx, _piVar, &piDims[0], &piDims[1], &pdblReal);
         if (sciErr.iErr)
         {
             printError(&sciErr, 0);
             return false;
         }
 
-        iRet = writeDoubleMatrix(_iH5File, _pstName, iRows, iCols, pdblReal);
+        iRet = writeDoubleMatrix(_iH5File, _pstName, 2, piDims, pdblReal);
     }
 
     if (iRet)
@@ -501,21 +477,22 @@ static bool export_double(int _iH5File, int *_piVar, char* _pstName)
     }
 
     char pstMsg[512];
-    sprintf(pstMsg, "double (%d x %d)", iRows, iCols);
+    sprintf(pstMsg, "double (%d x %d)", piDims[0], piDims[1]);
     print_type(pstMsg);
     return true;
 }
 
 static bool export_poly(int _iH5File, int *_piVar, char* _pstName)
 {
-    int iRet                                           = 0;
-    int iRows                                          = 0;
-    int iCols                                          = 0;
-    int* piNbCoef                              = NULL;
-    double** pdblReal          = NULL;
-    double** pdblImg           = NULL;
+    int iRet = 0;
+    int* piNbCoef = NULL;
+    double** pdblReal = NULL;
+    double** pdblImg = NULL;
     char pstVarName[64]        = {0};
-    int iVarNameLen                    = 0;
+    int iVarNameLen = 0;
+    int piDims[2];
+
+
 
     SciErr sciErr = getPolyVariableName(pvApiCtx, _piVar, pstVarName, &iVarNameLen);
     if (sciErr.iErr)
@@ -526,67 +503,67 @@ static bool export_poly(int _iH5File, int *_piVar, char* _pstName)
 
     if (isVarComplex(pvApiCtx, _piVar))
     {
-        sciErr = getComplexMatrixOfPoly(pvApiCtx, _piVar, &iRows, &iCols, NULL, NULL, NULL);
+        sciErr = getComplexMatrixOfPoly(pvApiCtx, _piVar, &piDims[0], &piDims[1], NULL, NULL, NULL);
         if (sciErr.iErr)
         {
             printError(&sciErr, 0);
             return false;
         }
 
-        piNbCoef = (int*)MALLOC(iRows * iCols * sizeof(int));
-        sciErr = getComplexMatrixOfPoly(pvApiCtx, _piVar, &iRows, &iCols, piNbCoef, NULL, NULL);
+        piNbCoef = (int*)MALLOC(piDims[0] * piDims[1] * sizeof(int));
+        sciErr = getComplexMatrixOfPoly(pvApiCtx, _piVar, &piDims[0], &piDims[1], piNbCoef, NULL, NULL);
         if (sciErr.iErr)
         {
             printError(&sciErr, 0);
             return false;
         }
 
-        pdblReal = (double**)MALLOC(sizeof(double*) * iRows * iCols);
-        pdblImg = (double**)MALLOC(sizeof(double*) * iRows * iCols);
-        for (int i = 0 ; i < iRows * iCols ; i++)
+        pdblReal = (double**)MALLOC(sizeof(double*) * piDims[0] * piDims[1]);
+        pdblImg = (double**)MALLOC(sizeof(double*) * piDims[0] * piDims[1]);
+        for (int i = 0 ; i < piDims[0] * piDims[1] ; i++)
         {
             pdblReal[i] = (double*)MALLOC(sizeof(double) * piNbCoef[i]);// for null termination
             pdblImg[i] = (double*)MALLOC(sizeof(double) * piNbCoef[i]);// for null termination
         }
-        sciErr = getComplexMatrixOfPoly(pvApiCtx, _piVar, &iRows, &iCols, piNbCoef, pdblReal, pdblImg);
+        sciErr = getComplexMatrixOfPoly(pvApiCtx, _piVar, &piDims[0], &piDims[1], piNbCoef, pdblReal, pdblImg);
         if (sciErr.iErr)
         {
             printError(&sciErr, 0);
             return false;
         }
 
-        iRet = writePolyComplexMatrix(_iH5File, _pstName, pstVarName, iRows, iCols, piNbCoef, pdblReal, pdblImg);
+        iRet = writePolyComplexMatrix(_iH5File, _pstName, pstVarName, 2, piDims, piNbCoef, pdblReal, pdblImg);
     }
     else
     {
-        sciErr = getMatrixOfPoly(pvApiCtx, _piVar, &iRows, &iCols, NULL, NULL);
+        sciErr = getMatrixOfPoly(pvApiCtx, _piVar, &piDims[0], &piDims[1], NULL, NULL);
         if (sciErr.iErr)
         {
             printError(&sciErr, 0);
             return false;
         }
 
-        piNbCoef = (int*)MALLOC(iRows * iCols * sizeof(int));
-        sciErr = getMatrixOfPoly(pvApiCtx, _piVar, &iRows, &iCols, piNbCoef, NULL);
+        piNbCoef = (int*)MALLOC(piDims[0] * piDims[1] * sizeof(int));
+        sciErr = getMatrixOfPoly(pvApiCtx, _piVar, &piDims[0], &piDims[1], piNbCoef, NULL);
         if (sciErr.iErr)
         {
             printError(&sciErr, 0);
             return false;
         }
 
-        pdblReal = (double**)MALLOC(sizeof(double*) * iRows * iCols);
-        for (int i = 0 ; i < iRows * iCols ; i++)
+        pdblReal = (double**)MALLOC(sizeof(double*) * piDims[0] * piDims[1]);
+        for (int i = 0 ; i < piDims[0] * piDims[1] ; i++)
         {
             pdblReal[i] = (double*)MALLOC(sizeof(double) * piNbCoef[i]);// for null termination
         }
-        sciErr = getMatrixOfPoly(pvApiCtx, _piVar, &iRows, &iCols, piNbCoef, pdblReal);
+        sciErr = getMatrixOfPoly(pvApiCtx, _piVar, &piDims[0], &piDims[1], piNbCoef, pdblReal);
         if (sciErr.iErr)
         {
             printError(&sciErr, 0);
             return false;
         }
 
-        iRet = writePolyMatrix(_iH5File, _pstName, pstVarName, iRows, iCols, piNbCoef, pdblReal);
+        iRet = writePolyMatrix(_iH5File, _pstName, pstVarName, 2, piDims, piNbCoef, pdblReal);
     }
 
     if (iRet)
@@ -595,12 +572,12 @@ static bool export_poly(int _iH5File, int *_piVar, char* _pstName)
     }
 
     char pstMsg[512];
-    sprintf(pstMsg, "poly (%d x %d)", iRows, iCols);
+    sprintf(pstMsg, "poly (%d x %d)", piDims[0], piDims[1]);
     print_type(pstMsg);
 
     if (pdblReal)
     {
-        for (int i = 0 ; i < iRows * iCols ; i++)
+        for (int i = 0 ; i < piDims[0] * piDims[1] ; i++)
         {
             FREE(pdblReal[i]);
         }
@@ -609,7 +586,7 @@ static bool export_poly(int _iH5File, int *_piVar, char* _pstName)
 
     if (pdblImg)
     {
-        for (int i = 0 ; i < iRows * iCols ; i++)
+        for (int i = 0 ; i < piDims[0] * piDims[1] ; i++)
         {
             FREE(pdblImg[i]);
         }
@@ -622,19 +599,18 @@ static bool export_poly(int _iH5File, int *_piVar, char* _pstName)
 
 static bool export_boolean(int _iH5File, int *_piVar, char* _pstName)
 {
-    int iRows                                  = 0;
-    int iCols                                  = 0;
-    int *piData                                = NULL;
+    int *piData = NULL;
+    int piDims[2];
 
     //for error management
-    SciErr sciErr = getMatrixOfBoolean(pvApiCtx, _piVar, &iRows, &iCols, &piData);
+    SciErr sciErr = getMatrixOfBoolean(pvApiCtx, _piVar, &piDims[0], &piDims[1], &piData);
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
         return 0;
     }
 
-    int iRet = writeBooleanMatrix(_iH5File, _pstName, iRows, iCols, piData);
+    int iRet = writeBooleanMatrix(_iH5File, _pstName, 2, piDims, piData);
     if (iRet)
     {
         //Msg ??
@@ -642,28 +618,27 @@ static bool export_boolean(int _iH5File, int *_piVar, char* _pstName)
     }
 
     char pstMsg[512];
-    sprintf(pstMsg, "bool (%d x %d)", iRows, iCols);
+    sprintf(pstMsg, "bool (%d x %d)", piDims[0], piDims[1]);
     print_type(pstMsg);
     return true;
 }
 
 static bool export_boolean_sparse(int _iH5File, int *_piVar, char* _pstName)
 {
-    int iRet                                           = 0;
-    int iRows                                          = 0;
-    int iCols                                          = 0;
-    int iNbItem                                        = 0;
-    int* piNbItemRow           = NULL;
-    int* piColPos                              = NULL;
-
-    SciErr sciErr = getBooleanSparseMatrix(pvApiCtx, _piVar, &iRows, &iCols, &iNbItem, &piNbItemRow, &piColPos);
+    int iRet = 0;
+    int iNbItem = 0;
+    int* piNbItemRow = NULL;
+    int* piColPos = NULL;
+    int piDims[2];
+
+    SciErr sciErr = getBooleanSparseMatrix(pvApiCtx, _piVar, &piDims[0], &piDims[1], &iNbItem, &piNbItemRow, &piColPos);
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
         return false;
     }
 
-    iRet = writeBooleanSparseMatrix(_iH5File, _pstName, iRows, iCols, iNbItem, piNbItemRow, piColPos);
+    iRet = writeBooleanSparseMatrix(_iH5File, _pstName, piDims[0], piDims[1], iNbItem, piNbItemRow, piColPos);
     if (iRet)
     {
         //Msg ??
@@ -671,44 +646,43 @@ static bool export_boolean_sparse(int _iH5File, int *_piVar, char* _pstName)
     }
 
     char pstMsg[512];
-    sprintf(pstMsg, "boolean sparse (%d x %d)", iRows, iCols);
+    sprintf(pstMsg, "boolean sparse (%d x %d)", piDims[0], piDims[1]);
     print_type(pstMsg);
     return true;
 }
 
 static bool export_sparse(int _iH5File, int *_piVar, char* _pstName)
 {
-    int iRet                                           = 0;
-    int iRows                                          = 0;
-    int iCols                                          = 0;
-    int iNbItem                                        = 0;
-    int* piNbItemRow           = NULL;
-    int* piColPos                              = NULL;
-    double* pdblReal           = NULL;
-    double* pdblImg            = NULL;
+    int iRet = 0;
+    int iNbItem = 0;
+    int* piNbItemRow = NULL;
+    int* piColPos = NULL;
+    double* pdblReal = NULL;
+    double* pdblImg = NULL;
+    int piDims[2];
     SciErr sciErr;
 
     if (isVarComplex(pvApiCtx, _piVar))
     {
-        sciErr = getComplexSparseMatrix(pvApiCtx, _piVar, &iRows, &iCols, &iNbItem, &piNbItemRow, &piColPos, &pdblReal, &pdblImg);
+        sciErr = getComplexSparseMatrix(pvApiCtx, _piVar, &piDims[0], &piDims[1], &iNbItem, &piNbItemRow, &piColPos, &pdblReal, &pdblImg);
         if (sciErr.iErr)
         {
             printError(&sciErr, 0);
             return false;
         }
 
-        iRet = writeSparseComplexMatrix(_iH5File, _pstName, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg);
+        iRet = writeSparseComplexMatrix(_iH5File, _pstName, piDims[0], piDims[1], iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg);
     }
     else
     {
-        sciErr = getSparseMatrix(pvApiCtx, _piVar, &iRows, &iCols, &iNbItem, &piNbItemRow, &piColPos, &pdblReal);
+        sciErr = getSparseMatrix(pvApiCtx, _piVar, &piDims[0], &piDims[1], &iNbItem, &piNbItemRow, &piColPos, &pdblReal);
         if (sciErr.iErr)
         {
             printError(&sciErr, 0);
             return false;
         }
 
-        iRet = writeSparseMatrix(_iH5File, _pstName, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
+        iRet = writeSparseMatrix(_iH5File, _pstName, piDims[0], piDims[1], iNbItem, piNbItemRow, piColPos, pdblReal);
     }
 
     if (iRet)
@@ -717,7 +691,7 @@ static bool export_sparse(int _iH5File, int *_piVar, char* _pstName)
     }
 
     char pstMsg[512];
-    sprintf(pstMsg, "sparse (%d x %d)", iRows, iCols);
+    sprintf(pstMsg, "sparse (%d x %d)", piDims[0], piDims[1]);
     print_type(pstMsg);
     return true;
 }
@@ -730,11 +704,10 @@ static bool export_matlab_sparse(int *_piVar, char* _pstName)
 
 static bool export_ints(int _iH5File, int *_piVar, char* _pstName)
 {
-    int iRet                                   = 0;
-    int iRows                                  = 0;
-    int iCols                                  = 0;
-    void *piData                       = NULL;
-    int iPrec                                  = 0;
+    int iRet = 0;
+    void *piData = NULL;
+    int iPrec = 0;
+    int piDims[2];
 
     SciErr sciErr = getMatrixOfIntegerPrecision(pvApiCtx, _piVar, &iPrec);
     if (sciErr.iErr)
@@ -746,76 +719,76 @@ static bool export_ints(int _iH5File, int *_piVar, char* _pstName)
     switch (iPrec)
     {
         case SCI_INT8 :
-            sciErr = getMatrixOfInteger8(pvApiCtx, _piVar, &iRows, &iCols, (char**)&piData);
+            sciErr = getMatrixOfInteger8(pvApiCtx, _piVar, &piDims[0], &piDims[1], (char**)&piData);
             if (sciErr.iErr)
             {
                 printError(&sciErr, 0);
                 return false;
             }
-            iRet = writeInteger8Matrix(_iH5File, _pstName, iRows, iCols, (char*)piData);
+            iRet = writeInteger8Matrix(_iH5File, _pstName, 2, piDims, (char*)piData);
             break;
         case SCI_UINT8 :
-            sciErr = getMatrixOfUnsignedInteger8(pvApiCtx, _piVar, &iRows, &iCols, (unsigned char**)&piData);
+            sciErr = getMatrixOfUnsignedInteger8(pvApiCtx, _piVar, &piDims[0], &piDims[1], (unsigned char**)&piData);
             if (sciErr.iErr)
             {
                 printError(&sciErr, 0);
                 return false;
             }
-            iRet = writeUnsignedInteger8Matrix(_iH5File, _pstName, iRows, iCols, (unsigned char*)piData);
+            iRet = writeUnsignedInteger8Matrix(_iH5File, _pstName, 2, piDims, (unsigned char*)piData);
             break;
         case SCI_INT16 :
-            sciErr = getMatrixOfInteger16(pvApiCtx, _piVar, &iRows, &iCols, (short**)&piData);
+            sciErr = getMatrixOfInteger16(pvApiCtx, _piVar, &piDims[0], &piDims[1], (short**)&piData);
             if (sciErr.iErr)
             {
                 printError(&sciErr, 0);
                 return false;
             }
-            iRet = writeInteger16Matrix(_iH5File, _pstName, iRows, iCols, (short*)piData);
+            iRet = writeInteger16Matrix(_iH5File, _pstName, 2, piDims, (short*)piData);
             break;
         case SCI_UINT16 :
-            sciErr = getMatrixOfUnsignedInteger16(pvApiCtx, _piVar, &iRows, &iCols, (unsigned short**)&piData);
+            sciErr = getMatrixOfUnsignedInteger16(pvApiCtx, _piVar, &piDims[0], &piDims[1], (unsigned short**)&piData);
             if (sciErr.iErr)
             {
                 printError(&sciErr, 0);
                 return false;
             }
-            iRet = writeUnsignedInteger16Matrix(_iH5File, _pstName, iRows, iCols, (unsigned short*)piData);
+            iRet = writeUnsignedInteger16Matrix(_iH5File, _pstName, 2, piDims, (unsigned short*)piData);
             break;
         case SCI_INT32 :
-            sciErr = getMatrixOfInteger32(pvApiCtx, _piVar, &iRows, &iCols, (int**)&piData);
+            sciErr = getMatrixOfInteger32(pvApiCtx, _piVar, &piDims[0], &piDims[1], (int**)&piData);
             if (sciErr.iErr)
             {
                 printError(&sciErr, 0);
                 return false;
             }
-            iRet = writeInteger32Matrix(_iH5File, _pstName, iRows, iCols, (int*)piData);
+            iRet = writeInteger32Matrix(_iH5File, _pstName, 2, piDims, (int*)piData);
             break;
         case SCI_UINT32 :
-            sciErr = getMatrixOfUnsignedInteger32(pvApiCtx, _piVar, &iRows, &iCols, (unsigned int**)&piData);
+            sciErr = getMatrixOfUnsignedInteger32(pvApiCtx, _piVar, &piDims[0], &piDims[1], (unsigned int**)&piData);
             if (sciErr.iErr)
             {
                 printError(&sciErr, 0);
                 return false;
             }
-            iRet = writeUnsignedInteger32Matrix(_iH5File, _pstName, iRows, iCols, (unsigned int*)piData);
+            iRet = writeUnsignedInteger32Matrix(_iH5File, _pstName, 2, piDims, (unsigned int*)piData);
             break;
         case SCI_INT64 :
-            //sciErr = getMatrixOfInteger64(_piVar, &iRows, &iCols, (long long**)&piData);
+            //sciErr = getMatrixOfInteger64(_piVar, &piDims[0], &piDims[1], (long long**)&piData);
             //if(sciErr.iErr)
             //{
             // printError(&sciErr, 0);
             // return false;
             //}
-            //iRet = writeInteger64Matrix(_iH5File, _pstName, iRows, iCols, (long long*)piData);
+            //iRet = writeInteger64Matrix(_iH5File, _pstName, 2, piDims, (long long*)piData);
             //break;
         case SCI_UINT64 :
-            //sciErr = getMatrixOfUnsignedInteger64(_piVar, &iRows, &iCols, (unsigned long long**)&piData);
+            //sciErr = getMatrixOfUnsignedInteger64(_piVar, &piDims[0], &piDims[1], (unsigned long long**)&piData);
             //if(sciErr.iErr)
             //{
             // printError(&sciErr, 0);
             // return false;
             //}
-            //iRet = writeUnsignedInteger64Matrix(_iH5File, _pstName, iRows, iCols, (unsigned long long*)piData);
+            //iRet = writeUnsignedInteger64Matrix(_iH5File, _pstName, 2, piDims, (unsigned long long*)piData);
             //break;
         default :
             return 1;
@@ -828,7 +801,7 @@ static bool export_ints(int _iH5File, int *_piVar, char* _pstName)
     }
 
     char pstMsg[512];
-    sprintf(pstMsg, "int%d (%d x %d)", 8 * iPrec, iRows, iCols);
+    sprintf(pstMsg, "int%d (%d x %d)", 8 * iPrec, piDims[0], piDims[1]);
     print_type(pstMsg);
     return true;
 }
@@ -841,41 +814,40 @@ static bool export_handles(int *_piVar, char* _pstName)
 
 static bool export_strings(int _iH5File, int *_piVar, char* _pstName)
 {
-    int iRet                           = 0;
-    int iRows                          = 0;
-    int iCols                          = 0;
-    int* piLen                 = NULL;
-    char** pstData     = NULL;
+    int iRet = 0;
+    int* piLen = NULL;
+    char** pstData = NULL;
+    int piDims[2];
 
-
-    SciErr sciErr = getMatrixOfString(pvApiCtx, _piVar, &iRows, &iCols, NULL, NULL);
+    SciErr sciErr = getMatrixOfString(pvApiCtx, _piVar, &piDims[0], &piDims[1], NULL, NULL);
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
         return false;
     }
 
-    piLen = (int*)MALLOC(iRows * iCols * sizeof(int));
-    sciErr = getMatrixOfString(pvApiCtx, _piVar, &iRows, &iCols, piLen, NULL);
+    piLen = (int*)MALLOC(piDims[0] * piDims[1] * sizeof(int));
+    sciErr = getMatrixOfString(pvApiCtx, _piVar, &piDims[0], &piDims[1], piLen, NULL);
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
         return false;
     }
 
-    pstData = (char**)MALLOC(sizeof(char*) * iRows * iCols);
-    for (int i = 0 ; i < iRows * iCols ; i++)
+    pstData = (char**)MALLOC(sizeof(char*) * piDims[0] * piDims[1]);
+    for (int i = 0 ; i < piDims[0] * piDims[1] ; i++)
     {
         pstData[i] = (char*)MALLOC(sizeof(char) * (piLen[i] + 1));// for null termination
     }
-    sciErr = getMatrixOfString(pvApiCtx, _piVar, &iRows, &iCols, piLen, pstData);
+
+    sciErr = getMatrixOfString(pvApiCtx, _piVar, &piDims[0], &piDims[1], piLen, pstData);
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
         return false;
     }
 
-    iRet = writeStringMatrix(_iH5File, _pstName, iRows, iCols, pstData);
+    iRet = writeStringMatrix(_iH5File, _pstName, 2, piDims, pstData);
 
     if (iRet)
     {
@@ -883,10 +855,10 @@ static bool export_strings(int _iH5File, int *_piVar, char* _pstName)
     }
 
     char pstMsg[512];
-    sprintf(pstMsg, "string (%d x %d)", iRows, iCols);
+    sprintf(pstMsg, "string (%d x %d)", piDims[0], piDims[1]);
     print_type(pstMsg);
 
-    freeArrayOfString(pstData, iRows * iCols);
+    freeArrayOfString(pstData, piDims[0] * piDims[1]);
     return true;
 }
 
index 5a2f912..58295eb 100644 (file)
@@ -28,13 +28,7 @@ extern "C"
 #include "expandPathVariable.h"
 }
 
-//#define PRINT_DEBUG
-//#define TIME_DEBUG
-
-static int iTab = 0;
-static int iCloseList = 0;
-
-void print_tree(char *_pstMsg);
+#include "import_from_hdf5_v1.hxx"
 
 static bool import_variable(int _iFile, char* _pstVarName);
 static bool import_data(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
@@ -60,10 +54,8 @@ int sci_import_from_hdf5(char *fname, unsigned long fname_len)
 
     int iSelectedVar = Rhs - 1;
 
-    checkInputArgumentAtLeast(pvApiCtx, 1);
-    CheckLhs(1, 1);
-
-    iCloseList = 0;
+    CheckInputArgumentAtLeast(pvApiCtx, 1);
+    CheckOutputArgument(pvApiCtx, 1, 1);
 
     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
     if (sciErr.iErr)
@@ -94,10 +86,21 @@ int sci_import_from_hdf5(char *fname, unsigned long fname_len)
 
     //manage version information
     int iVersion = getSODFormatAttribute(iFile);
-    if (iVersion > SOD_FILE_VERSION)
-    {//can't read file with version newer that me !
-        Scierror(999, _("%s: Wrong SOD file format version. Max Expected: %d Found: %d\n"), fname, SOD_FILE_VERSION, iVersion);
-        return 1;
+    if(iVersion != SOD_FILE_VERSION)
+    {
+        if (iVersion > SOD_FILE_VERSION)
+        {//can't read file with version newer that me !
+            Scierror(999, _("%s: Wrong SOD file format version. Max Expected: %d Found: %d\n"), fname, SOD_FILE_VERSION, iVersion);
+            return 1;
+        }
+        else
+        {//call older import functions and exit or ... EXIT !
+            if(iVersion == 1 || iVersion == -1)
+            {
+                //sciprint("old sci_import_from_hdf5_v1\n");
+                return sci_import_from_hdf5_v1(fname, fname_len);
+            }
+        }
     }
 
     if (iSelectedVar)
@@ -171,8 +174,8 @@ int sci_import_from_hdf5(char *fname, unsigned long fname_len)
         piReturn[0] = 0;
     }
 
-    LhsVar(1) = Rhs + 1;
-    PutLhsVar();
+    AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
+    ReturnArguments(pvApiCtx);
 
     //  printf("End gateway !!!\n");
     return 0;
@@ -253,17 +256,8 @@ static bool import_data(int _iDatasetId, int _iItemPos, int *_piAddress, char *_
         default:
         {
             Scierror(999, _("%s: Invalid HDF5 Scilab format.\n"), "import_from_hdf5");
-#ifdef PRINT_DEBUG
-            {
-                char pstMsg[512];
-
-                sprintf(pstMsg, "Unknown type : %d", iVarType);
-                print_tree(pstMsg);
-            }
-#endif
         }
     }
-
     return bRet;
 }
 
@@ -311,40 +305,36 @@ static bool import_undefined(int _iDatasetId, int _iItemPos, int *_piAddress, ch
 
 static bool import_double(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
 {
+    SciErr sciErr;
     int iRet = 0;
     double *pdblReal = NULL;
     double *pdblImg = NULL;
-    int iRows = 0;
-    int iCols = 0;
+    int iDims = 0;
+    int* piDims = NULL;
     int iComplex = 0;
-    SciErr sciErr;
-
-#ifdef TIME_DEBUG
-    LARGE_INTEGER iStart, iEnd, iFreq;
-
-    QueryPerformanceFrequency(&iFreq);
-    QueryPerformanceCounter(&iStart);
-#endif
+    int iSize = 0;
 
-    iRet = getDatasetDims(_iDatasetId, &iRows, &iCols);
-    iComplex = isComplexData(_iDatasetId);
-    if (iRet)
+    iRet = getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
+    if (iRet < 0)
     {
         return false;
     }
 
-    if (iRows * iCols != 0)
+    piDims = (int*)MALLOC(sizeof(int) * iDims);
+    iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
+
+    if (iDims == 2 && piDims[0] * piDims[1] != 0)
     {
         if (iComplex)
         {
-            pdblReal = (double *)MALLOC(iRows * iCols * sizeof(double));
-            pdblImg = (double *)MALLOC(iRows * iCols * sizeof(double));
-            iRet = readDoubleComplexMatrix(_iDatasetId, iRows, iCols, pdblReal, pdblImg);
+            pdblReal = (double *)MALLOC(iSize * sizeof(double));
+            pdblImg = (double *)MALLOC(iSize * sizeof(double));
+            iRet = readDoubleComplexMatrix(_iDatasetId, pdblReal, pdblImg);
         }
         else
         {
-            pdblReal = (double *)MALLOC(iRows * iCols * sizeof(double));
-            iRet = readDoubleMatrix(_iDatasetId, iRows, iCols, pdblReal);
+            pdblReal = (double *)MALLOC(iSize * sizeof(double));
+            iRet = readDoubleMatrix(_iDatasetId, pdblReal);
         }
 
         if (iRet)
@@ -352,6 +342,10 @@ static bool import_double(int _iDatasetId, int _iItemPos, int *_piAddress, char
             return false;
         }
     }
+    else if(iDims > 2)
+    {//hypermatrix
+        return false;
+    }
     else
     {
         /*bug 7224 : to close dataset */
@@ -366,22 +360,22 @@ static bool import_double(int _iDatasetId, int _iItemPos, int *_piAddress, char
     {
         if (iComplex)
         {
-            sciErr = createNamedComplexMatrixOfDouble(pvApiCtx, _pstVarname, iRows, iCols, pdblReal, pdblImg);
+            sciErr = createNamedComplexMatrixOfDouble(pvApiCtx, _pstVarname, piDims[0], piDims[1], pdblReal, pdblImg);
         }
         else
         {
-            sciErr = createNamedMatrixOfDouble(pvApiCtx, _pstVarname, iRows, iCols, pdblReal);
+            sciErr = createNamedMatrixOfDouble(pvApiCtx, _pstVarname, piDims[0], piDims[1], pdblReal);
         }
     }
-    else                        //if not null this variable is in a list
+    else //if not null this variable is in a list
     {
         if (iComplex)
         {
-            sciErr = createComplexMatrixOfDoubleInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pdblReal, pdblImg);
+            sciErr = createComplexMatrixOfDoubleInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pdblReal, pdblImg);
         }
         else
         {
-            sciErr = createMatrixOfDoubleInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pdblReal);
+            sciErr = createMatrixOfDoubleInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pdblReal);
         }
     }
 
@@ -391,13 +385,6 @@ static bool import_double(int _iDatasetId, int _iItemPos, int *_piAddress, char
         return false;
     }
 
-#ifdef PRINT_DEBUG
-    char pstMsg[512];
-
-    sprintf(pstMsg, "double_%d (%d x %d)", _iItemPos, iRows, iCols);
-    print_tree(pstMsg);
-#endif
-
     if (pdblReal)
     {
         FREE(pdblReal);
@@ -413,63 +400,43 @@ static bool import_double(int _iDatasetId, int _iItemPos, int *_piAddress, char
         return false;
     }
 
-#ifdef TIME_DEBUG
-    QueryPerformanceCounter(&iEnd);
-    double dblTime = ((iEnd.QuadPart - iStart.QuadPart) * 1000.0) / iFreq.QuadPart;
-
-    printf("Total Double : %0.3f ms\n\n", dblTime);
-#endif
-
     return true;
 }
 
 static bool import_string(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
 {
+    SciErr sciErr;
     int iRet = 0;
-    int i = 0;
-    int iRows = 0;
-    int iCols = 0;
     char **pstData = NULL;
-    SciErr sciErr;
-
-#ifdef TIME_DEBUG
-    LARGE_INTEGER iStart1, iEnd1, iStart2, iEnd2, iStart3, iEnd3, iFreq;
+    int iDims = 0;
+    int* piDims = NULL;
+    int iComplex = 0;
+    int iSize = 0;
 
-    QueryPerformanceFrequency(&iFreq);
-    QueryPerformanceCounter(&iStart1);
-#endif
-    iRet = getDatasetDims(_iDatasetId, &iRows, &iCols);
-    if (iRet)
+    iRet = getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
+    if (iRet < 0)
     {
         return false;
     }
 
-    pstData = (char **)MALLOC(iRows * iCols * sizeof(char *));
+    piDims = (int*)MALLOC(sizeof(int) * iDims);
+    iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
 
-#ifdef TIME_DEBUG
-    QueryPerformanceCounter(&iStart1);
-#endif
+    pstData = (char **)MALLOC(iSize * sizeof(char *));
 
-    iRet = readStringMatrix(_iDatasetId, iRows, iCols, pstData);
+    iRet = readStringMatrix(_iDatasetId, pstData);
     if (iRet)
     {
         return false;
     }
 
-#ifdef TIME_DEBUG
-    QueryPerformanceCounter(&iEnd1);
-#endif
-#ifdef TIME_DEBUG
-    QueryPerformanceCounter(&iStart2);
-#endif
-
     if (_piAddress == NULL)
     {
-        sciErr = createNamedMatrixOfString(pvApiCtx, _pstVarname, iRows, iCols, pstData);
+        sciErr = createNamedMatrixOfString(pvApiCtx, _pstVarname, piDims[0], piDims[1], pstData);
     }
     else                        //if not null this variable is in a list
     {
-        sciErr = createMatrixOfStringInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pstData);
+        sciErr = createMatrixOfStringInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pstData);
     }
 
     if (sciErr.iErr)
@@ -478,57 +445,30 @@ static bool import_string(int _iDatasetId, int _iItemPos, int *_piAddress, char
         return false;
     }
 
-#ifdef TIME_DEBUG
-    QueryPerformanceCounter(&iEnd2);
-    QueryPerformanceCounter(&iStart3);
-#endif
-#ifdef PRINT_DEBUG
-    char pstMsg[512];
-
-    sprintf(pstMsg, "string_%d (%d x %d)", _iItemPos, iRows, iCols);
-    print_tree(pstMsg);
-#endif
-    for (i = 0; i < iRows * iCols; i++)
-    {
-        FREE(pstData[i]);
-    }
     FREE(pstData);
 
-    if (iRet)
-    {
-        return false;
-    }
-
-#ifdef TIME_DEBUG
-    QueryPerformanceCounter(&iEnd3);
-
-    //double dblTime    =((iEnd1.QuadPart - iStart1.QuadPart) * 1000.0) / iFreq.QuadPart;
-    //printf("HDF5 : %0.3f ms\n", dblTime);
-    //dblTime   =((iEnd2.QuadPart - iStart2.QuadPart) * 1000.0) / iFreq.QuadPart;
-    //printf("Stack : %0.3f ms\n", dblTime);
-    //dblTime   =((iEnd3.QuadPart - iStart3.QuadPart) * 1000.0) / iFreq.QuadPart;
-    //printf("Clear : %0.3f ms\n", dblTime);
-    double dblTime = ((iEnd3.QuadPart - iStart1.QuadPart) * 1000.0) / iFreq.QuadPart;
-
-    printf("Total String: %0.3f ms\n\n", dblTime);
-#endif
     return true;
 }
 
 static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
 {
     int iRet = 0;
-    int iRows = 0;
-    int iCols = 0;
+    int iDims = 0;
+    int* piDims = NULL;
+    int iComplex = 0;
+    int iSize = 0;
     int iPrec = 0;
     SciErr sciErr;
 
-    iRet = getDatasetDims(_iDatasetId, &iRows, &iCols);
-    if (iRet)
+    iRet = getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
+    if (iRet < 0)
     {
         return false;
     }
 
+    piDims = (int*)MALLOC(sizeof(int) * iDims);
+    iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
+
     iRet = getDatasetPrecision(_iDatasetId, &iPrec);
     if (iRet)
     {
@@ -541,8 +481,8 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
         {
             char *pcData = NULL;
 
-            pcData = (char *)MALLOC(sizeof(char) * iRows * iCols);
-            iRet = readInteger8Matrix(_iDatasetId, iRows, iCols, pcData);
+            pcData = (char *)MALLOC(sizeof(char) * iSize);
+            iRet = readInteger8Matrix(_iDatasetId, pcData);
             if (iRet)
             {
                 return false;
@@ -550,11 +490,11 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
 
             if (_piAddress == NULL)
             {
-                sciErr = createNamedMatrixOfInteger8(pvApiCtx, _pstVarname, iRows, iCols, pcData);
+                sciErr = createNamedMatrixOfInteger8(pvApiCtx, _pstVarname, piDims[0], piDims[1], pcData);
             }
             else
             {
-                sciErr = createMatrixOfInteger8InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pcData);
+                sciErr = createMatrixOfInteger8InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pcData);
             }
         }
         break;
@@ -562,8 +502,8 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
         {
             unsigned char *pucData = NULL;
 
-            pucData = (unsigned char *)MALLOC(sizeof(unsigned char) * iRows * iCols);
-            iRet = readUnsignedInteger8Matrix(_iDatasetId, iRows, iCols, pucData);
+            pucData = (unsigned char *)MALLOC(sizeof(unsigned char) * iSize);
+            iRet = readUnsignedInteger8Matrix(_iDatasetId, pucData);
             if (iRet)
             {
                 return false;
@@ -571,11 +511,11 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
 
             if (_piAddress == NULL)
             {
-                sciErr = createNamedMatrixOfUnsignedInteger8(pvApiCtx, _pstVarname, iRows, iCols, pucData);
+                sciErr = createNamedMatrixOfUnsignedInteger8(pvApiCtx, _pstVarname, piDims[0], piDims[1], pucData);
             }
             else
             {
-                sciErr = createMatrixOfUnsignedInteger8InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pucData);
+                sciErr = createMatrixOfUnsignedInteger8InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pucData);
             }
         }
         break;
@@ -583,8 +523,8 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
         {
             short *psData = NULL;
 
-            psData = (short *)MALLOC(sizeof(short) * iRows * iCols);
-            iRet = readInteger16Matrix(_iDatasetId, iRows, iCols, psData);
+            psData = (short *)MALLOC(sizeof(short) * iSize);
+            iRet = readInteger16Matrix(_iDatasetId, psData);
             if (iRet)
             {
                 return false;
@@ -592,11 +532,11 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
 
             if (_piAddress == NULL)
             {
-                sciErr = createNamedMatrixOfInteger16(pvApiCtx, _pstVarname, iRows, iCols, psData);
+                sciErr = createNamedMatrixOfInteger16(pvApiCtx, _pstVarname, piDims[0], piDims[1], psData);
             }
             else
             {
-                sciErr = createMatrixOfInteger16InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, psData);
+                sciErr = createMatrixOfInteger16InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], psData);
             }
         }
         break;
@@ -604,8 +544,8 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
         {
             unsigned short *pusData = NULL;
 
-            pusData = (unsigned short *)MALLOC(sizeof(unsigned short) * iRows * iCols);
-            iRet = readUnsignedInteger16Matrix(_iDatasetId, iRows, iCols, pusData);
+            pusData = (unsigned short *)MALLOC(sizeof(unsigned short) * iSize);
+            iRet = readUnsignedInteger16Matrix(_iDatasetId, pusData);
             if (iRet)
             {
                 return false;
@@ -613,11 +553,11 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
 
             if (_piAddress == NULL)
             {
-                sciErr = createNamedMatrixOfUnsignedInteger16(pvApiCtx, _pstVarname, iRows, iCols, pusData);
+                sciErr = createNamedMatrixOfUnsignedInteger16(pvApiCtx, _pstVarname, piDims[0], piDims[1], pusData);
             }
             else
             {
-                sciErr = createMatrixOfUnsignedInteger16InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pusData);
+                sciErr = createMatrixOfUnsignedInteger16InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pusData);
             }
         }
         break;
@@ -625,8 +565,8 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
         {
             int *piData = NULL;
 
-            piData = (int *)MALLOC(sizeof(int) * iRows * iCols);
-            iRet = readInteger32Matrix(_iDatasetId, iRows, iCols, piData);
+            piData = (int *)MALLOC(sizeof(int) * iSize);
+            iRet = readInteger32Matrix(_iDatasetId, piData);
             if (iRet)
             {
                 return false;
@@ -634,11 +574,11 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
 
             if (_piAddress == NULL)
             {
-                sciErr = createNamedMatrixOfInteger32(pvApiCtx, _pstVarname, iRows, iCols, piData);
+                sciErr = createNamedMatrixOfInteger32(pvApiCtx, _pstVarname, piDims[0], piDims[1], piData);
             }
             else
             {
-                sciErr = createMatrixOfInteger32InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, piData);
+                sciErr = createMatrixOfInteger32InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], piData);
             }
         }
         break;
@@ -646,8 +586,8 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
         {
             unsigned int *puiData = NULL;
 
-            puiData = (unsigned int *)MALLOC(sizeof(unsigned int) * iRows * iCols);
-            iRet = readUnsignedInteger32Matrix(_iDatasetId, iRows, iCols, puiData);
+            puiData = (unsigned int *)MALLOC(sizeof(unsigned int) * iSize);
+            iRet = readUnsignedInteger32Matrix(_iDatasetId, puiData);
             if (iRet)
             {
                 return false;
@@ -655,11 +595,11 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
 
             if (_piAddress == NULL)
             {
-                sciErr = createNamedMatrixOfUnsignedInteger32(pvApiCtx, _pstVarname, iRows, iCols, puiData);
+                sciErr = createNamedMatrixOfUnsignedInteger32(pvApiCtx, _pstVarname, piDims[0], piDims[1], puiData);
             }
             else
             {
-                sciErr = createMatrixOfUnsignedInteger32InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, puiData);
+                sciErr = createMatrixOfUnsignedInteger32InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], puiData);
             }
         }
         break;
@@ -668,8 +608,8 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
 #ifdef __SCILAB_INT64__
             long long *pllData = NULL;
 
-            pllData = (long long *)MALLOC(sizeof(long long) * iRows * iCols);
-            iRet = readInteger64Matrix(_iDatasetId, iRows, iCols, pllData);
+            pllData = (long long *)MALLOC(sizeof(long long) * iSize);
+            iRet = readInteger64Matrix(_iDatasetId, pllData);
             if (iRet)
             {
                 return false;
@@ -677,11 +617,11 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
 
             if (_piAddress == NULL)
             {
-                sciErr = createNamedMatrixOfInteger64(_pstVarname, iRows, iCols, pllData);
+                sciErr = createNamedMatrixOfInteger64(_pstVarname, piDims[0], piDims[1], pllData);
             }
             else
             {
-                sciErr = createMatrixOfInteger64InNamedList(_pstVarname, _piAddress, _iItemPos, iRows, iCols, pllData);
+                sciErr = createMatrixOfInteger64InNamedList(_pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pllData);
             }
 #else
             return false;
@@ -693,8 +633,8 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
 #ifdef __SCILAB_INT64__
             unsigned long long *pullData = NULL;
 
-            pullData = (unsigned long long *)MALLOC(sizeof(unsigned long long) * iRows * iCols);
-            iRet = readUnsignedInteger64Matrix(_iDatasetId, iRows, iCols, pullData);
+            pullData = (unsigned long long *)MALLOC(sizeof(unsigned long long) * iSize);
+            iRet = readUnsignedInteger64Matrix(_iDatasetId, pullData);
             if (iRet)
             {
                 return false;
@@ -702,11 +642,11 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
 
             if (_piAddress == NULL)
             {
-                sciErr = createNamedMatrixOfUnsignedInteger64(_pstVarname, iRows, iCols, pullData);
+                sciErr = createNamedMatrixOfUnsignedInteger64(_pstVarname, piDims[0], piDims[1], pullData);
             }
             else
             {
-                sciErr = createMatrixOfUnsignedInteger64InNamedList(_pstVarname, _piAddress, _iItemPos, iRows, iCols, pullData);
+                sciErr = createMatrixOfUnsignedInteger64InNamedList(_pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], pullData);
             }
 #else
             return false;
@@ -717,13 +657,6 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
             return false;
     }
 
-#ifdef PRINT_DEBUG
-    char pstMsg[512];
-
-    sprintf(pstMsg, "integer_%d (%d x %d)", _iItemPos, iRows, iCols);
-    print_tree(pstMsg);
-#endif
-
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
@@ -737,20 +670,25 @@ static bool import_boolean(int _iDatasetId, int _iItemPos, int *_piAddress, char
 {
     int iRet = 0;
     int *piData = NULL;
-    int iRows = 0;
-    int iCols = 0;
+    int iDims = 0;
+    int* piDims = NULL;
+    int iComplex = 0;
+    int iSize = 0;
     SciErr sciErr;
 
-    iRet = getDatasetDims(_iDatasetId, &iRows, &iCols);
-    if (iRet)
+    iRet = getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
+    if (iRet < 0)
     {
         return false;
     }
 
-    if (iRows * iCols != 0)
+    piDims = (int*)MALLOC(sizeof(int) * iDims);
+    iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
+
+    if (iSize != 0)
     {
-        piData = (int *)MALLOC(iRows * iCols * sizeof(int));
-        iRet = readBooleanMatrix(_iDatasetId, iRows, iCols, piData);
+        piData = (int *)MALLOC(iSize * sizeof(int));
+        iRet = readBooleanMatrix(_iDatasetId, piData);
         if (iRet)
         {
             return false;
@@ -759,11 +697,11 @@ static bool import_boolean(int _iDatasetId, int _iItemPos, int *_piAddress, char
 
     if (_piAddress == NULL)
     {
-        sciErr = createNamedMatrixOfBoolean(pvApiCtx, _pstVarname, iRows, iCols, piData);
+        sciErr = createNamedMatrixOfBoolean(pvApiCtx, _pstVarname, piDims[0], piDims[1], piData);
     }
     else                        //if not null this variable is in a list
     {
-        sciErr = createMatrixOfBooleanInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, piData);
+        sciErr = createMatrixOfBooleanInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], piData);
     }
 
     if (sciErr.iErr)
@@ -772,13 +710,6 @@ static bool import_boolean(int _iDatasetId, int _iItemPos, int *_piAddress, char
         return false;
     }
 
-#ifdef PRINT_DEBUG
-    char pstMsg[512];
-
-    sprintf(pstMsg, "boolean_%d (%d x %d)", _iItemPos, iRows, iCols);
-    print_tree(pstMsg);
-#endif
-
     if (piData)
     {
         FREE(piData);
@@ -795,36 +726,37 @@ static bool import_boolean(int _iDatasetId, int _iItemPos, int *_piAddress, char
 static bool import_poly(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
 {
     int iRet = 0;
-    int i = 0;
-    int iRows = 0;
-    int iCols = 0;
     int iComplex = 0;
     char pstVarName[64] = { 0 };
     double **pdblReal = NULL;
     double **pdblImg = NULL;
     int *piNbCoef = NULL;
+    int iDims = 0;
+    int* piDims = NULL;
+    int iSize = 0;
     SciErr sciErr;
 
-    iRet = getDatasetDims(_iDatasetId, &iRows, &iCols);
-    if (iRet)
+    iRet = getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
+    if (iRet < 0)
     {
         return false;
     }
 
-    iComplex = isComplexData(_iDatasetId);
+    piDims = (int*)MALLOC(sizeof(int) * iDims);
+    iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
 
     if (iComplex)
     {
-        piNbCoef = (int *)MALLOC(iRows * iCols * sizeof(int));
-        pdblReal = (double **)MALLOC(iRows * iCols * sizeof(double *));
-        pdblImg = (double **)MALLOC(iRows * iCols * sizeof(double *));
-        iRet = readPolyComplexMatrix(_iDatasetId, pstVarName, iRows, iCols, piNbCoef, pdblReal, pdblImg);
+        piNbCoef = (int *)MALLOC(iSize * sizeof(int));
+        pdblReal = (double **)MALLOC(iSize * sizeof(double *));
+        pdblImg = (double **)MALLOC(iSize * sizeof(double *));
+        iRet = readPolyComplexMatrix(_iDatasetId, pstVarName, iDims, piDims, piNbCoef, pdblReal, pdblImg);
     }
     else
     {
-        piNbCoef = (int *)MALLOC(iRows * iCols * sizeof(int));
-        pdblReal = (double **)MALLOC(iRows * iCols * sizeof(double *));
-        iRet = readPolyMatrix(_iDatasetId, pstVarName, iRows, iCols, piNbCoef, pdblReal);
+        piNbCoef = (int *)MALLOC(iSize * sizeof(int));
+        pdblReal = (double **)MALLOC(iSize * sizeof(double *));
+        iRet = readPolyMatrix(_iDatasetId, pstVarName, iDims, piDims, piNbCoef, pdblReal);
     }
 
     if (iRet)
@@ -836,11 +768,11 @@ static bool import_poly(int _iDatasetId, int _iItemPos, int *_piAddress, char *_
     {
         if (iComplex)
         {
-            sciErr = createNamedComplexMatrixOfPoly(pvApiCtx, _pstVarname, pstVarName, iRows, iCols, piNbCoef, pdblReal, pdblImg);
+            sciErr = createNamedComplexMatrixOfPoly(pvApiCtx, _pstVarname, pstVarName, piDims[0], piDims[1], piNbCoef, pdblReal, pdblImg);
         }
         else
         {
-            sciErr = createNamedMatrixOfPoly(pvApiCtx, _pstVarname, pstVarName, iRows, iCols, piNbCoef, pdblReal);
+            sciErr = createNamedMatrixOfPoly(pvApiCtx, _pstVarname, pstVarName, piDims[0], piDims[1], piNbCoef, pdblReal);
         }
     }
     else                        //if not null this variable is in a list
@@ -848,12 +780,12 @@ static bool import_poly(int _iDatasetId, int _iItemPos, int *_piAddress, char *_
         if (iComplex)
         {
             sciErr =
-                createComplexMatrixOfPolyInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, pstVarName, iRows, iCols, piNbCoef, pdblReal,
+                createComplexMatrixOfPolyInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, pstVarName, piDims[0], piDims[1], piNbCoef, pdblReal,
                         pdblImg);
         }
         else
         {
-            sciErr = createMatrixOfPolyInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, pstVarName, iRows, iCols, piNbCoef, pdblReal);
+            sciErr = createMatrixOfPolyInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, pstVarName, piDims[0], piDims[1], piNbCoef, pdblReal);
         }
     }
 
@@ -863,25 +795,23 @@ static bool import_poly(int _iDatasetId, int _iItemPos, int *_piAddress, char *_
         return false;
     }
 
-#ifdef PRINT_DEBUG
-    char pstMsg[512];
-
-    sprintf(pstMsg, "poly_%d (%d x %d)", _iItemPos, iRows, iCols);
-    print_tree(pstMsg);
-#endif
-
-    for (i = 0; i < iRows * iCols; i++)
+    for (int i = 0; i < iSize; i++)
     {
         FREE(pdblReal[i]);
     }
     FREE(pdblReal);
-    FREE(piNbCoef);
 
-    if (iRet)
+
+    if(iComplex)
     {
-        return false;
+        for (int i = 0; i < iSize; i++)
+        {
+            FREE(pdblImg[i]);
+        }
+        FREE(pdblImg);
     }
 
+    FREE(piNbCoef);
     return true;
 }
 
@@ -959,13 +889,6 @@ static bool import_sparse(int _iDatasetId, int _iItemPos, int *_piAddress, char
         return false;
     }
 
-#ifdef PRINT_DEBUG
-    char pstMsg[512];
-
-    sprintf(pstMsg, "sparse_%d (%d x %d)", _iItemPos, iRows, iCols);
-    print_tree(pstMsg);
-#endif
-
     FREE(piNbItemRow);
     FREE(piColPos);
     FREE(pdblReal);
@@ -1021,13 +944,6 @@ static bool import_boolean_sparse(int _iDatasetId, int _iItemPos, int *_piAddres
         return false;
     }
 
-#ifdef PRINT_DEBUG
-    char pstMsg[512];
-
-    sprintf(pstMsg, "boolean sparse_%d (%d x %d)", _iItemPos, iRows, iCols);
-    print_tree(pstMsg);
-#endif
-
     FREE(piNbItemRow);
     FREE(piColPos);
 
@@ -1067,13 +983,6 @@ static bool import_list(int _iDatasetId, int _iVarType, int _iItemPos, int *_piA
         }
     }
 
-#ifdef PRINT_DEBUG
-    char pstMsg[512];
-
-    sprintf(pstMsg, "list_%d (%d)", _iItemPos, iItems);
-    print_tree(pstMsg);
-#endif
-
     if (_piAddress == 0)
     {
         switch (_iVarType)
@@ -1115,7 +1024,6 @@ static bool import_list(int _iDatasetId, int _iVarType, int _iItemPos, int *_piA
         return false;
     }
 
-    iTab++;
     for (i = 0; i < iItems; i++)
     {
         int iItemDataset = 0;
@@ -1133,7 +1041,6 @@ static bool import_list(int _iDatasetId, int _iVarType, int _iItemPos, int *_piA
             return false;
         }
     }
-    iTab--;
 
     iRet = deleteListItemReferences(_iDatasetId, piItemRef);
     if (iRet)
@@ -1141,28 +1048,7 @@ static bool import_list(int _iDatasetId, int _iVarType, int _iItemPos, int *_piA
         return false;
     }
 
-#ifdef TIME_DEBUG
-    printf("Close List %d\n\n", iCloseList++);
-#endif
-
-#ifdef PRINT_DEBUG
-    char pstMsg1[512];
-
-    sprintf(pstMsg1, "ListEnd_%d", _iItemPos);
-    print_tree(pstMsg1);
-#endif
     return true;
 }
 
-void print_tree(char *_pstMsg)
-{
-#ifdef PRINT_DEBUG
-    for (int i = 0; i < iTab; i++)
-    {
-        printf("\t");
-    }
-    printf("%s\n", _pstMsg);
-#endif
-}
-
 /*--------------------------------------------------------------------------*/
index 4d9bf72..de2e532 100644 (file)
@@ -23,9 +23,11 @@ extern "C"
 #include "../../../call_scilab/includes/call_scilab.h"
 #include "h5_fileManagement.h"
 #include "h5_readDataFromFile.h"
+#include "h5_attributeConstants.h"
 #include "expandPathVariable.h"
 }
 
+#include "listvar_in_hdf5_v1.hxx"
 #include <vector>
 
 typedef struct __VAR_INFO__
@@ -91,6 +93,25 @@ int sci_listvar_in_hdf5(char *fname, unsigned long fname_len)
     FREE(pstFileName);
     FREE(pstFile);
 
+    //manage version information
+    int iVersion = getSODFormatAttribute(iFile);
+    if(iVersion != SOD_FILE_VERSION)
+    {
+        if (iVersion > SOD_FILE_VERSION)
+        {//can't read file with version newer that me !
+            Scierror(999, _("%s: Wrong SOD file format version. Max Expected: %d Found: %d\n"), fname, SOD_FILE_VERSION, iVersion);
+            return 1;
+        }
+        else
+        {//call older import functions and exit or ... EXIT !
+            if(iVersion == 1 || iVersion == -1)
+            {
+                //sciprint("old sci_listvar_in_hdf5_v1\n");
+                return sci_listvar_in_hdf5_v1(fname, fname_len);
+            }
+        }
+    }
+
     iNbItem = getVariableNames(iFile, NULL);
     if (iNbItem != 0)
     {
@@ -282,18 +303,11 @@ static bool read_data(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo*
 
 static bool read_double(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo* _pInfo)
 {
-    int iRet = 0;
-    int iRows = 0;
-    int iCols = 0;
+    int iSize = 0;
     int iComplex = 0;
 
-    iRet = getDatasetDims(_iDatasetId, &iRows, &iCols);
-    iComplex = isComplexData(_iDatasetId);
-
-    _pInfo->iDims = 2;
-    _pInfo->piDims[0] = iRows;
-    _pInfo->piDims[1] = iCols;
-    _pInfo->iSize = (2 + (iRows * iCols * (iComplex + 1))) * 8;
+    iSize = getDatasetInfo(_iDatasetId, &iComplex, &_pInfo->iDims, _pInfo->piDims);
+    _pInfo->iSize = (2 + (iSize * (iComplex + 1))) * 8;
 
     generateInfo(_pInfo, "constant");
     return true;
@@ -302,31 +316,26 @@ static bool read_double(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo
 static bool read_string(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo* _pInfo)
 {
     int iRet = 0;
-    int iRows = 0;
-    int iCols = 0;
+    int iSize = 0;
+    int iComplex = 0;
     char** pstData = NULL;
 
-    iRet = getDatasetDims(_iDatasetId, &iRows, &iCols);
+    iSize = getDatasetInfo(_iDatasetId, &iComplex, &_pInfo->iDims, _pInfo->piDims);
 
-    _pInfo->iDims = 2;
-    _pInfo->piDims[0] = iRows;
-    _pInfo->piDims[1] = iCols;
+    pstData = (char **)MALLOC(iSize * sizeof(char *));
+    iRet = readStringMatrix(_iDatasetId, pstData);
 
-    pstData = (char **)MALLOC(iRows * iCols * sizeof(char *));
-    iRet = readStringMatrix(_iDatasetId, iRows, iCols, pstData);
 
-
-    for (int i = 0 ; i < iRows * iCols ; i++)
+    for (int i = 0 ; i < _pInfo->piDims[0] * _pInfo->piDims[1] ; i++)
     {
         _pInfo->iSize += (int)strlen(pstData[i]) * 4;
-        FREE(pstData[i]);
     }
 
     FREE(pstData);
     //always full double size
     _pInfo->iSize += (8 - (_pInfo->iSize % 8));
     //header + offset
-    _pInfo->iSize += 16 + (1 + iRows * iCols) * 4;
+    _pInfo->iSize += 16 + (1 + iSize) * 4;
 
     generateInfo(_pInfo, "string");
     return true;
@@ -334,16 +343,11 @@ static bool read_string(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo
 
 static bool read_boolean(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo* _pInfo)
 {
-    int iRet = 0;
-    int iRows = 0;
-    int iCols = 0;
-
-    iRet = getDatasetDims(_iDatasetId, &iRows, &iCols);
+    int iSize = 0;
+    int iComplex = 0;
 
-    _pInfo->iDims = 2;
-    _pInfo->piDims[0] = iRows;
-    _pInfo->piDims[1] = iCols;
-    _pInfo->iSize = (3 + iRows * iCols) * 4;
+    iSize = getDatasetInfo(_iDatasetId, &iComplex, &_pInfo->iDims, _pInfo->piDims);
+    _pInfo->iSize = (3 + iSize) * 4;
 
     generateInfo(_pInfo, "boolean");
     return true;
@@ -352,17 +356,14 @@ static bool read_boolean(int _iDatasetId, int _iItemPos, int *_piAddress, VarInf
 static bool read_integer(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo* _pInfo)
 {
     int iRet = 0;
-    int iRows = 0;
-    int iCols = 0;
     int iPrec = 0;
+    int iSize = 0;
+    int iComplex = 0;
 
-    iRet = getDatasetDims(_iDatasetId, &iRows, &iCols);
-    iRet = getDatasetPrecision(_iDatasetId, &iPrec);
+    iSize = getDatasetInfo(_iDatasetId, &iComplex, &_pInfo->iDims, _pInfo->piDims);
+    getDatasetPrecision(_iDatasetId, &iPrec);
 
-    _pInfo->iDims = 2;
-    _pInfo->piDims[0] = iRows;
-    _pInfo->piDims[1] = iCols;
-    _pInfo->iSize = 16 + iRows * iCols * (iPrec % 10);
+    _pInfo->iSize = 16 + iSize * (iPrec % 10);
 
     generateInfo(_pInfo, "integer");
     return true;
@@ -419,42 +420,31 @@ static bool read_boolean_sparse(int _iDatasetId, int _iItemPos, int *_piAddress,
 static bool read_poly(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo* _pInfo)
 {
     int iRet = 0;
-    int iRows = 0;
-    int iCols = 0;
     int iComplex = 0;
     char pstVarName[64] = { 0 };
     double **pdblReal = NULL;
     double **pdblImg = NULL;
     int *piNbCoef = NULL;
+    int iSize = 0;
 
-    iRet = getDatasetDims(_iDatasetId, &iRows, &iCols);
-    if (iRet)
-    {
-        return false;
-    }
-
-    iComplex = isComplexData(_iDatasetId);
-
-    _pInfo->iDims = 2;
-    _pInfo->piDims[0] = iRows;
-    _pInfo->piDims[1] = iCols;
-    _pInfo->iSize = 8 * 4 + (iRows * iCols + 1) * 4;
+    iSize = getDatasetInfo(_iDatasetId, &iComplex, &_pInfo->iDims, _pInfo->piDims);
+    _pInfo->iSize = 8 * 4 + (iSize + 1) * 4;
 
     if (iComplex)
     {
-        piNbCoef = (int *)MALLOC(iRows * iCols * sizeof(int));
-        pdblReal = (double **)MALLOC(iRows * iCols * sizeof(double *));
-        pdblImg = (double **)MALLOC(iRows * iCols * sizeof(double *));
-        iRet = readPolyComplexMatrix(_iDatasetId, pstVarName, iRows, iCols, piNbCoef, pdblReal, pdblImg);
+        piNbCoef = (int *)MALLOC(iSize * sizeof(int));
+        pdblReal = (double **)MALLOC(iSize * sizeof(double *));
+        pdblImg = (double **)MALLOC(iSize * sizeof(double *));
+        iRet = readPolyComplexMatrix(_iDatasetId, pstVarName, 2, _pInfo->piDims, piNbCoef, pdblReal, pdblImg);
     }
     else
     {
-        piNbCoef = (int *)MALLOC(iRows * iCols * sizeof(int));
-        pdblReal = (double **)MALLOC(iRows * iCols * sizeof(double *));
-        iRet = readPolyMatrix(_iDatasetId, pstVarName, iRows, iCols, piNbCoef, pdblReal);
+        piNbCoef = (int *)MALLOC(iSize * sizeof(int));
+        pdblReal = (double **)MALLOC(iSize * sizeof(double *));
+        iRet = readPolyMatrix(_iDatasetId, pstVarName, 2, _pInfo->piDims, piNbCoef, pdblReal);
     }
 
-    for (int i = 0 ; i < iRows * iCols ; i++)
+    for (int i = 0 ; i < iSize ; i++)
     {
         _pInfo->iSize += piNbCoef[i] * 8 * (iComplex + 1);
         FREE(pdblReal[i]);
index ac88dd2..11af981 100644 (file)
@@ -5,8 +5,8 @@ EXPORTS
 ;--------------------------
 ; core
 ;--------------------------
-getScilabMode
 callFunctionFromGateway
 com_
-vstk_
-freeArrayOfString
\ No newline at end of file
+freeArrayOfString
+oGetDoubleComplexFromPointer
+vGetPointerFromDoubleComplex
index 9302518..0717111 100644 (file)
@@ -1,9 +1,8 @@
 /*
 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-*  Copyright (C) 2009-2009 - DIGITEO - Bruno JOFRET
-*  Copyright (C) 2010 - DIGITEO - Antoine ELIAS
 *  Copyright (C) 2010 - DIGITEO - Allan CORNET
-*
+*  Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
+*  
 *  This file must be used under the terms of the CeCILL.
 *  This source file is licensed as described in the file COPYING, which
 *  you should have received as part of this distribution.  The terms
index 4058609..b08bf4f 100644 (file)
@@ -1,6 +1,6 @@
 /*
 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-*  Copyright (C) 2009-2009 - DIGITEO - Bruno JOFRET
+*  Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
 *
 *  This file must be used under the terms of the CeCILL.
 *  This source file is licensed as described in the file COPYING, which
@@ -24,6 +24,7 @@
 #include <stdlib.h>
 #include "MALLOC.h"
 #include "sci_types.h"
+#include "stack3.h"
 #include "h5_attributeConstants.h"
 #include "h5_readDataFromFile.h"
 
@@ -44,7 +45,7 @@ static herr_t op_func(hid_t loc_id, const char *name, void *operator_data)
 {
     H5G_stat_t statbuf;
     herr_t status = 0;
-    int *pDataSetId = operator_data;
+    int *pDataSetId = (int*)operator_data;
 
     /*
      * Get type of the object and return only datasetId
@@ -233,15 +234,59 @@ int getSODFormatAttribute(int _iFile)
     return readIntAttribute(_iFile, g_SCILAB_CLASS_SOD_VERSION);
 }
 
-int getDatasetDimension(int _iDatasetId, int *_piRows, int *_piCols)
+int getDatasetInfo(int _iDatasetId, int* _iComplex, int* _iDims, int* _piDims)
 {
-    int iRet = 0;
-    int iDummy = 0;
+    int iSize = 1;
+    hid_t data_type;
+    H5T_class_t data_class;
+    hid_t space = H5Dget_space(_iDatasetId);
+    if(space < 0)
+    {
+        return -1;
+    }
 
-    *_piRows = readIntAttribute(_iDatasetId, g_SCILAB_CLASS_ROWS);
-    *_piCols = readIntAttribute(_iDatasetId, g_SCILAB_CLASS_COLS);
+    data_type = H5Dget_type(_iDatasetId);
+    data_class = H5Tget_class(data_type);
+    if(data_class == H5T_COMPOUND) 
+    {
+        *_iComplex = 1;
+    }
+    else if(data_class == H5T_REFERENCE)
+    {
+        *_iComplex = isComplexData(_iDatasetId);
+    }
+    else
+    {
+        *_iComplex = 0;
+    }
 
-    return iRet;
+    *_iDims = H5Sget_simple_extent_ndims(space);
+    if(*_iDims < 0)
+    {
+        H5Sclose(space);
+        return -1;
+    }
+
+    if(_piDims != 0)
+    {
+        int i = 0;
+        hsize_t* dims = (hsize_t*)MALLOC(sizeof(hsize_t) * *_iDims);
+        if(H5Sget_simple_extent_dims(space, dims, NULL) < 0)
+        {
+            return -1;
+        }
+
+        //reverse dimensions
+        for(i = 0 ; i < *_iDims ; i++)
+        {//reverse dimensions to improve rendering in external tools
+            _piDims[i] = (int)dims[*_iDims - 1 - i];
+            iSize *= _piDims[i];
+        }
+
+    }
+
+    H5Sclose(space);
+    return iSize;
 }
 
 int getSparseDimension(int _iDatasetId, int *_piRows, int *_piCols, int *_piNbItem)
@@ -405,13 +450,11 @@ int getDatasetDims(int _iDatasetId, int *_piRows, int *_piCols)
     return 0;
 }
 
-int readDouble(int _iDatasetId, int _iRows, int _iCols, double *_pdblData)
+int readDoubleMatrix(int _iDatasetId, double *_pdblData)
 {
     herr_t status;
 
-    /*
-     * Read the data.
-     */
+    //Read the data.
     status = H5Dread(_iDatasetId, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pdblData);
     if (status < 0)
     {
@@ -427,64 +470,40 @@ int readDouble(int _iDatasetId, int _iRows, int _iCols, double *_pdblData)
     return 0;
 }
 
-int readDoubleMatrix(int _iDatasetId, int _iRows, int _iCols, double *_pdblData)
+int readDoubleComplexMatrix(int _iDatasetId, double *_pdblReal, double *_pdblImg)
 {
+    hid_t compoundId;
     herr_t status;
+    int iDims = 0;
+    int* piDims = NULL;
+    int iComplex = 0;
+    int iSize = 1;
+    doublecomplex* pData = NULL;
+    int i = 0;
 
-    if (_iRows != 0 && _iCols != 0)
-    {
-        hid_t obj;
-        hobj_ref_t Ref;
-
-        //Read the data.
-        status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, &Ref);
-        if (status < 0)
-        {
-            return -1;
-        }
-
-        //Open the referenced object, get its name and type.
-        obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &Ref);
-        readDouble(obj, _iRows, _iCols, _pdblData);
-    }
-
-    status = H5Dclose(_iDatasetId);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    return 0;
-}
+    /*define compound dataset*/
+    compoundId = H5Tcreate(H5T_COMPOUND, sizeof(doublecomplex));
+    H5Tinsert(compoundId, "real", HOFFSET(doublecomplex, r), H5T_NATIVE_DOUBLE);
+    H5Tinsert(compoundId, "imag", HOFFSET(doublecomplex, i), H5T_NATIVE_DOUBLE);
 
-int readDoubleComplexMatrix(int _iDatasetId, int _iRows, int _iCols, double *_pdblReal, double *_pdblImg)
-{
-    hid_t obj;
-    herr_t status;
-    hobj_ref_t pRef[2] = {0};
+    //get dimension from dataset
+    getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
+    piDims = (int*)MALLOC(sizeof(int) * iDims);
+    iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
 
+    FREE(piDims);
+    //alloc temp array
+    pData = (doublecomplex*)MALLOC(sizeof(doublecomplex) * iSize);
     //Read the data.
-    status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pRef);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    //Open the referenced object, get its name and type.
-    obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[0]);
-    status = readDouble(obj, _iRows, _iCols, _pdblReal);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
-    status = readDouble(obj, _iRows, _iCols, _pdblImg);
+    status = H5Dread(_iDatasetId, compoundId, H5S_ALL, H5S_ALL, H5P_DEFAULT, pData);
     if (status < 0)
     {
         return -1;
     }
 
+    
+    vGetPointerFromDoubleComplex(pData, iSize, _pdblReal, _pdblImg);
+    FREE(pData);
     status = H5Dclose(_iDatasetId);
     if (status < 0)
     {
@@ -508,7 +527,7 @@ int readEmptyMatrix(int _iDatasetId)
     return 0;
 }
 
-int readBooleanMatrix(int _iDatasetId, int _iRows, int _iCols, int *_piData)
+int readBooleanMatrix(int _iDatasetId, int *_piData)
 {
     herr_t status = 0;
 
@@ -530,198 +549,26 @@ int readBooleanMatrix(int _iDatasetId, int _iRows, int _iCols, int *_piData)
     return 0;
 }
 
-static int readString(int _iDatasetId, char **_pstData)
+int readStringMatrix(int _iDatasetId, char **_pstData)
 {
-    hid_t iFileType, memtype, iSpace;
     herr_t status;
-    hsize_t dims[1];
-    size_t iDim;
+    hid_t typeId;
 
-    /*
-     * Get the datatype and its size.
-     */
-    iFileType = H5Dget_type(_iDatasetId);
-    iDim = H5Tget_size(iFileType);
-    iDim++;                     /* Make room for null terminator */
-
-    /*
-     * Get dataspace and allocate memory for read buffer.  This is a
-     * two dimensional attribute so the dynamic allocation must be done
-     * in steps.
-     */
-    iSpace = H5Dget_space(_iDatasetId);
-    if (iSpace < 0)
-    {
-        return -1;
-    }
-
-    status = H5Sget_simple_extent_dims(iSpace, dims, NULL);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    /*
-     * Allocate space for string data.
-     */
-    *_pstData = (char *)MALLOC((size_t) ((dims[0] * iDim + 1) * sizeof(char)));
-
-    /*
-     * Create the memory datatype.
-     */
-    memtype = H5Tcopy(H5T_C_S1);
-    status = H5Tset_size(memtype, iDim);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    /*
-     * Read the data.
-     */
-    status = H5Dread(_iDatasetId, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, *_pstData);
+    typeId = H5Tcopy(H5T_C_S1);
+    status = H5Tset_size(typeId, H5T_VARIABLE);
     if (status < 0)
     {
         return -1;
     }
 
-    status = H5Tclose(memtype);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    status = H5Sclose(iSpace);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    status = H5Tclose(iFileType);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    status = H5Dclose(_iDatasetId);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    return 0;
-}
-
-int readStringMatrix(int _iDatasetId, int _iRows, int _iCols, char **_pstData)
-{
-    int i;
-    herr_t status;
-    hsize_t dims[1];
-    hsize_t subdims[1] = { 1 };
-    hid_t space, memspace, filetype, memtype;
-    size_t iDim;
-    size_t iAllocSize = 0;
-
-#ifdef TIME_DEBUG
-    LARGE_INTEGER *piStart;
-    LARGE_INTEGER *piEnd;
-    LARGE_INTEGER iFreq;
-
-    QueryPerformanceFrequency(&iFreq);
-
-    piStart = (LARGE_INTEGER *) MALLOC(sizeof(LARGE_INTEGER) * (_iRows * _iCols + 1));
-    piEnd = (LARGE_INTEGER *) MALLOC(sizeof(LARGE_INTEGER) * (_iRows * _iCols + 1));
-
-    QueryPerformanceCounter(&piStart[0]);
-#endif
-
-    /*
-     * Get the datatype and its size.
-     */
-    filetype = H5Dget_type(_iDatasetId);
-    iDim = H5Tget_size(filetype);
-    iDim++;                     /* Make room for null terminator */
-
-    /*create sub space */
-    memspace = H5Screate_simple(1, subdims, NULL);
-    if (memspace < 0)
-    {
-        return -1;
-    }
-
-    status = H5Sget_simple_extent_dims(memspace, dims, NULL);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    space = H5Dget_space(_iDatasetId);
-    if (space < 0)
-    {
-        return -1;
-    }
-
-    /*
-     * Create the memory datatype.
-     */
-    memtype = H5Tcopy(H5T_C_S1);
-    status = H5Tset_size(memtype, iDim);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    /*
-     * Allocate space for string data.
-     */
-    iAllocSize = (size_t) ((iDim + 1) * sizeof(char));
-    for (i = 0; i < _iRows * _iCols; i++)
-    {
-        _pstData[i] = (char *)MALLOC(iAllocSize);
-    }
-
-    /*
-     * Read the data.
-     */
-    for (i = 0; i < _iRows * _iCols; i++)
-    {
-        hssize_t start[1] = { i };
-        hsize_t count[1] = { 1 };
-#ifdef TIME_DEBUG
-        QueryPerformanceCounter(&piStart[i + 1]);
-#endif
-        status = H5Sselect_hyperslab(space, H5S_SELECT_SET, start, NULL, count, NULL);
-        if (status < 0)
-        {
-            return -1;
-        }
-
-        /*
-         * Read the data.
-         */
-        status = H5Dread(_iDatasetId, memtype, memspace, space, H5P_DEFAULT, _pstData[i]);
-        if (status < 0)
-        {
-            return -1;
-        }
-#ifdef TIME_DEBUG
-        QueryPerformanceCounter(&piEnd[i + 1]);
-#endif
-    }
-
-    status = H5Sclose(space);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    status = H5Sclose(memspace);
+    //Read the data.
+    status = H5Dread(_iDatasetId, typeId, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pstData);
     if (status < 0)
     {
         return -1;
     }
 
-    status = H5Tclose(filetype);
+    status = H5Tclose(typeId);
     if (status < 0)
     {
         return -1;
@@ -733,61 +580,56 @@ int readStringMatrix(int _iDatasetId, int _iRows, int _iCols, char **_pstData)
         return -1;
     }
 
-#ifdef TIME_DEBUG
-    QueryPerformanceCounter(&piEnd[0]);
-
-    //print debuf timer
-    printf("\nGlobalTime : %0.3f ms\n", ((piEnd[0].QuadPart - piStart[0].QuadPart) * 1000.0) / iFreq.QuadPart);
-    for (i = 0; i < _iRows * _iCols; i++)
-    {
-        double dblTime = ((piEnd[i + 1].QuadPart - piStart[i + 1].QuadPart) * 1000.0) / iFreq.QuadPart;
-
-        printf("SubTime %d : %0.3f ms\n", i, dblTime);
-    }
-#endif
     return 0;
 }
 
 static int readComplexPoly(int _iDatasetId, int *_piNbCoef, double **_pdblReal, double **_pdblImg)
 {
-    int iRows = 0;
-    int iCols = 0;
-
+    int iComplex = 0;
+    int iSize = 0;
+    int iDims = 0;
     //Get the datatype and its size.
-    getDatasetDims(_iDatasetId, &iRows, &iCols);
+
+    iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, _piNbCoef);
 
     //Allocate space for string data.
-    *_piNbCoef = iRows * iCols;
     *_pdblReal = (double *)MALLOC(*_piNbCoef * sizeof(double));
     *_pdblImg = (double *)MALLOC(*_piNbCoef * sizeof(double));
 
     //Read the data and return result.
-    return readDoubleComplexMatrix(_iDatasetId, 1, *_piNbCoef, *_pdblReal, *_pdblImg);
+    return readDoubleComplexMatrix(_iDatasetId, *_pdblReal, *_pdblImg);
 }
 
 static int readPoly(int _iDatasetId, int *_piNbCoef, double **_pdblData)
 {
-    int iRows = 0;
-    int iCols = 0;
-
+    int iComplex = 0;
+    int iSize = 0;
+    int iDims = 0;
     //Get the datatype and its size.
-    getDatasetDims(_iDatasetId, &iRows, &iCols);
+    iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, _piNbCoef);
 
-    *_piNbCoef = iRows * iCols;
     *_pdblData = (double *)MALLOC(*_piNbCoef * sizeof(double));
 
     //Read the data and return result.
-    return readDoubleMatrix(_iDatasetId, 1, *_piNbCoef, *_pdblData);
+    return readDoubleMatrix(_iDatasetId, *_pdblData);
 }
 
-int readCommonPolyMatrix(int _iDatasetId, char *_pstVarname, int _iComplex, int _iRows, int _iCols, int *_piNbCoef, double **_pdblReal,
-                         double **_pdblImg)
+int readCommonPolyMatrix(int _iDatasetId, char *_pstVarname, int _iComplex, int _iDims, int* _piDims, int *_piNbCoef, double **_pdblReal, double **_pdblImg)
 {
     int i = 0;
     hid_t obj = 0;
     char *pstVarName = 0;
-    hobj_ref_t *pData = (hobj_ref_t *) MALLOC(_iRows * _iCols * sizeof(hobj_ref_t));
+    hsize_t* piDims = NULL;
+    hobj_ref_t *pData = NULL;
     herr_t status;
+    int iSize = 1;
+
+    for(i = 0 ; i < _iDims ; i++)
+    {
+        iSize *= _piDims[i];
+    }
+
+    pData = (hobj_ref_t *) MALLOC(iSize * sizeof(hobj_ref_t));
 
     /*
      * Read the data.
@@ -799,7 +641,7 @@ int readCommonPolyMatrix(int _iDatasetId, char *_pstVarname, int _iComplex, int
         return -1;
     }
 
-    for (i = 0; i < _iRows * _iCols; i++)
+    for (i = 0; i < iSize; i++)
     {
         /*
          * Open the referenced object, get its name and type.
@@ -836,17 +678,17 @@ int readCommonPolyMatrix(int _iDatasetId, char *_pstVarname, int _iComplex, int
     return 0;
 }
 
-int readPolyMatrix(int _iDatasetId, char *_pstVarname, int _iRows, int _iCols, int *_piNbCoef, double **_pdblData)
+int readPolyMatrix(int _iDatasetId, char *_pstVarname, int _iDims, int* _piDims, int *_piNbCoef, double **_pdblData)
 {
-    return readCommonPolyMatrix(_iDatasetId, _pstVarname, 0, _iRows, _iCols, _piNbCoef, _pdblData, NULL);
+    return readCommonPolyMatrix(_iDatasetId, _pstVarname, 0, _iDims, _piDims, _piNbCoef, _pdblData, NULL);
 }
 
-int readPolyComplexMatrix(int _iDatasetId, char *_pstVarname, int _iRows, int _iCols, int *_piNbCoef, double **_pdblReal, double **_pdblImg)
+int readPolyComplexMatrix(int _iDatasetId, char *_pstVarname, int _iDims, int* _piDims, int *_piNbCoef, double **_pdblReal, double **_pdblImg)
 {
-    return readCommonPolyMatrix(_iDatasetId, _pstVarname, 1, _iRows, _iCols, _piNbCoef, _pdblReal, _pdblImg);
+    return readCommonPolyMatrix(_iDatasetId, _pstVarname, 1, _iDims, _piDims, _piNbCoef, _pdblReal, _pdblImg);
 }
 
-int readInteger8Matrix(int _iDatasetId, int _iRows, int _iCols, char *_pcData)
+int readInteger8Matrix(int _iDatasetId, char *_pcData)
 {
     herr_t status = 0;
 
@@ -868,7 +710,7 @@ int readInteger8Matrix(int _iDatasetId, int _iRows, int _iCols, char *_pcData)
     return 0;
 }
 
-int readInteger16Matrix(int _iDatasetId, int _iRows, int _iCols, short *_psData)
+int readInteger16Matrix(int _iDatasetId, short *_psData)
 {
     herr_t status = 0;
 
@@ -890,7 +732,7 @@ int readInteger16Matrix(int _iDatasetId, int _iRows, int _iCols, short *_psData)
     return 0;
 }
 
-int readInteger32Matrix(int _iDatasetId, int _iRows, int _iCols, int *_piData)
+int readInteger32Matrix(int _iDatasetId, int *_piData)
 {
     herr_t status = 0;
 
@@ -912,7 +754,7 @@ int readInteger32Matrix(int _iDatasetId, int _iRows, int _iCols, int *_piData)
     return 0;
 }
 
-int readInteger64Matrix(int _iDatasetId, int _iRows, int _iCols, long long *_pllData)
+int readInteger64Matrix(int _iDatasetId, long long *_pllData)
 {
     herr_t status = 0;
 
@@ -934,7 +776,7 @@ int readInteger64Matrix(int _iDatasetId, int _iRows, int _iCols, long long *_pll
     return 0;
 }
 
-int readUnsignedInteger8Matrix(int _iDatasetId, int _iRows, int _iCols, unsigned char *_pucData)
+int readUnsignedInteger8Matrix(int _iDatasetId, unsigned char *_pucData)
 {
     herr_t status = 0;
 
@@ -956,7 +798,7 @@ int readUnsignedInteger8Matrix(int _iDatasetId, int _iRows, int _iCols, unsigned
     return 0;
 }
 
-int readUnsignedInteger16Matrix(int _iDatasetId, int _iRows, int _iCols, unsigned short *_pusData)
+int readUnsignedInteger16Matrix(int _iDatasetId, unsigned short *_pusData)
 {
     herr_t status = 0;
 
@@ -978,7 +820,7 @@ int readUnsignedInteger16Matrix(int _iDatasetId, int _iRows, int _iCols, unsigne
     return 0;
 }
 
-int readUnsignedInteger32Matrix(int _iDatasetId, int _iRows, int _iCols, unsigned int *_puiData)
+int readUnsignedInteger32Matrix(int _iDatasetId, unsigned int *_puiData)
 {
     herr_t status = 0;
 
@@ -1000,7 +842,7 @@ int readUnsignedInteger32Matrix(int _iDatasetId, int _iRows, int _iCols, unsigne
     return 0;
 }
 
-int readUnsignedInteger64Matrix(int _iDatasetId, int _iRows, int _iCols, unsigned long long *_pullData)
+int readUnsignedInteger64Matrix(int _iDatasetId, unsigned long long *_pullData)
 {
     herr_t status = 0;
 
@@ -1022,8 +864,7 @@ int readUnsignedInteger64Matrix(int _iDatasetId, int _iRows, int _iCols, unsigne
     return 0;
 }
 
-int readCommonSparseComplexMatrix(int _iDatasetId, int _iComplex, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos,
-                                  double *_pdblReal, double *_pdblImg)
+int readCommonSparseComplexMatrix(int _iDatasetId, int _iComplex, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos, double *_pdblReal, double *_pdblImg)
 {
     hid_t obj = 0;
     hobj_ref_t pRef[3] = {0};
@@ -1040,7 +881,7 @@ int readCommonSparseComplexMatrix(int _iDatasetId, int _iComplex, int _iRows, in
 
     //read Row data
     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[0]);
-    status = readInteger32Matrix(obj, 1, _iRows, _piNbItemRow);
+    status = readInteger32Matrix(obj, _piNbItemRow);
     if (status < 0)
     {
         return -1;
@@ -1048,7 +889,7 @@ int readCommonSparseComplexMatrix(int _iDatasetId, int _iComplex, int _iRows, in
 
     //read cols data
     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
-    status = readInteger32Matrix(obj, 1, _iNbItem, _piColPos);
+    status = readInteger32Matrix(obj, _piColPos);
     if (status < 0)
     {
         return -1;
@@ -1059,11 +900,11 @@ int readCommonSparseComplexMatrix(int _iDatasetId, int _iComplex, int _iRows, in
 
     if (_iComplex)
     {
-        status = readDoubleComplexMatrix(obj, 1, _iNbItem, _pdblReal, _pdblImg);
+        status = readDoubleComplexMatrix(obj, _pdblReal, _pdblImg);
     }
     else
     {
-        status = readDoubleMatrix(obj, 1, _iNbItem, _pdblReal);
+        status = readDoubleMatrix(obj, _pdblReal);
     }
 
     if (status < 0)
@@ -1079,8 +920,7 @@ int readSparseMatrix(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int
     return readCommonSparseComplexMatrix(_iDatasetId, 0, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, NULL);
 }
 
-int readSparseComplexMatrix(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos, double *_pdblReal,
-                            double *_pdblImg)
+int readSparseComplexMatrix(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos, double *_pdblReal, double *_pdblImg)
 {
     return readCommonSparseComplexMatrix(_iDatasetId, 1, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, _pdblImg);
 }
@@ -1102,7 +942,7 @@ int readBooleanSparseMatrix(int _iDatasetId, int _iRows, int _iCols, int _iNbIte
 
     //read Row data
     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[0]);
-    status = readInteger32Matrix(obj, 1, _iRows, _piNbItemRow);
+    status = readInteger32Matrix(obj, _piNbItemRow);
     if (status < 0)
     {
         return -1;
@@ -1110,7 +950,7 @@ int readBooleanSparseMatrix(int _iDatasetId, int _iRows, int _iCols, int _iNbIte
 
     //read cols data
     obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
-    status = readInteger32Matrix(obj, 1, _iNbItem, _piColPos);
+    status = readInteger32Matrix(obj, _piColPos);
     if (status < 0)
     {
         return -1;
diff --git a/scilab/modules/hdf5/src/c/h5_readDataFromFile_v1.c b/scilab/modules/hdf5/src/c/h5_readDataFromFile_v1.c
new file mode 100644 (file)
index 0000000..804c1d8
--- /dev/null
@@ -0,0 +1,1239 @@
+/*
+*  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+*  Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
+*
+*  This file must be used under the terms of the CeCILL.
+*  This source file is licensed as described in the file COPYING, which
+*  you should have received as part of this distribution.  The terms
+*  are also available at
+*  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*
+*/
+
+#define H5_USE_16_API
+
+#ifndef _MSC_VER
+#include <sys/time.h>
+#else
+#include <windows.h>
+//#include <winbase.h>
+#endif
+
+#include <string.h>
+#include <hdf5.h>
+#include <stdlib.h>
+#include "MALLOC.h"
+#include "sci_types.h"
+#include "h5_attributeConstants.h"
+#include "h5_readDataFromFile_v1.h"
+
+//#define TIME_DEBUG
+
+static herr_t find_attr_by_name_v1(hid_t loc_id, const char *name, void *data)
+{
+    return !strcmp(name, (const char *)data);
+}
+
+/************************************************************
+
+Operator function.  Prints the name and type of the object
+being examined.
+
+************************************************************/
+static herr_t op_func_v1(hid_t loc_id, const char *name, void *operator_data)
+{
+    H5G_stat_t statbuf;
+    herr_t status = 0;
+    int *pDataSetId = (int*)operator_data;
+
+    /*
+    * Get type of the object and return only datasetId
+    * through operator_data.
+    */
+    status = H5Gget_objinfo(loc_id, name, 0, &statbuf);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    switch (statbuf.type)
+    {
+    case H5G_GROUP:
+        break;
+    case H5G_DATASET:
+        *pDataSetId = H5Dopen(loc_id, name);
+        break;
+    case H5G_TYPE:
+        break;
+    default:
+        break;
+    }
+
+    return 0;
+}
+
+static int readIntAttribute_v1(int _iDatasetId, const char *_pstName)
+{
+    hid_t iAttributeId;
+    herr_t status;
+    int iVal = -1;
+
+    if (H5Aiterate(_iDatasetId, NULL, find_attr_by_name_v1, (void *)_pstName))
+    {
+        iAttributeId = H5Aopen_name(_iDatasetId, _pstName);
+        if (iAttributeId < 0)
+        {
+            return -1;
+        }
+
+        status = H5Aread(iAttributeId, H5T_NATIVE_INT, &iVal);
+        if (status < 0)
+        {
+            return -1;
+        }
+
+        status = H5Aclose(iAttributeId);
+        if (status < 0)
+        {
+            return -1;
+        }
+    }
+    return iVal;
+}
+
+/*
+** WARNING : this function returns an allocated value that must be freed.
+*/
+static char* readAttribute_v1(int _iDatasetId, const char *_pstName)
+{
+    hid_t iAttributeId;
+    hid_t iFileType, memtype, iSpace;
+    herr_t status;
+    hsize_t dims[1];
+    size_t iDim;
+
+    char *pstValue = NULL;
+
+    if (H5Aiterate(_iDatasetId, NULL, find_attr_by_name_v1, (void *)_pstName))
+    {
+        iAttributeId = H5Aopen_name(_iDatasetId, _pstName);
+        if (iAttributeId < 0)
+        {
+            return NULL;
+        }
+        /*
+        * Get the datatype and its size.
+        */
+        iFileType = H5Aget_type(iAttributeId);
+        iDim = H5Tget_size(iFileType);
+        iDim++;                 /* Make room for null terminator */
+
+        /*
+        * Get dataspace and allocate memory for read buffer.  This is a
+        * two dimensional attribute so the dynamic allocation must be done
+        * in steps.
+        */
+        iSpace = H5Aget_space(iAttributeId);
+        if (iSpace < 0)
+        {
+            return NULL;
+        }
+
+        status = H5Sget_simple_extent_dims(iSpace, dims, NULL);
+        if (status < 0)
+        {
+            return NULL;
+        }
+
+        /*
+        * Allocate space for string data.
+        */
+        pstValue = (char *)MALLOC((size_t) ((dims[0] * iDim + 1) * sizeof(char)));
+
+        /*
+        * Create the memory datatype.
+        */
+        memtype = H5Tcopy(H5T_C_S1);
+        status = H5Tset_size(memtype, iDim);
+        if (status < 0)
+        {
+            return NULL;
+        }
+
+        /*
+        * Read the data.
+        */
+        status = H5Aread(iAttributeId, memtype, pstValue);
+        if (status < 0)
+        {
+            FREE(pstValue);
+            return NULL;
+        }
+
+        status = H5Tclose(memtype);
+        if (status < 0)
+        {
+            FREE(pstValue);
+            return NULL;
+        }
+
+        status = H5Sclose(iSpace);
+        if (status < 0)
+        {
+            FREE(pstValue);
+            return NULL;
+        }
+
+        status = H5Tclose(iFileType);
+        if (status < 0)
+        {
+            FREE(pstValue);
+            return NULL;
+        }
+
+        status = H5Aclose(iAttributeId);
+        if (status < 0)
+        {
+            FREE(pstValue);
+            return NULL;
+        }
+    }
+    return pstValue;
+
+}
+
+static int checkAttribute_v1(int _iDatasetId, char *_pstAttribute, char *_pstValue)
+{
+    int iRet = 0;
+    char *pstScilabClass = NULL;
+
+    //status = H5Giterate (_iFile, "/", NULL, op_func, &iDatasetId);
+    pstScilabClass = readAttribute_v1(_iDatasetId, _pstAttribute);
+    if (pstScilabClass != NULL && strcmp(pstScilabClass, _pstValue) == 0)
+    {
+        iRet = 1;
+    }
+    if (pstScilabClass)
+    {
+        FREE(pstScilabClass);
+    }
+    return iRet;
+}
+
+/*
+** WARNING : this function returns an allocated value that must be freed.
+*/
+char* getScilabVersionAttribute_v1(int _iFile)
+{
+    return readAttribute_v1(_iFile, g_SCILAB_CLASS_SCI_VERSION);
+}
+
+int getSODFormatAttribute_v1(int _iFile)
+{
+    return readIntAttribute_v1(_iFile, g_SCILAB_CLASS_SOD_VERSION);
+}
+
+int getDatasetDimension_v1(int _iDatasetId, int *_piRows, int *_piCols)
+{
+    int iRet = 0;
+    int iDummy = 0;
+
+    *_piRows = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_ROWS);
+    *_piCols = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_COLS);
+
+    return iRet;
+}
+
+int getSparseDimension_v1(int _iDatasetId, int *_piRows, int *_piCols, int *_piNbItem)
+{
+    int iRet = 0;
+    int iDummy = 0;
+
+    //get number of item in the sparse matrix
+    getDatasetDims_v1(_iDatasetId, _piRows, _piCols);
+    *_piNbItem = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_ITEMS);
+
+    return iRet;
+}
+
+static int isEmptyDataset_v1(int _iDatasetId)
+{
+    return checkAttribute_v1(_iDatasetId, (char *)g_SCILAB_CLASS_EMPTY, "true");
+}
+
+int isComplexData_v1(int _iDatasetId)
+{
+    return checkAttribute_v1(_iDatasetId, (char *)g_SCILAB_CLASS_COMPLEX, "true");
+}
+
+int getDatasetPrecision_v1(int _iDatasetId, int *_piPrec)
+{
+    int iRet = 0;
+    char *pstScilabClass = readAttribute_v1(_iDatasetId, g_SCILAB_CLASS_PREC);
+
+    if (pstScilabClass == NULL)
+    {
+        return -1;
+    }
+    else if (strcmp(pstScilabClass, "8") == 0)
+    {
+        *_piPrec = SCI_INT8;
+    }
+    else if (strcmp(pstScilabClass, "u8") == 0)
+    {
+        *_piPrec = SCI_UINT8;
+    }
+    else if (strcmp(pstScilabClass, "16") == 0)
+    {
+        *_piPrec = SCI_INT16;
+    }
+    else if (strcmp(pstScilabClass, "u16") == 0)
+    {
+        *_piPrec = SCI_UINT16;
+    }
+    else if (strcmp(pstScilabClass, "32") == 0)
+    {
+        *_piPrec = SCI_INT32;
+    }
+    else if (strcmp(pstScilabClass, "u32") == 0)
+    {
+        *_piPrec = SCI_UINT32;
+    }
+    else if (strcmp(pstScilabClass, "64") == 0)
+    {
+        *_piPrec = SCI_INT64;
+    }
+    else if (strcmp(pstScilabClass, "u64") == 0)
+    {
+        *_piPrec = SCI_UINT64;
+    }
+    else
+    {
+        iRet = 1;
+    }
+
+    FREE(pstScilabClass);
+    return iRet;
+}
+
+int getVariableNames_v1(int _iFile, char **pstNameList)
+{
+    hsize_t i = 0;
+    hsize_t iCount = 0;
+    herr_t status = 0;
+    int iNbItem = 0;
+
+    status = H5Gget_num_objs(_iFile, &iCount);
+    if (status != 0)
+    {
+        return 0;
+    }
+
+    for (i = 0; i < iCount; i++)
+    {
+        if (H5Gget_objtype_by_idx(_iFile, i) == H5G_DATASET)
+        {
+            if (pstNameList != NULL)
+            {
+                int iLen = 0;
+
+                iLen = (int)H5Gget_objname_by_idx(_iFile, i, NULL, iLen);
+                pstNameList[iNbItem] = (char *)MALLOC(sizeof(char) * (iLen + 1));   //null terminated
+                H5Gget_objname_by_idx(_iFile, i, pstNameList[iNbItem], iLen + 1);
+            }
+            iNbItem++;
+        }
+    }
+    return iNbItem;
+}
+
+int getDataSetIdFromName_v1(int _iFile, char *_pstName)
+{
+    return H5Dopen(_iFile, _pstName);
+}
+
+int getDataSetId_v1(int _iFile)
+{
+    herr_t status = 0;
+    int iDatasetId = 0;
+
+    /*
+    * Begin iteration.
+    */
+    status = H5Giterate(_iFile, "/", NULL, op_func_v1, &iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return iDatasetId;
+}
+
+int getListDims_v1(int _iDatasetId, int *_piItems)
+{
+    /*
+    * Get dataspace and dimensions of the dataset. This is a
+    * two dimensional dataset.
+    */
+    if (isEmptyDataset_v1(_iDatasetId))
+    {
+        *_piItems = 0;
+    }
+    else
+    {
+        *_piItems = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_ITEMS);
+    }
+    return 0;
+}
+
+int getDatasetDims_v1(int _iDatasetId, int *_piRows, int *_piCols)
+{
+    /*
+    * Get dataspace and dimensions of the dataset. This is a
+    * two dimensional dataset.
+    */
+    if (isEmptyDataset_v1(_iDatasetId))
+    {
+        *_piCols = 0;
+        *_piRows = 0;
+    }
+    else
+    {
+        *_piRows = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_ROWS);
+        *_piCols = readIntAttribute_v1(_iDatasetId, g_SCILAB_CLASS_COLS);
+    }
+    return 0;
+}
+
+int readDouble_v1(int _iDatasetId, int _iRows, int _iCols, double *_pdblData)
+{
+    herr_t status;
+
+    /*
+    * Read the data.
+    */
+    status = H5Dread(_iDatasetId, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pdblData);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int readDoubleMatrix_v1(int _iDatasetId, int _iRows, int _iCols, double *_pdblData)
+{
+    herr_t status;
+
+    if (_iRows != 0 && _iCols != 0)
+    {
+        hid_t obj;
+        hobj_ref_t Ref;
+
+        //Read the data.
+        status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, &Ref);
+        if (status < 0)
+        {
+            return -1;
+        }
+
+        //Open the referenced object, get its name and type.
+        obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &Ref);
+        readDouble_v1(obj, _iRows, _iCols, _pdblData);
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int readDoubleComplexMatrix_v1(int _iDatasetId, int _iRows, int _iCols, double *_pdblReal, double *_pdblImg)
+{
+    hid_t obj;
+    herr_t status;
+    hobj_ref_t pRef[2] = {0};
+
+    //Read the data.
+    status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pRef);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    //Open the referenced object, get its name and type.
+    obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[0]);
+    status = readDouble_v1(obj, _iRows, _iCols, _pdblReal);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
+    status = readDouble_v1(obj, _iRows, _iCols, _pdblImg);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int readEmptyMatrix_v1(int _iDatasetId)
+{
+    //close dataset
+    herr_t status;
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int readBooleanMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int *_piData)
+{
+    herr_t status = 0;
+
+    /*
+    * Read the data.
+    */
+    status = H5Dread(_iDatasetId, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, _piData);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+static int readString_v1(int _iDatasetId, char **_pstData)
+{
+    hid_t iFileType, memtype, iSpace;
+    herr_t status;
+    hsize_t dims[1];
+    size_t iDim;
+
+    /*
+    * Get the datatype and its size.
+    */
+    iFileType = H5Dget_type(_iDatasetId);
+    iDim = H5Tget_size(iFileType);
+    iDim++;                     /* Make room for null terminator */
+
+    /*
+    * Get dataspace and allocate memory for read buffer.  This is a
+    * two dimensional attribute so the dynamic allocation must be done
+    * in steps.
+    */
+    iSpace = H5Dget_space(_iDatasetId);
+    if (iSpace < 0)
+    {
+        return -1;
+    }
+
+    status = H5Sget_simple_extent_dims(iSpace, dims, NULL);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    /*
+    * Allocate space for string data.
+    */
+    *_pstData = (char *)MALLOC((size_t) ((dims[0] * iDim + 1) * sizeof(char)));
+
+    /*
+    * Create the memory datatype.
+    */
+    memtype = H5Tcopy(H5T_C_S1);
+    status = H5Tset_size(memtype, iDim);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    /*
+    * Read the data.
+    */
+    status = H5Dread(_iDatasetId, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, *_pstData);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Tclose(memtype);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Sclose(iSpace);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Tclose(iFileType);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int readStringMatrix_v1(int _iDatasetId, int _iRows, int _iCols, char **_pstData)
+{
+    int i;
+    herr_t status;
+    hsize_t dims[1];
+    hsize_t subdims[1] = { 1 };
+    hid_t space, memspace, filetype, memtype;
+    size_t iDim;
+    size_t iAllocSize = 0;
+
+#ifdef TIME_DEBUG
+    LARGE_INTEGER *piStart;
+    LARGE_INTEGER *piEnd;
+    LARGE_INTEGER iFreq;
+
+    QueryPerformanceFrequency(&iFreq);
+
+    piStart = (LARGE_INTEGER *) MALLOC(sizeof(LARGE_INTEGER) * (_iRows * _iCols + 1));
+    piEnd = (LARGE_INTEGER *) MALLOC(sizeof(LARGE_INTEGER) * (_iRows * _iCols + 1));
+
+    QueryPerformanceCounter(&piStart[0]);
+#endif
+
+    /*
+    * Get the datatype and its size.
+    */
+    filetype = H5Dget_type(_iDatasetId);
+    iDim = H5Tget_size(filetype);
+    iDim++;                     /* Make room for null terminator */
+
+    /*create sub space */
+    memspace = H5Screate_simple(1, subdims, NULL);
+    if (memspace < 0)
+    {
+        return -1;
+    }
+
+    status = H5Sget_simple_extent_dims(memspace, dims, NULL);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    space = H5Dget_space(_iDatasetId);
+    if (space < 0)
+    {
+        return -1;
+    }
+
+    /*
+    * Create the memory datatype.
+    */
+    memtype = H5Tcopy(H5T_C_S1);
+    status = H5Tset_size(memtype, iDim);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    /*
+    * Allocate space for string data.
+    */
+    iAllocSize = (size_t) ((iDim + 1) * sizeof(char));
+    for (i = 0; i < _iRows * _iCols; i++)
+    {
+        _pstData[i] = (char *)MALLOC(iAllocSize);
+    }
+
+    /*
+    * Read the data.
+    */
+    for (i = 0; i < _iRows * _iCols; i++)
+    {
+        hsize_t start[1] = { i };
+        hsize_t count[1] = { 1 };
+#ifdef TIME_DEBUG
+        QueryPerformanceCounter(&piStart[i + 1]);
+#endif
+        status = H5Sselect_hyperslab(space, H5S_SELECT_SET, start, NULL, count, NULL);
+        if (status < 0)
+        {
+            return -1;
+        }
+
+        /*
+        * Read the data.
+        */
+        status = H5Dread(_iDatasetId, memtype, memspace, space, H5P_DEFAULT, _pstData[i]);
+        if (status < 0)
+        {
+            return -1;
+        }
+#ifdef TIME_DEBUG
+        QueryPerformanceCounter(&piEnd[i + 1]);
+#endif
+    }
+
+    status = H5Sclose(space);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Sclose(memspace);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Tclose(filetype);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+#ifdef TIME_DEBUG
+    QueryPerformanceCounter(&piEnd[0]);
+
+    //print debuf timer
+    printf("\nGlobalTime : %0.3f ms\n", ((piEnd[0].QuadPart - piStart[0].QuadPart) * 1000.0) / iFreq.QuadPart);
+    for (i = 0; i < _iRows * _iCols; i++)
+    {
+        double dblTime = ((piEnd[i + 1].QuadPart - piStart[i + 1].QuadPart) * 1000.0) / iFreq.QuadPart;
+
+        printf("SubTime %d : %0.3f ms\n", i, dblTime);
+    }
+#endif
+    return 0;
+}
+
+static int readComplexPoly_v1(int _iDatasetId, int *_piNbCoef, double **_pdblReal, double **_pdblImg)
+{
+    int iRows = 0;
+    int iCols = 0;
+
+    //Get the datatype and its size.
+    getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
+
+    //Allocate space for string data.
+    *_piNbCoef = iRows * iCols;
+    *_pdblReal = (double *)MALLOC(*_piNbCoef * sizeof(double));
+    *_pdblImg = (double *)MALLOC(*_piNbCoef * sizeof(double));
+
+    //Read the data and return result.
+    return readDoubleComplexMatrix_v1(_iDatasetId, 1, *_piNbCoef, *_pdblReal, *_pdblImg);
+}
+
+static int readPoly_v1(int _iDatasetId, int *_piNbCoef, double **_pdblData)
+{
+    int iRows = 0;
+    int iCols = 0;
+
+    //Get the datatype and its size.
+    getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
+
+    *_piNbCoef = iRows * iCols;
+    *_pdblData = (double *)MALLOC(*_piNbCoef * sizeof(double));
+
+    //Read the data and return result.
+    return readDoubleMatrix_v1(_iDatasetId, 1, *_piNbCoef, *_pdblData);
+}
+
+int readCommonPolyMatrix_v1(int _iDatasetId, char *_pstVarname, int _iComplex, int _iRows, int _iCols, int *_piNbCoef, double **_pdblReal,
+    double **_pdblImg)
+{
+    int i = 0;
+    hid_t obj = 0;
+    char *pstVarName = 0;
+    hobj_ref_t *pData = (hobj_ref_t *) MALLOC(_iRows * _iCols * sizeof(hobj_ref_t));
+    herr_t status;
+
+    /*
+    * Read the data.
+    */
+    status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pData);
+    if (status < 0)
+    {
+        FREE(pData);
+        return -1;
+    }
+
+    for (i = 0; i < _iRows * _iCols; i++)
+    {
+        /*
+        * Open the referenced object, get its name and type.
+        */
+        obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pData[i]);
+        if (_iComplex)
+        {
+            status = readComplexPoly_v1(obj, &_piNbCoef[i], &_pdblReal[i], &_pdblImg[i]);
+        }
+        else
+        {
+            status = readPoly_v1(obj, &_piNbCoef[i], &_pdblReal[i]);
+        }
+
+        if (status < 0)
+        {
+            FREE(pData);
+            return -1;
+        }
+    }
+
+    pstVarName = readAttribute_v1(_iDatasetId, g_SCILAB_CLASS_VARNAME);
+    strcpy(_pstVarname, pstVarName);
+    FREE(pstVarName);
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        FREE(pData);
+        return -1;
+    }
+
+    FREE(pData);
+
+    return 0;
+}
+
+int readPolyMatrix_v1(int _iDatasetId, char *_pstVarname, int _iRows, int _iCols, int *_piNbCoef, double **_pdblData)
+{
+    return readCommonPolyMatrix_v1(_iDatasetId, _pstVarname, 0, _iRows, _iCols, _piNbCoef, _pdblData, NULL);
+}
+
+int readPolyComplexMatrix_v1(int _iDatasetId, char *_pstVarname, int _iRows, int _iCols, int *_piNbCoef, double **_pdblReal, double **_pdblImg)
+{
+    return readCommonPolyMatrix_v1(_iDatasetId, _pstVarname, 1, _iRows, _iCols, _piNbCoef, _pdblReal, _pdblImg);
+}
+
+int readInteger8Matrix_v1(int _iDatasetId, int _iRows, int _iCols, char *_pcData)
+{
+    herr_t status = 0;
+
+    /*
+    * Read the data.
+    */
+    status = H5Dread(_iDatasetId, H5T_NATIVE_INT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pcData);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int readInteger16Matrix_v1(int _iDatasetId, int _iRows, int _iCols, short *_psData)
+{
+    herr_t status = 0;
+
+    /*
+    * Read the data.
+    */
+    status = H5Dread(_iDatasetId, H5T_NATIVE_INT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, _psData);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int readInteger32Matrix_v1(int _iDatasetId, int _iRows, int _iCols, int *_piData)
+{
+    herr_t status = 0;
+
+    /*
+    * Read the data.
+    */
+    status = H5Dread(_iDatasetId, H5T_NATIVE_INT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, _piData);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int readInteger64Matrix_v1(int _iDatasetId, int _iRows, int _iCols, long long *_pllData)
+{
+    herr_t status = 0;
+
+    /*
+    * Read the data.
+    */
+    status = H5Dread(_iDatasetId, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pllData);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int readUnsignedInteger8Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned char *_pucData)
+{
+    herr_t status = 0;
+
+    /*
+    * Read the data.
+    */
+    status = H5Dread(_iDatasetId, H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pucData);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int readUnsignedInteger16Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned short *_pusData)
+{
+    herr_t status = 0;
+
+    /*
+    * Read the data.
+    */
+    status = H5Dread(_iDatasetId, H5T_NATIVE_UINT16, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pusData);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int readUnsignedInteger32Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned int *_puiData)
+{
+    herr_t status = 0;
+
+    /*
+    * Read the data.
+    */
+    status = H5Dread(_iDatasetId, H5T_NATIVE_UINT32, H5S_ALL, H5S_ALL, H5P_DEFAULT, _puiData);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int readUnsignedInteger64Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsigned long long *_pullData)
+{
+    herr_t status = 0;
+
+    /*
+    * Read the data.
+    */
+    status = H5Dread(_iDatasetId, H5T_NATIVE_UINT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pullData);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int readCommonSparseComplexMatrix_v1(int _iDatasetId, int _iComplex, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos,
+    double *_pdblReal, double *_pdblImg)
+{
+    hid_t obj = 0;
+    hobj_ref_t pRef[3] = {0};
+    herr_t status;
+
+    /*
+    * Read the data.
+    */
+    status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pRef);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    //read Row data
+    obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[0]);
+    status = readInteger32Matrix_v1(obj, 1, _iRows, _piNbItemRow);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    //read cols data
+    obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
+    status = readInteger32Matrix_v1(obj, 1, _iNbItem, _piColPos);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    //read sparse data
+    obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[2]);
+
+    if (_iComplex)
+    {
+        status = readDoubleComplexMatrix_v1(obj, 1, _iNbItem, _pdblReal, _pdblImg);
+    }
+    else
+    {
+        status = readDoubleMatrix_v1(obj, 1, _iNbItem, _pdblReal);
+    }
+
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int readSparseMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos, double *_pdblReal)
+{
+    return readCommonSparseComplexMatrix_v1(_iDatasetId, 0, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, NULL);
+}
+
+int readSparseComplexMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos, double *_pdblReal,
+    double *_pdblImg)
+{
+    return readCommonSparseComplexMatrix_v1(_iDatasetId, 1, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, _pdblImg);
+}
+
+int readBooleanSparseMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos)
+{
+    hid_t obj = 0;
+    hobj_ref_t pRef[2] = {0};
+    herr_t status;
+
+    /*
+    * Read the data.
+    */
+    status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pRef);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    //read Row data
+    obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[0]);
+    status = readInteger32Matrix_v1(obj, 1, _iRows, _piNbItemRow);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    //read cols data
+    obj = H5Rdereference(_iDatasetId, H5R_OBJECT, &pRef[1]);
+    status = readInteger32Matrix_v1(obj, 1, _iNbItem, _piColPos);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int getScilabTypeFromDataSet_v1(int _iDatasetId)
+{
+    int iVarType = 0;
+    char *pstScilabClass = readAttribute_v1(_iDatasetId, g_SCILAB_CLASS);
+
+    if (pstScilabClass == NULL)
+    {
+        return unknow_type;
+    }
+    /* HDF5 Float type + SCILAB_Class = double <=> double */
+    if (strcmp(pstScilabClass, g_SCILAB_CLASS_DOUBLE) == 0)
+    {
+        iVarType = sci_matrix;
+    }
+    else if (strcmp(pstScilabClass, g_SCILAB_CLASS_STRING) == 0)
+    {
+        iVarType = sci_strings;
+    }
+    else if (strcmp(pstScilabClass, g_SCILAB_CLASS_BOOLEAN) == 0)
+    {
+        iVarType = sci_boolean;
+    }
+    else if (strcmp(pstScilabClass, g_SCILAB_CLASS_BOOLEAN) == 0)
+    {
+        iVarType = sci_boolean;
+    }
+    else if (strcmp(pstScilabClass, g_SCILAB_CLASS_POLY) == 0)
+    {
+        iVarType = sci_poly;
+    }
+    else if (strcmp(pstScilabClass, g_SCILAB_CLASS_INT) == 0)
+    {
+        iVarType = sci_ints;
+    }
+    else if (strcmp(pstScilabClass, g_SCILAB_CLASS_SPARSE) == 0)
+    {
+        iVarType = sci_sparse;
+    }
+    else if (strcmp(pstScilabClass, g_SCILAB_CLASS_BSPARSE) == 0)
+    {
+        iVarType = sci_boolean_sparse;
+    }
+    else if (strcmp(pstScilabClass, g_SCILAB_CLASS_LIST) == 0)
+    {
+        iVarType = sci_list;
+    }
+    else if (strcmp(pstScilabClass, g_SCILAB_CLASS_TLIST) == 0)
+    {
+        iVarType = sci_tlist;
+    }
+    else if (strcmp(pstScilabClass, g_SCILAB_CLASS_MLIST) == 0)
+    {
+        iVarType = sci_mlist;
+    }
+    else if (strcmp(pstScilabClass, g_SCILAB_CLASS_VOID) == 0)
+    {
+        iVarType = sci_void;
+    }
+    else if (strcmp(pstScilabClass, g_SCILAB_CLASS_UNDEFINED) == 0)
+    {
+        iVarType = sci_undefined;
+    }
+
+    FREE(pstScilabClass);
+    return iVarType;
+}
+
+int getListItemReferences_v1(int _iDatasetId, hobj_ref_t ** _piItemRef)
+{
+    int iItem = 0;
+    herr_t status = 0;
+
+    getListDims_v1(_iDatasetId, &iItem);
+
+    *_piItemRef = (hobj_ref_t *) MALLOC(iItem * sizeof(hobj_ref_t));
+
+    status = H5Dread(_iDatasetId, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, *_piItemRef);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int getListItemDataset_v1(int _iDatasetId, void *_piItemRef, int _iItemPos, int *_piItemDataset)
+{
+    hobj_ref_t poRef = ((hobj_ref_t *) _piItemRef)[_iItemPos];
+
+    *_piItemDataset = H5Rdereference(_iDatasetId, H5R_OBJECT, &poRef);
+
+    if (*_piItemDataset == 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+int deleteListItemReferences_v1(int _iDatasetId, void *_piItemRef)
+{
+    herr_t status;
+
+    if (_piItemRef)
+    {
+        hobj_ref_t *poRef = (hobj_ref_t *) _piItemRef;
+
+        FREE(poRef);
+    }
+
+    status = H5Dclose(_iDatasetId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
index 6991ebe..ff7daea 100644 (file)
@@ -1,6 +1,6 @@
 /*
 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-*  Copyright (C) 2009-2009 - DIGITEO - Bruno JOFRET
+*  Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
 *
 *  This file must be used under the terms of the CeCILL.
 *  This source file is licensed as described in the file COPYING, which
 #include <MALLOC.h>
 #include <math.h>
 #include <string.h>
+#include <stdlib.h>
 #include "sci_types.h"
 #include "version.h"
 #include "core_math.h"
 #include "h5_writeDataToFile.h"
 #include "h5_readDataFromFile.h"
 #include "h5_attributeConstants.h"
+#include "doublecomplex.h"
+#include "stack3.h"
 
 static hid_t enableCompression(int _iLevel, int _iRank, const hsize_t * _piDims)
 {
@@ -80,6 +83,21 @@ static hid_t enableCompression(int _iLevel, int _iRank, const hsize_t * _piDims)
     */
 }
 
+static hsize_t* convertDims(int _iDims, int* _piDims, int* _piSize)
+{
+    int iSize = 1;
+    int i = 0;
+    hsize_t* piDims = (hsize_t*)malloc(sizeof(hsize_t) * _iDims);
+    for(i = 0 ; i < _iDims ; i++)
+    {//reverse dimensions to improve rendering in external tools
+        piDims[i] = _piDims[_iDims - 1 - i];
+        iSize *= (int)piDims[i];
+    }
+
+    *_piSize = iSize;
+    return piDims;
+}
+
 static herr_t addIntAttribute(int _iDatasetId, const char *_pstName, const int _iVal)
 {
     hsize_t attributeDims[1] = { 1 };
@@ -213,137 +231,51 @@ int updateFileVersion(int _iFile)
     return addIntAttribute(_iFile, g_SCILAB_CLASS_SOD_VERSION, SOD_FILE_VERSION);
 }
 
-int writeStringMatrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols, char **data)
+int writeStringMatrix(int _iFile, char *_pstDatasetName, int _iDims, int* _piDims, char **data)
 {
-    int i;
-    hsize_t dims[1] = { _iRows * _iCols };
-    hsize_t subdims[1] = { 1 };
-    hid_t typeId, space, dset, memspace;
+    int iSize = 0;
+    hsize_t* piDims = NULL;
+    hid_t typeId, space, dset;
     herr_t status;
     hid_t iCompress;
-    size_t iMaxLen = 0;
-    char *pstDataTemp = NULL;
-
-    for (i = 0; i < _iRows * _iCols; i++)
-    {
-        iMaxLen = Max(iMaxLen, strlen(data[i]));
-    }
 
+    piDims = convertDims(_iDims, _piDims, &iSize);
     //Create string dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
-    space = H5Screate_simple(1, dims, NULL);
+    space = H5Screate_simple(_iDims, piDims, NULL);
     if (space < 0)
     {
+        FREE(piDims);
         return -1;
     }
 
     //Create special string type
     typeId = H5Tcopy(H5T_C_S1);
-
-    /* Bug 6474 */
-    /* we allocate datas in fixed length string */
-    /* workaround for memcpy in hdf5 with wrong size */
-    pstDataTemp = MALLOC(sizeof(char) * (iMaxLen + 1));
-
-    if (iMaxLen > 0)
+    status = H5Tset_size(typeId, H5T_VARIABLE);
+    if (status < 0)
     {
-        status = H5Tset_size(typeId, iMaxLen);
-        if (status < 0)
-        {
-            FREE(pstDataTemp);
-            return -1;
-        }
+        FREE(piDims);
+        return -1;
     }
 
     //Create the data set and write it.
-    iCompress = enableCompression(9, 1, dims);
+    iCompress = enableCompression(9, _iDims, piDims);
+    FREE(piDims);
     dset = H5Dcreate(_iFile, _pstDatasetName, typeId, space, iCompress);
     if (dset < 0)
     {
-        FREE(pstDataTemp);
         return -1;
     }
 
-    status = H5Sclose(space);
+    status = H5Dwrite(dset, typeId, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
     if (status < 0)
     {
-        FREE(pstDataTemp);
         return -1;
     }
 
-    for (i = 0; i < _iRows * _iCols; i++)
-    {
-        hssize_t start[1] = { i };
-        hsize_t count[1] = { 1 };
-
-        strcpy(pstDataTemp, data[i]);
-
-        space = H5Dget_space(dset);
-        if (space < 0)
-        {
-            FREE(pstDataTemp);
-            return -1;
-        }
-
-        status = H5Sselect_hyperslab(space, H5S_SELECT_SET, start, NULL, count, NULL);
-        if (status < 0)
-        {
-            FREE(pstDataTemp);
-            return -1;
-        }
-
-        /*create sub space */
-        memspace = H5Screate_simple(1, subdims, NULL);
-        if (memspace < 0)
-        {
-            FREE(pstDataTemp);
-            return -1;
-        }
-
-        status = H5Dwrite(dset, typeId, memspace, space, H5P_DEFAULT, pstDataTemp);
-
-        if (status < 0)
-        {
-            FREE(pstDataTemp);
-            return -1;
-        }
-
-        status = H5Sclose(space);
-        if (status < 0)
-        {
-            FREE(pstDataTemp);
-            return -1;
-        }
-
-        status = H5Sclose(memspace);
-        if (status < 0)
-        {
-            FREE(pstDataTemp);
-            return -1;
-        }
-
-    }
-
     //Add attribute SCILAB_Class = string to dataset
     status = addAttribute(dset, g_SCILAB_CLASS, g_SCILAB_CLASS_STRING);
     if (status < 0)
     {
-        FREE(pstDataTemp);
-        return -1;
-    }
-
-    //Add attribute SCILAB_rows = _iRows
-    status = addIntAttribute(dset, g_SCILAB_CLASS_ROWS, _iRows);
-    if (status < 0)
-    {
-        FREE(pstDataTemp);
-        return -1;
-    }
-
-    //Add attribute SCILAB_cols = _iCols
-    status = addIntAttribute(dset, g_SCILAB_CLASS_COLS, _iCols);
-    if (status < 0)
-    {
-        FREE(pstDataTemp);
         return -1;
     }
 
@@ -351,19 +283,15 @@ int writeStringMatrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols,
     status = H5Dclose(dset);
     if (status < 0)
     {
-        FREE(pstDataTemp);
         return -1;
     }
 
     status = H5Tclose(typeId);
     if (status < 0)
     {
-        FREE(pstDataTemp);
         return -1;
     }
 
-    FREE(pstDataTemp);
-
     return 0;
 }
 
@@ -642,61 +570,37 @@ static hobj_ref_t writeCommomDoubleMatrix(int _iFile, char *_pstGroupName, char
     return iRef;
 }
 
-int writeDoubleMatrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols, double *_pdblData)
+int writeDoubleMatrix(int _iFile, char *_pstDatasetName, int _iDims, int* _piDims, double *_pdblData)
 {
     hid_t space = 0;
     hid_t dset = 0;
     herr_t status = 0;
-    hsize_t dims[1] = { 1 };
+    hsize_t *piDims = NULL;
     hid_t iCompress = 0;
-    hobj_ref_t pRef[1] = { 0 };
-
-    hid_t group = 0;
-    char *pstGroupName = NULL;
-
-    pstGroupName = createGroupName(_pstDatasetName);
-
-    //create sub group only for non empty matrix
-    if (_iRows * _iCols != 0)
-    {
-        group = H5Gcreate(_iFile, pstGroupName, H5P_DEFAULT);
-        status = H5Gclose(group);
-        if (status < 0)
-        {
-            FREE(pstGroupName);
-            return -1;
-        }
-    }
-
-    pRef[0] = writeCommomDoubleMatrix(_iFile, pstGroupName, _pstDatasetName, 0, _iRows, _iCols, _pdblData);
-
-    //don't create reference for empty matrix
-    if (_iRows * _iCols == 0)
-    {
-        return 0;
-    }
+    int i = 0;
+    int iSize = 0;
 
-    if (pRef[0] == 0)
-    {
-        return -1;
-    }
+    piDims = convertDims(_iDims, _piDims, &iSize);
 
     //Create dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
-    space = H5Screate_simple(1, dims, NULL);
+    space = H5Screate_simple(_iDims, piDims, NULL);
     if (space < 0)
     {
+        free(piDims);
         return -1;
     }
 
     //Create the dataset and write the array data to it.
-    iCompress = enableCompression(9, 1, dims);
-    dset = H5Dcreate(_iFile, _pstDatasetName, H5T_STD_REF_OBJ, space, iCompress);
+    iCompress = enableCompression(9, _iDims, piDims);
+    free(piDims);
+
+    dset = H5Dcreate(_iFile, _pstDatasetName, H5T_NATIVE_DOUBLE, space, iCompress);
     if (dset < 0)
     {
         return -1;
     }
 
-    status = H5Dwrite(dset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pRef);
+    status = H5Dwrite(dset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, _pdblData);
     if (status < 0)
     {
         return -1;
@@ -709,20 +613,6 @@ int writeDoubleMatrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols,
         return -1;
     }
 
-    //Add attribute SCILAB_Class_rows = double to dataset
-    status = addIntAttribute(dset, g_SCILAB_CLASS_ROWS, _iRows);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    //Add attribute SCILAB_Class_cols = double to dataset
-    status = addIntAttribute(dset, g_SCILAB_CLASS_COLS, _iCols);
-    if (status < 0)
-    {
-        return -1;
-    }
-
     //Close and release resources.
     status = H5Dclose(dset);
     if (status < 0)
@@ -736,59 +626,56 @@ int writeDoubleMatrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols,
         return -1;
     }
 
-    FREE(pstGroupName);
     return status;
 }
 
-int writeDoubleComplexMatrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols, double *_pdblReal, double *_pdblImg)
+int writeDoubleComplexMatrix(int _iFile, char *_pstDatasetName, int _iDims, int* _piDims, double *_pdblReal, double *_pdblImg)
 {
     hid_t space = 0;
     hid_t dset = 0;
     herr_t status = 0;
+    hsize_t *piDims = NULL;
     hid_t iCompress = 0;
-    hsize_t dims[1] = { 2 };
-    hobj_ref_t pRef[2] = { 0 };
+    hid_t compoundId;
+    int iSize = 1;
+    doublecomplex* pData = NULL;
 
-    hid_t group = 0;
-    char *pstGroupName = NULL;
-
-    pstGroupName = createGroupName(_pstDatasetName);
-    group = H5Gcreate(_iFile, pstGroupName, H5P_DEFAULT);
-    status = H5Gclose(group);
-
-    if (status < 0)
-    {
-        FREE(pstGroupName);
+    //create sub group only for non empty matrix
+    if (_iDims == 2 && _piDims[0] == 0 && _piDims[1] == 0)
+    {// [] complex
+        //a revoir
         return -1;
     }
 
-    pRef[0] = writeCommomDoubleMatrix(_iFile, pstGroupName, _pstDatasetName, 0, _iRows, _iCols, _pdblReal);
-    pRef[1] = writeCommomDoubleMatrix(_iFile, pstGroupName, _pstDatasetName, 1, _iRows, _iCols, _pdblImg);
-    FREE(pstGroupName);
-    if (pRef[0] == 0 || pRef[1] == 0)
-    {
-        return 1;
-    }
+    compoundId = H5Tcreate (H5T_COMPOUND, sizeof(doublecomplex));
+    H5Tinsert(compoundId, "real", HOFFSET(doublecomplex, r), H5T_NATIVE_DOUBLE);
+    H5Tinsert(compoundId, "imag", HOFFSET(doublecomplex, i), H5T_NATIVE_DOUBLE);
+    piDims = convertDims(_iDims, _piDims, &iSize);
 
     //Create dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
-    space = H5Screate_simple(1, dims, NULL);
+    space = H5Screate_simple(_iDims, piDims, NULL);
     if (space < 0)
     {
+        free(piDims);
         return -1;
     }
 
     //Create the dataset and write the array data to it.
-    iCompress = enableCompression(9, 1, dims);
-    dset = H5Dcreate(_iFile, _pstDatasetName, H5T_STD_REF_OBJ, space, iCompress);
+    iCompress = enableCompression(9, _iDims, piDims);
+    free(piDims);
+
+    dset = H5Dcreate(_iFile, _pstDatasetName, compoundId, space, iCompress);
     if (dset < 0)
     {
-        printf("\nH5Dcreate\n");
         return -1;
     }
-    status = H5Dwrite(dset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, pRef);
+
+    //convert double data doublecomplex data
+    pData = oGetDoubleComplexFromPointer(_pdblReal, _pdblImg, iSize);
+    status = H5Dwrite(dset, compoundId, H5S_ALL, H5S_ALL, H5P_DEFAULT, pData);
+    FREE(pData);
     if (status < 0)
     {
-        printf("\nH5Dwrite\n");
         return -1;
     }
 
@@ -799,26 +686,6 @@ int writeDoubleComplexMatrix(int _iFile, char *_pstDatasetName, int _iRows, int
         return -1;
     }
 
-    //Add attribute SCILAB_Class_rows = double to dataset
-    status = addIntAttribute(dset, g_SCILAB_CLASS_ROWS, _iRows);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    //Add attribute SCILAB_Class_cols = double to dataset
-    status = addIntAttribute(dset, g_SCILAB_CLASS_COLS, _iCols);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    status = addAttribute(dset, g_SCILAB_CLASS_COMPLEX, "true");
-    if (status < 0)
-    {
-        return -1;
-    }
-
     //Close and release resources.
     status = H5Dclose(dset);
     if (status < 0)
@@ -832,26 +699,29 @@ int writeDoubleComplexMatrix(int _iFile, char *_pstDatasetName, int _iRows, int
         return -1;
     }
 
-    return 0;
+    return status;
 }
 
-int writeBooleanMatrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols, int *_piData)
+int writeBooleanMatrix(int _iFile, char *_pstDatasetName, int _iDims, int* _piDims, int *_piData)
 {
-    hsize_t piDims[1] = { _iRows * _iCols };
+    int iSize = 0;
+    hsize_t* piDims = NULL;
     herr_t status;
     hid_t iSpace;
     hid_t iCompress;
     hid_t iDataset;
 
+    piDims = convertDims(_iDims, _piDims, &iSize);
+
     //Create dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
-    iSpace = H5Screate_simple(1, piDims, NULL);
+    iSpace = H5Screate_simple(_iDims, piDims, NULL);
     if (iSpace < 0)
     {
         return -1;
     }
 
     //Create the dataset and write the array data to it.
-    iCompress = enableCompression(9, 1, piDims);
+    iCompress = enableCompression(9, _iDims, piDims);
     iDataset = H5Dcreate(_iFile, _pstDatasetName, H5T_NATIVE_INT, iSpace, iCompress);
     if (iDataset < 0)
     {
@@ -871,20 +741,6 @@ int writeBooleanMatrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols
         return -1;
     }
 
-    //Add attribute SCILAB_Class_rows = double to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_ROWS, _iRows);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    //Add attribute SCILAB_Class_cols = double to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_COLS, _iCols);
-    if (status < 0)
-    {
-        return -1;
-    }
-
     //Close and release resources.
     status = H5Dclose(iDataset);
     if (status < 0)
@@ -901,23 +757,24 @@ int writeBooleanMatrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols
     return 0;
 }
 
-static int writeCommonPolyMatrix(int _iFile, char *_pstDatasetName, char *_pstVarName, int _iComplex, int _iRows, int _iCols, int *_piNbCoef,
-                                 double **_pdblReal, double **_pdblImg)
+static int writeCommonPolyMatrix(int _iFile, char *_pstDatasetName, char *_pstVarName, int _iComplex, int _iDims, int* _piDims, int *_piNbCoef, double **_pdblReal, double **_pdblImg)
 {
     int i = 0;
-    hsize_t dims[1] = { _iRows * _iCols };
+    hsize_t* piDims = NULL;
     herr_t status = 0;
     hid_t space = 0;
     hid_t dset = 0;
     hid_t group = 0;
     hid_t iCompress = 0;
     hobj_ref_t *pData = 0;
+    int iSize = 0;
 
     char *pstPathName = NULL;
     char *pstGroupName = NULL;
 
+    piDims = convertDims(_iDims, _piDims, &iSize);
     // Create ref matrix
-    pData = (hobj_ref_t *)MALLOC(dims[0] * sizeof(hobj_ref_t));
+    pData = (hobj_ref_t *)MALLOC(iSize * sizeof(hobj_ref_t));
 
     // Generate groupname #<dataSetName>#
     pstGroupName = createGroupName(_pstDatasetName);
@@ -927,18 +784,18 @@ static int writeCommonPolyMatrix(int _iFile, char *_pstDatasetName, char *_pstVa
     status = H5Gclose(group);
 
     //Now create each String as a dedicated DataSet.
-    for (i = 0 ; i < dims[0] ; i++)
+    for (i = 0 ; i < iSize ; i++)
     {
         pstPathName = createPathName(pstGroupName, i);
 
         // Write the string to ref
         if (_iComplex)
         {
-            status = writeDoubleComplexMatrix(_iFile, pstPathName, 1, _piNbCoef[i], _pdblReal[i], _pdblImg[i]);
+            status = writeDoubleComplexMatrix(_iFile, pstPathName, 1, &_piNbCoef[i], _pdblReal[i], _pdblImg[i]);
         }
         else
         {
-            status = writeDoubleMatrix(_iFile, pstPathName, 1, _piNbCoef[i], _pdblReal[i]);
+            status = writeDoubleMatrix(_iFile, pstPathName, 1, &_piNbCoef[i], _pdblReal[i]);
         }
 
         if (status < 0)
@@ -946,7 +803,8 @@ static int writeCommonPolyMatrix(int _iFile, char *_pstDatasetName, char *_pstVa
             FREE(pstPathName);
             FREE(pstGroupName);
             FREE(pData);
-            return -1;
+            FREE(piDims);
+           return -1;
         }
 
         // create the ref
@@ -956,6 +814,7 @@ static int writeCommonPolyMatrix(int _iFile, char *_pstDatasetName, char *_pstVa
             FREE(pstPathName);
             FREE(pstGroupName);
             FREE(pData);
+            FREE(piDims);
             return -1;
         }
 
@@ -964,15 +823,17 @@ static int writeCommonPolyMatrix(int _iFile, char *_pstDatasetName, char *_pstVa
 
     FREE(pstGroupName);
     //Create dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
-    space = H5Screate_simple(1, dims, NULL);
+    space = H5Screate_simple(_iDims, piDims, NULL);
     if (status < 0)
     {
+        FREE(piDims);
         FREE(pData);
         return -1;
     }
 
     //Create the dataset and write the array data to it.
-    iCompress = enableCompression(9, 1, dims);
+    iCompress = enableCompression(9, _iDims, piDims);
+    FREE(piDims);
     dset = H5Dcreate(_iFile, _pstDatasetName, H5T_STD_REF_OBJ, space, iCompress);
     if (dset < 0)
     {
@@ -1012,20 +873,6 @@ static int writeCommonPolyMatrix(int _iFile, char *_pstDatasetName, char *_pstVa
         }
     }
 
-    //Add attribute SCILAB_Class_rows = double to dataset
-    status = addIntAttribute(dset, g_SCILAB_CLASS_ROWS, _iRows);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    //Add attribute SCILAB_Class_cols = double to dataset
-    status = addIntAttribute(dset, g_SCILAB_CLASS_COLS, _iCols);
-    if (status < 0)
-    {
-        return -1;
-    }
-
     //Close and release resources.
     status = H5Dclose(dset);
     if (status < 0)
@@ -1042,33 +889,38 @@ static int writeCommonPolyMatrix(int _iFile, char *_pstDatasetName, char *_pstVa
     return 0;
 }
 
-int writePolyMatrix(int _iFile, char *_pstDatasetName, char *_pstVarName, int _iRows, int _iCols, int *_piNbCoef, double **_pdblReal)
+int writePolyMatrix(int _iFile, char *_pstDatasetName, char *_pstVarName, int _iDims, int* _piDims, int *_piNbCoef, double **_pdblReal)
 {
-    return writeCommonPolyMatrix(_iFile, _pstDatasetName, _pstVarName, 0, _iRows, _iCols, _piNbCoef, _pdblReal, NULL);
+    return writeCommonPolyMatrix(_iFile, _pstDatasetName, _pstVarName, 0, _iDims, _piDims, _piNbCoef, _pdblReal, NULL);
 }
 
-int writePolyComplexMatrix(int _iFile, char *_pstDatasetName, char *_pstVarName, int _iRows, int _iCols, int *_piNbCoef, double **_pdblReal,
+int writePolyComplexMatrix(int _iFile, char *_pstDatasetName, char *_pstVarName, int _iDims, int* _piDims, int *_piNbCoef, double **_pdblReal,
                            double **_pdblImg)
 {
-    return writeCommonPolyMatrix(_iFile, _pstDatasetName, _pstVarName, 1, _iRows, _iCols, _piNbCoef, _pdblReal, _pdblImg);
+    return writeCommonPolyMatrix(_iFile, _pstDatasetName, _pstVarName, 1, _iDims, _piDims, _piNbCoef, _pdblReal, _pdblImg);
 }
 
-int writeInteger8Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols, char *_pcData)
+int writeInteger8Matrix(int _iFile, char *_pstDatasetName, int _iDims, int* _piDims, char *_pcData)
 {
-    hsize_t piDims[1] = { _iRows * _iCols };
+    hsize_t* piDims = NULL;
     herr_t status = 0;
     hid_t iSpace = 0;
     hid_t iDataset = 0;
     hid_t iCompress = 0;
+    int iSize = 0;
+
+    piDims = convertDims(_iDims, _piDims, &iSize);
 
     //Create dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
-    iSpace = H5Screate_simple(1, piDims, NULL);
+    iSpace = H5Screate_simple(_iDims, piDims, NULL);
     if (iSpace < 0)
     {
+        FREE(piDims);
         return -1;
     }
     //Create the dataset and write the array data to it.
-    iCompress = enableCompression(9, 1, piDims);
+    iCompress = enableCompression(9, _iDims, piDims);
+    FREE(piDims);
     iDataset = H5Dcreate(_iFile, _pstDatasetName, H5T_NATIVE_INT8, iSpace, iCompress);
     if (iDataset < 0)
     {
@@ -1094,20 +946,6 @@ int writeInteger8Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCol
         return -1;
     }
 
-    //Add attribute SCILAB_Class_rows to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_ROWS, _iRows);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    //Add attribute SCILAB_Class_cols to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_COLS, _iCols);
-    if (status < 0)
-    {
-        return -1;
-    }
-
     //Close and release resources.
     status = H5Dclose(iDataset);
     if (status < 0)
@@ -1124,22 +962,27 @@ int writeInteger8Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCol
     return 0;
 }
 
-int writeInteger16Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols, short *_psData)
+int writeInteger16Matrix(int _iFile, char *_pstDatasetName, int _iDims, int* _piDims, short *_psData)
 {
-    hsize_t piDims[1] = { _iRows * _iCols };
+    hsize_t* piDims = NULL;
     herr_t status = 0;
     hid_t iSpace = 0;
     hid_t iDataset = 0;
     hid_t iCompress = 0;
+    int iSize = 0;
+
+    piDims = convertDims(_iDims, _piDims, &iSize);
 
     //Create dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
-    iSpace = H5Screate_simple(1, piDims, NULL);
+    iSpace = H5Screate_simple(_iDims, piDims, NULL);
     if (iSpace < 0)
     {
+        FREE(piDims);
         return -1;
     }
     //Create the dataset and write the array data to it.
-    iCompress = enableCompression(9, 1, piDims);
+    iCompress = enableCompression(9, _iDims, piDims);
+    FREE(piDims);
     iDataset = H5Dcreate(_iFile, _pstDatasetName, H5T_NATIVE_INT16, iSpace, iCompress);
     if (iDataset < 0)
     {
@@ -1164,20 +1007,6 @@ int writeInteger16Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCo
         return -1;
     }
 
-    //Add attribute SCILAB_Class_rows to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_ROWS, _iRows);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    //Add attribute SCILAB_Class_cols to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_COLS, _iCols);
-    if (status < 0)
-    {
-        return -1;
-    }
-
     //Close and release resources.
     status = H5Dclose(iDataset);
     if (status < 0)
@@ -1194,23 +1023,27 @@ int writeInteger16Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCo
     return 0;
 }
 
-int writeInteger32Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols, int *_piData)
+int writeInteger32Matrix(int _iFile, char *_pstDatasetName, int _iDims, int* _piDims, int *_piData)
 {
-    hsize_t piDims[1] = { _iRows * _iCols };
+    hsize_t* piDims = NULL;
     herr_t status = 0;
     hid_t iSpace = 0;
     hid_t iDataset = 0;
     hid_t iCompress = 0;
+    int iSize = 0;
+
+    piDims = convertDims(_iDims, _piDims, &iSize);
 
     //Create dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
-    iSpace = H5Screate_simple(1, piDims, NULL);
+    iSpace = H5Screate_simple(_iDims, piDims, NULL);
     if (iSpace < 0)
     {
+        FREE(piDims);
         return -1;
     }
-
     //Create the dataset and write the array data to it.
-    iCompress = enableCompression(9, 1, piDims);
+    iCompress = enableCompression(9, _iDims, piDims);
+    FREE(piDims);
     iDataset = H5Dcreate(_iFile, _pstDatasetName, H5T_NATIVE_INT32, iSpace, iCompress);
     if (iDataset < 0)
     {
@@ -1236,20 +1069,6 @@ int writeInteger32Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCo
         return -1;
     }
 
-    //Add attribute SCILAB_Class_rows to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_ROWS, _iRows);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    //Add attribute SCILAB_Class_cols to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_COLS, _iCols);
-    if (status < 0)
-    {
-        return -1;
-    }
-
     //Close and release resources.
     status = H5Dclose(iDataset);
     if (status < 0)
@@ -1266,23 +1085,27 @@ int writeInteger32Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCo
     return 0;
 }
 
-int writeInteger64Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols, long long *_pllData)
+int writeInteger64Matrix(int _iFile, char *_pstDatasetName, int _iDims, int* _piDims, long long *_pllData)
 {
-    hsize_t piDims[1] = { _iRows * _iCols };
+    hsize_t* piDims = NULL;
     herr_t status = 0;
     hid_t iSpace = 0;
     hid_t iDataset = 0;
     hid_t iCompress = 0;
+    int iSize = 0;
+
+    piDims = convertDims(_iDims, _piDims, &iSize);
 
     //Create dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
-    iSpace = H5Screate_simple(1, piDims, NULL);
+    iSpace = H5Screate_simple(_iDims, piDims, NULL);
     if (iSpace < 0)
     {
+        FREE(piDims);
         return -1;
     }
-
     //Create the dataset and write the array data to it.
-    iCompress = enableCompression(9, 1, piDims);
+    iCompress = enableCompression(9, _iDims, piDims);
+    FREE(piDims);
     iDataset = H5Dcreate(_iFile, _pstDatasetName, H5T_NATIVE_INT64, iSpace, iCompress);
     if (iDataset < 0)
     {
@@ -1308,20 +1131,6 @@ int writeInteger64Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCo
         return -1;
     }
 
-    //Add attribute SCILAB_Class_rows to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_ROWS, _iRows);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    //Add attribute SCILAB_Class_cols to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_COLS, _iCols);
-    if (status < 0)
-    {
-        return -1;
-    }
-
     //Close and release resources.
     status = H5Dclose(iDataset);
     if (status < 0)
@@ -1338,23 +1147,27 @@ int writeInteger64Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCo
     return 0;
 }
 
-HDF5_SCILAB_IMPEXP int writeUnsignedInteger8Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols, unsigned char *_pucData)
+int writeUnsignedInteger8Matrix(int _iFile, char *_pstDatasetName, int _iDims, int* _piDims, unsigned char *_pucData)
 {
-    hsize_t piDims[1] = { _iRows * _iCols };
+    hsize_t* piDims = NULL;
     herr_t status = 0;
     hid_t iSpace = 0;
     hid_t iDataset = 0;
     hid_t iCompress = 0;
+    int iSize = 0;
+
+    piDims = convertDims(_iDims, _piDims, &iSize);
 
     //Create dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
-    iSpace = H5Screate_simple(1, piDims, NULL);
+    iSpace = H5Screate_simple(_iDims, piDims, NULL);
     if (iSpace < 0)
     {
+        FREE(piDims);
         return -1;
     }
-
     //Create the dataset and write the array data to it.
-    iCompress = enableCompression(9, 1, piDims);
+    iCompress = enableCompression(9, _iDims, piDims);
+    FREE(piDims);
     iDataset = H5Dcreate(_iFile, _pstDatasetName, H5T_NATIVE_UINT8, iSpace, iCompress);
     if (iDataset < 0)
     {
@@ -1380,20 +1193,6 @@ HDF5_SCILAB_IMPEXP int writeUnsignedInteger8Matrix(int _iFile, char *_pstDataset
         return -1;
     }
 
-    //Add attribute SCILAB_Class_rows to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_ROWS, _iRows);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    //Add attribute SCILAB_Class_cols to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_COLS, _iCols);
-    if (status < 0)
-    {
-        return -1;
-    }
-
     //Close and release resources.
     status = H5Dclose(iDataset);
     if (status < 0)
@@ -1410,23 +1209,27 @@ HDF5_SCILAB_IMPEXP int writeUnsignedInteger8Matrix(int _iFile, char *_pstDataset
     return 0;
 }
 
-HDF5_SCILAB_IMPEXP int writeUnsignedInteger16Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols, unsigned short *_pusData)
+int writeUnsignedInteger16Matrix(int _iFile, char *_pstDatasetName, int _iDims, int* _piDims, unsigned short *_pusData)
 {
-    hsize_t piDims[1] = { _iRows * _iCols };
+    hsize_t* piDims = NULL;
     herr_t status = 0;
     hid_t iSpace = 0;
     hid_t iDataset = 0;
     hid_t iCompress = 0;
+    int iSize = 0;
+
+    piDims = convertDims(_iDims, _piDims, &iSize);
 
     //Create dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
-    iSpace = H5Screate_simple(1, piDims, NULL);
+    iSpace = H5Screate_simple(_iDims, piDims, NULL);
     if (iSpace < 0)
     {
+        FREE(piDims);
         return -1;
     }
-
     //Create the dataset and write the array data to it.
-    iCompress = enableCompression(9, 1, piDims);
+    iCompress = enableCompression(9, _iDims, piDims);
+    FREE(piDims);
     iDataset = H5Dcreate(_iFile, _pstDatasetName, H5T_NATIVE_UINT16, iSpace, iCompress);
     if (iDataset < 0)
     {
@@ -1452,20 +1255,6 @@ HDF5_SCILAB_IMPEXP int writeUnsignedInteger16Matrix(int _iFile, char *_pstDatase
         return -1;
     }
 
-    //Add attribute SCILAB_Class_rows to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_ROWS, _iRows);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    //Add attribute SCILAB_Class_cols to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_COLS, _iCols);
-    if (status < 0)
-    {
-        return -1;
-    }
-
     //Close and release resources.
     status = H5Dclose(iDataset);
     if (status < 0)
@@ -1482,23 +1271,27 @@ HDF5_SCILAB_IMPEXP int writeUnsignedInteger16Matrix(int _iFile, char *_pstDatase
     return 0;
 }
 
-HDF5_SCILAB_IMPEXP int writeUnsignedInteger32Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols, unsigned int *_puiData)
+int writeUnsignedInteger32Matrix(int _iFile, char *_pstDatasetName, int _iDims, int* _piDims, unsigned int *_puiData)
 {
-    hsize_t piDims[1] = { _iRows * _iCols };
+    hsize_t* piDims = NULL;
     herr_t status = 0;
     hid_t iSpace = 0;
     hid_t iDataset = 0;
     hid_t iCompress = 0;
+    int iSize = 0;
+
+    piDims = convertDims(_iDims, _piDims, &iSize);
 
     //Create dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
-    iSpace = H5Screate_simple(1, piDims, NULL);
+    iSpace = H5Screate_simple(_iDims, piDims, NULL);
     if (iSpace < 0)
     {
+        FREE(piDims);
         return -1;
     }
-
     //Create the dataset and write the array data to it.
-    iCompress = enableCompression(9, 1, piDims);
+    iCompress = enableCompression(9, _iDims, piDims);
+    FREE(piDims);
     iDataset = H5Dcreate(_iFile, _pstDatasetName, H5T_NATIVE_UINT32, iSpace, iCompress);
     if (iDataset < 0)
     {
@@ -1524,20 +1317,6 @@ HDF5_SCILAB_IMPEXP int writeUnsignedInteger32Matrix(int _iFile, char *_pstDatase
         return -1;
     }
 
-    //Add attribute SCILAB_Class_rows to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_ROWS, _iRows);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    //Add attribute SCILAB_Class_cols to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_COLS, _iCols);
-    if (status < 0)
-    {
-        return -1;
-    }
-
     //Close and release resources.
     status = H5Dclose(iDataset);
     if (status < 0)
@@ -1554,23 +1333,27 @@ HDF5_SCILAB_IMPEXP int writeUnsignedInteger32Matrix(int _iFile, char *_pstDatase
     return 0;
 }
 
-HDF5_SCILAB_IMPEXP int writeUnsignedInteger64Matrix(int _iFile, char *_pstDatasetName, int _iRows, int _iCols, unsigned long long *_pullData)
+int writeUnsignedInteger64Matrix(int _iFile, char *_pstDatasetName, int _iDims, int* _piDims, unsigned long long *_pullData)
 {
-    hsize_t piDims[1] = { _iRows * _iCols };
+    hsize_t* piDims = NULL;
     herr_t status = 0;
     hid_t iSpace = 0;
     hid_t iDataset = 0;
     hid_t iCompress = 0;
+    int iSize = 0;
+
+    piDims = convertDims(_iDims, _piDims, &iSize);
 
     //Create dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
-    iSpace = H5Screate_simple(1, piDims, NULL);
+    iSpace = H5Screate_simple(_iDims, piDims, NULL);
     if (iSpace < 0)
     {
+        FREE(piDims);
         return -1;
     }
-
     //Create the dataset and write the array data to it.
-    iCompress = enableCompression(9, 1, piDims);
+    iCompress = enableCompression(9, _iDims, piDims);
+    FREE(piDims);
     iDataset = H5Dcreate(_iFile, _pstDatasetName, H5T_NATIVE_UINT64, iSpace, iCompress);
     if (iDataset < 0)
     {
@@ -1596,20 +1379,6 @@ HDF5_SCILAB_IMPEXP int writeUnsignedInteger64Matrix(int _iFile, char *_pstDatase
         return -1;
     }
 
-    //Add attribute SCILAB_Class_rows to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_ROWS, _iRows);
-    if (status < 0)
-    {
-        return -1;
-    }
-
-    //Add attribute SCILAB_Class_cols to dataset
-    status = addIntAttribute(iDataset, g_SCILAB_CLASS_COLS, _iCols);
-    if (status < 0)
-    {
-        return -1;
-    }
-
     //Close and release resources.
     status = H5Dclose(iDataset);
     if (status < 0)
@@ -1656,7 +1425,7 @@ int writeCommonSparseComplexMatrix(int _iFile, char *_pstDatasetName, int _iComp
 
     //Create each sub dataset and insert data
     pstRowPath = createPathName(pstGroupName, 0);
-    status = writeInteger32Matrix(_iFile, pstRowPath, 1, _iRows, _piNbItemRow);
+    status = writeInteger32Matrix(_iFile, pstRowPath, 1, &_iRows, _piNbItemRow);
     if (status < 0)
     {
         FREE(pstRowPath);
@@ -1673,7 +1442,7 @@ int writeCommonSparseComplexMatrix(int _iFile, char *_pstDatasetName, int _iComp
     }
 
     pstColPath = createPathName(pstGroupName, 1);
-    status = writeInteger32Matrix(_iFile, pstColPath, 1, _iNbItem, _piColPos);
+    status = writeInteger32Matrix(_iFile, pstColPath, 1, &_iNbItem, _piColPos);
     if (status < 0)
     {
         FREE(pstRowPath);
@@ -1694,11 +1463,11 @@ int writeCommonSparseComplexMatrix(int _iFile, char *_pstDatasetName, int _iComp
     pstDataPath = createPathName(pstGroupName, 2);
     if (_iComplex)
     {
-        status = writeDoubleComplexMatrix(_iFile, pstDataPath, 1, _iNbItem, _pdblReal, _pdblImg);
+        status = writeDoubleComplexMatrix(_iFile, pstDataPath, 1, &_iNbItem, _pdblReal, _pdblImg);
     }
     else
     {
-        status = writeDoubleMatrix(_iFile, pstDataPath, 1, _iNbItem, _pdblReal);
+        status = writeDoubleMatrix(_iFile, pstDataPath, 1, &_iNbItem, _pdblReal);
     }
 
     if (status < 0)
@@ -1772,6 +1541,7 @@ int writeCommonSparseComplexMatrix(int _iFile, char *_pstDatasetName, int _iComp
     {
         return -1;
     }
+
     if (_iComplex)
     {
         //Add attribute Varname attribute to dataset
@@ -1837,7 +1607,7 @@ int writeBooleanSparseMatrix(int _iFile, char *_pstDatasetName, int _iRows, int
 
     //Create each sub dataset and insert data
     pstRowPath = createPathName(pstGroupName, 0);
-    status = writeInteger32Matrix(_iFile, pstRowPath, 1, _iRows, _piNbItemRow);
+    status = writeInteger32Matrix(_iFile, pstRowPath, 1, &_iRows, _piNbItemRow);
     if (status < 0)
     {
         FREE(pstRowPath);
@@ -1854,7 +1624,7 @@ int writeBooleanSparseMatrix(int _iFile, char *_pstDatasetName, int _iRows, int
     }
 
     pstColPath = createPathName(pstGroupName, 1);
-    status = writeInteger32Matrix(_iFile, pstColPath, 1, _iNbItem, _piColPos);
+    status = writeInteger32Matrix(_iFile, pstColPath, 1, &_iNbItem, _piColPos);
     if (status < 0)
     {
         FREE(pstRowPath);
index 0ae65c9..0725ff4 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|Win32">
   <ItemGroup>
     <ClCompile Include="..\..\sci_gateway\cpp\sci_is_hdf5_file.cpp" />
     <ClCompile Include="..\..\sci_gateway\cpp\sci_listvar_in_hdf5.cpp" />
+    <ClCompile Include="..\cpp\import_from_hdf5_v1.cpp" />
+    <ClCompile Include="..\cpp\listvar_in_hdf5_v1.cpp" />
     <ClCompile Include="DllmainHdf5.c" />
     <ClCompile Include="..\..\sci_gateway\c\gw_hdf5.c" />
     <ClCompile Include="h5_fileManagement.c" />
     <ClCompile Include="h5_readDataFromFile.c" />
+    <ClCompile Include="h5_readDataFromFile_v1.c" />
     <ClCompile Include="h5_writeDataToFile.c" />
     <ClCompile Include="..\..\sci_gateway\cpp\sci_export_to_hdf5.cpp" />
     <ClCompile Include="..\..\sci_gateway\cpp\sci_import_from_hdf5.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\includes\dynlib_hdf5_scilab.h" />
+    <ClInclude Include="..\..\includes\h5_readDataFromFile_v1.h" />
+    <ClInclude Include="..\..\includes\import_from_hdf5_v1.hxx" />
     <ClInclude Include="..\..\includes\gw_hdf5.h" />
     <ClInclude Include="..\..\includes\h5_attributeConstants.h" />
     <ClInclude Include="..\..\includes\h5_fileManagement.h" />
     <ClInclude Include="..\..\includes\h5_readDataFromFile.h" />
     <ClInclude Include="..\..\includes\h5_writeDataToFile.h" />
+    <ClInclude Include="..\..\includes\listvar_in_hdf5_v1.hxx" />
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\locales\hdf5.pot" />
index 404d320..84a06b1 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
     <Filter Include="Source Files">
     <ClCompile Include="..\..\sci_gateway\cpp\sci_is_hdf5_file.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="h5_readDataFromFile_v1.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\cpp\import_from_hdf5_v1.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\cpp\listvar_in_hdf5_v1.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\includes\dynlib_hdf5_scilab.h">
     <ClInclude Include="..\..\includes\h5_writeDataToFile.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\includes\h5_readDataFromFile_v1.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\includes\import_from_hdf5_v1.hxx">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\includes\listvar_in_hdf5_v1.hxx">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="core_import.def">
diff --git a/scilab/modules/hdf5/src/cpp/import_from_hdf5_v1.cpp b/scilab/modules/hdf5/src/cpp/import_from_hdf5_v1.cpp
new file mode 100644 (file)
index 0000000..7610462
--- /dev/null
@@ -0,0 +1,1160 @@
+/*
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+* Copyright (C) 2009 - DIGITEO - Antoine ELIAS
+*
+* This file must be used under the terms of the CeCILL.
+* This source file is licensed as described in the file COPYING, which
+* you should have received as part of this distribution.  The terms
+* are also available at
+* http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*
+*/
+
+extern "C"
+{
+#include <hdf5.h>
+#include <string.h>
+#include "gw_hdf5.h"
+#include "MALLOC.h"
+#include "Scierror.h"
+#include "localization.h"
+#include "sciprint.h"
+#include "api_scilab.h"
+#include "../../../call_scilab/includes/call_scilab.h"
+#include "h5_fileManagement.h"
+#include "h5_readDataFromFile_v1.h"
+#include "h5_attributeConstants.h"
+#include "intmacr2tree.h"
+#include "expandPathVariable.h"
+}
+
+//#define PRINT_DEBUG
+//#define TIME_DEBUG
+
+static int iTab = 0;
+static int iCloseList = 0;
+
+void print_tree_v1(char *_pstMsg);
+
+static bool import_variable_v1(int _iFile, char* _pstVarName);
+static bool import_data_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
+static bool import_double_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
+static bool import_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
+static bool import_boolean_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
+static bool import_integer_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
+static bool import_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
+static bool import_boolean_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
+static bool import_poly_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
+static bool import_list_v1(int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname);
+static bool import_void_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
+static bool import_undefined_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
+
+int sci_import_from_hdf5_v1(char *fname, unsigned long fname_len)
+{
+    SciErr sciErr;
+
+    int* piAddr = NULL;
+    char* pstFilename = NULL;
+    char* pstExpandedFilename = NULL;
+    bool bImport = true;
+
+    int iSelectedVar = Rhs - 1;
+
+    checkInputArgumentAtLeast(pvApiCtx, 1);
+    CheckLhs(1, 1);
+
+    iCloseList = 0;
+
+    sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 1;
+    }
+
+    if (getAllocatedSingleString(pvApiCtx, piAddr, &pstFilename))
+    {
+        Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 2);
+        return 1;
+    }
+
+    //open hdf5 file
+    pstExpandedFilename = expandPathVariable(pstFilename);
+    int iFile = openHDF5File(pstExpandedFilename);
+    if (iFile < 0)
+    {
+        FREE(pstExpandedFilename);
+        FREE(pstFilename);
+        Scierror(999, _("%s: Unable to open file: %s\n"), fname, pstFilename);
+        return 1;
+    }
+
+    FREE(pstExpandedFilename);
+    FREE(pstFilename);
+
+    if (iSelectedVar)
+    {
+        //selected variable
+        char* pstVarName = NULL;
+        for (int i = 0 ; i < iSelectedVar ; i++)
+        {
+            sciErr = getVarAddressFromPosition(pvApiCtx, i + 2, &piAddr);
+            if (sciErr.iErr)
+            {
+                printError(&sciErr, 0);
+                return 1;
+            }
+
+            if (getAllocatedSingleString(pvApiCtx, piAddr, &pstVarName))
+            {
+                Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, i + 1);
+                return 1;
+            }
+
+            if (import_variable_v1(iFile, pstVarName) == false)
+            {
+                bImport = false;
+                break;
+            }
+
+            FREE(pstVarName);
+        }
+    }
+    else
+    {
+        //all variables
+        int iNbItem = 0;
+        iNbItem = getVariableNames_v1(iFile, NULL);
+        if (iNbItem != 0)
+        {
+            char **pstVarNameList = (char **)MALLOC(sizeof(char *) * iNbItem);
+
+            iNbItem = getVariableNames_v1(iFile, pstVarNameList);
+
+            //import all data
+            for (int i = 0; i < iNbItem; i++)
+            {
+                if (import_variable_v1(iFile, pstVarNameList[i]) == false)
+                {
+                    bImport = false;
+                    break;
+                }
+            }
+        }
+    }
+    //close the file
+    closeHDF5File(iFile);
+
+    int *piReturn = NULL;
+
+    sciErr = allocMatrixOfBoolean(pvApiCtx, Rhs + 1, 1, 1, &piReturn);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 1;
+    }
+
+    if (bImport == true)
+    {
+        piReturn[0] = 1;
+    }
+    else
+    {
+        piReturn[0] = 0;
+    }
+
+    LhsVar(1) = Rhs + 1;
+    PutLhsVar();
+
+    //  printf("End gateway !!!\n");
+    return 0;
+}
+
+static bool import_variable_v1(int _iFile, char* _pstVarName)
+{
+    int iDataSetId = getDataSetIdFromName_v1(_iFile, _pstVarName);
+    if (iDataSetId == 0)
+    {
+        return false;
+    }
+
+    return import_data_v1(iDataSetId, 0, NULL, _pstVarName);
+}
+
+static bool import_data_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
+{
+    bool bRet = false;
+
+    //get var type
+    int iVarType = getScilabTypeFromDataSet_v1(_iDatasetId);
+
+    switch (iVarType)
+    {
+        case sci_matrix:
+        {
+            bRet = import_double_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
+            break;
+        }
+        case sci_strings:
+        {
+            bRet = import_string_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
+            break;
+        }
+        case sci_list:
+        case sci_tlist:
+        case sci_mlist:
+        {
+            bRet = import_list_v1(_iDatasetId, iVarType, _iItemPos, _piAddress, _pstVarname);
+            break;
+        }
+        case sci_boolean:
+        {
+            bRet = import_boolean_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
+            break;
+        }
+        case sci_poly:
+        {
+            bRet = import_poly_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
+            break;
+        }
+        case sci_ints:
+        {
+            bRet = import_integer_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
+            break;
+        }
+        case sci_sparse:
+        {
+            bRet = import_sparse_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
+            break;
+        }
+        case sci_boolean_sparse:
+        {
+            bRet = import_boolean_sparse_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
+            break;
+        }
+        case sci_void:             //void item only on list variable
+        {
+            bRet = import_void_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
+            break;
+        }
+        case sci_undefined:        //undefined item only on list variable
+        {
+            bRet = import_undefined_v1(_iDatasetId, _iItemPos, _piAddress, _pstVarname);
+            break;
+        }
+        default:
+        {
+            Scierror(999, _("%s: Invalid HDF5 Scilab format.\n"), "import_from_hdf5");
+#ifdef PRINT_DEBUG
+            {
+                char pstMsg[512];
+
+                sprintf(pstMsg, "Unknown type : %d", iVarType);
+                print_tree(pstMsg);
+            }
+#endif
+        }
+    }
+
+    return bRet;
+}
+
+static bool import_void_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
+{
+    SciErr sciErr;
+
+    if (_piAddress)
+    {
+        sciErr = createVoidInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos);
+    }
+    else
+    {
+        return false;
+    }
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return false;
+    }
+    return true;
+}
+
+static bool import_undefined_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
+{
+    SciErr sciErr;
+
+    if (_piAddress)
+    {
+        sciErr = createUndefinedInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos);
+    }
+    else
+    {
+        return false;
+    }
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return false;
+    }
+    return true;
+}
+
+static bool import_double_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
+{
+    int iRet = 0;
+    double *pdblReal = NULL;
+    double *pdblImg = NULL;
+    int iRows = 0;
+    int iCols = 0;
+    int iComplex = 0;
+    SciErr sciErr;
+
+#ifdef TIME_DEBUG
+    LARGE_INTEGER iStart, iEnd, iFreq;
+
+    QueryPerformanceFrequency(&iFreq);
+    QueryPerformanceCounter(&iStart);
+#endif
+
+    iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
+    iComplex = isComplexData_v1(_iDatasetId);
+    if (iRet)
+    {
+        return false;
+    }
+
+    if (iRows * iCols != 0)
+    {
+        if (iComplex)
+        {
+            pdblReal = (double *)MALLOC(iRows * iCols * sizeof(double));
+            pdblImg = (double *)MALLOC(iRows * iCols * sizeof(double));
+            iRet = readDoubleComplexMatrix_v1(_iDatasetId, iRows, iCols, pdblReal, pdblImg);
+        }
+        else
+        {
+            pdblReal = (double *)MALLOC(iRows * iCols * sizeof(double));
+            iRet = readDoubleMatrix_v1(_iDatasetId, iRows, iCols, pdblReal);
+        }
+
+        if (iRet)
+        {
+            return false;
+        }
+    }
+    else
+    {
+        /*bug 7224 : to close dataset */
+        iRet = readEmptyMatrix_v1(_iDatasetId);
+        if (iRet)
+        {
+            return false;
+        }
+    }
+
+    if (_piAddress == NULL)
+    {
+        if (iComplex)
+        {
+            sciErr = createNamedComplexMatrixOfDouble(pvApiCtx, _pstVarname, iRows, iCols, pdblReal, pdblImg);
+        }
+        else
+        {
+            sciErr = createNamedMatrixOfDouble(pvApiCtx, _pstVarname, iRows, iCols, pdblReal);
+        }
+    }
+    else                        //if not null this variable is in a list
+    {
+        if (iComplex)
+        {
+            sciErr = createComplexMatrixOfDoubleInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pdblReal, pdblImg);
+        }
+        else
+        {
+            sciErr = createMatrixOfDoubleInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pdblReal);
+        }
+    }
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return false;
+    }
+
+#ifdef PRINT_DEBUG
+    char pstMsg[512];
+
+    sprintf(pstMsg, "double_%d (%d x %d)", _iItemPos, iRows, iCols);
+    print_tree(pstMsg);
+#endif
+
+    if (pdblReal)
+    {
+        FREE(pdblReal);
+    }
+
+    if (pdblImg)
+    {
+        FREE(pdblImg);
+    }
+
+    if (iRet)
+    {
+        return false;
+    }
+
+#ifdef TIME_DEBUG
+    QueryPerformanceCounter(&iEnd);
+    double dblTime = ((iEnd.QuadPart - iStart.QuadPart) * 1000.0) / iFreq.QuadPart;
+
+    printf("Total Double : %0.3f ms\n\n", dblTime);
+#endif
+
+    return true;
+}
+
+static bool import_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
+{
+    int iRet = 0;
+    int i = 0;
+    int iRows = 0;
+    int iCols = 0;
+    char **pstData = NULL;
+    SciErr sciErr;
+
+#ifdef TIME_DEBUG
+    LARGE_INTEGER iStart1, iEnd1, iStart2, iEnd2, iStart3, iEnd3, iFreq;
+
+    QueryPerformanceFrequency(&iFreq);
+    QueryPerformanceCounter(&iStart1);
+#endif
+    iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
+    if (iRet)
+    {
+        return false;
+    }
+
+    pstData = (char **)MALLOC(iRows * iCols * sizeof(char *));
+
+#ifdef TIME_DEBUG
+    QueryPerformanceCounter(&iStart1);
+#endif
+
+    iRet = readStringMatrix_v1(_iDatasetId, iRows, iCols, pstData);
+    if (iRet)
+    {
+        return false;
+    }
+
+#ifdef TIME_DEBUG
+    QueryPerformanceCounter(&iEnd1);
+#endif
+#ifdef TIME_DEBUG
+    QueryPerformanceCounter(&iStart2);
+#endif
+
+    if (_piAddress == NULL)
+    {
+        sciErr = createNamedMatrixOfString(pvApiCtx, _pstVarname, iRows, iCols, pstData);
+    }
+    else                        //if not null this variable is in a list
+    {
+        sciErr = createMatrixOfStringInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pstData);
+    }
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return false;
+    }
+
+#ifdef TIME_DEBUG
+    QueryPerformanceCounter(&iEnd2);
+    QueryPerformanceCounter(&iStart3);
+#endif
+#ifdef PRINT_DEBUG
+    char pstMsg[512];
+
+    sprintf(pstMsg, "string_%d (%d x %d)", _iItemPos, iRows, iCols);
+    print_tree(pstMsg);
+#endif
+    for (i = 0; i < iRows * iCols; i++)
+    {
+        FREE(pstData[i]);
+    }
+    FREE(pstData);
+
+    if (iRet)
+    {
+        return false;
+    }
+
+#ifdef TIME_DEBUG
+    QueryPerformanceCounter(&iEnd3);
+
+    //double dblTime    =((iEnd1.QuadPart - iStart1.QuadPart) * 1000.0) / iFreq.QuadPart;
+    //printf("HDF5 : %0.3f ms\n", dblTime);
+    //dblTime   =((iEnd2.QuadPart - iStart2.QuadPart) * 1000.0) / iFreq.QuadPart;
+    //printf("Stack : %0.3f ms\n", dblTime);
+    //dblTime   =((iEnd3.QuadPart - iStart3.QuadPart) * 1000.0) / iFreq.QuadPart;
+    //printf("Clear : %0.3f ms\n", dblTime);
+    double dblTime = ((iEnd3.QuadPart - iStart1.QuadPart) * 1000.0) / iFreq.QuadPart;
+
+    printf("Total String: %0.3f ms\n\n", dblTime);
+#endif
+    return true;
+}
+
+static bool import_integer_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
+{
+    int iRet = 0;
+    int iRows = 0;
+    int iCols = 0;
+    int iPrec = 0;
+    SciErr sciErr;
+
+    iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
+    if (iRet)
+    {
+        return false;
+    }
+
+    iRet = getDatasetPrecision_v1(_iDatasetId, &iPrec);
+    if (iRet)
+    {
+        return false;
+    }
+
+    switch (iPrec)
+    {
+        case SCI_INT8:
+        {
+            char *pcData = NULL;
+
+            pcData = (char *)MALLOC(sizeof(char) * iRows * iCols);
+            iRet = readInteger8Matrix_v1(_iDatasetId, iRows, iCols, pcData);
+            if (iRet)
+            {
+                return false;
+            }
+
+            if (_piAddress == NULL)
+            {
+                sciErr = createNamedMatrixOfInteger8(pvApiCtx, _pstVarname, iRows, iCols, pcData);
+            }
+            else
+            {
+                sciErr = createMatrixOfInteger8InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pcData);
+            }
+        }
+        break;
+        case SCI_UINT8:
+        {
+            unsigned char *pucData = NULL;
+
+            pucData = (unsigned char *)MALLOC(sizeof(unsigned char) * iRows * iCols);
+            iRet = readUnsignedInteger8Matrix_v1(_iDatasetId, iRows, iCols, pucData);
+            if (iRet)
+            {
+                return false;
+            }
+
+            if (_piAddress == NULL)
+            {
+                sciErr = createNamedMatrixOfUnsignedInteger8(pvApiCtx, _pstVarname, iRows, iCols, pucData);
+            }
+            else
+            {
+                sciErr = createMatrixOfUnsignedInteger8InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pucData);
+            }
+        }
+        break;
+        case SCI_INT16:
+        {
+            short *psData = NULL;
+
+            psData = (short *)MALLOC(sizeof(short) * iRows * iCols);
+            iRet = readInteger16Matrix_v1(_iDatasetId, iRows, iCols, psData);
+            if (iRet)
+            {
+                return false;
+            }
+
+            if (_piAddress == NULL)
+            {
+                sciErr = createNamedMatrixOfInteger16(pvApiCtx, _pstVarname, iRows, iCols, psData);
+            }
+            else
+            {
+                sciErr = createMatrixOfInteger16InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, psData);
+            }
+        }
+        break;
+        case SCI_UINT16:
+        {
+            unsigned short *pusData = NULL;
+
+            pusData = (unsigned short *)MALLOC(sizeof(unsigned short) * iRows * iCols);
+            iRet = readUnsignedInteger16Matrix_v1(_iDatasetId, iRows, iCols, pusData);
+            if (iRet)
+            {
+                return false;
+            }
+
+            if (_piAddress == NULL)
+            {
+                sciErr = createNamedMatrixOfUnsignedInteger16(pvApiCtx, _pstVarname, iRows, iCols, pusData);
+            }
+            else
+            {
+                sciErr = createMatrixOfUnsignedInteger16InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pusData);
+            }
+        }
+        break;
+        case SCI_INT32:
+        {
+            int *piData = NULL;
+
+            piData = (int *)MALLOC(sizeof(int) * iRows * iCols);
+            iRet = readInteger32Matrix_v1(_iDatasetId, iRows, iCols, piData);
+            if (iRet)
+            {
+                return false;
+            }
+
+            if (_piAddress == NULL)
+            {
+                sciErr = createNamedMatrixOfInteger32(pvApiCtx, _pstVarname, iRows, iCols, piData);
+            }
+            else
+            {
+                sciErr = createMatrixOfInteger32InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, piData);
+            }
+        }
+        break;
+        case SCI_UINT32:
+        {
+            unsigned int *puiData = NULL;
+
+            puiData = (unsigned int *)MALLOC(sizeof(unsigned int) * iRows * iCols);
+            iRet = readUnsignedInteger32Matrix_v1(_iDatasetId, iRows, iCols, puiData);
+            if (iRet)
+            {
+                return false;
+            }
+
+            if (_piAddress == NULL)
+            {
+                sciErr = createNamedMatrixOfUnsignedInteger32(pvApiCtx, _pstVarname, iRows, iCols, puiData);
+            }
+            else
+            {
+                sciErr = createMatrixOfUnsignedInteger32InNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, puiData);
+            }
+        }
+        break;
+        case SCI_INT64:
+        {
+#ifdef __SCILAB_INT64__
+            long long *pllData = NULL;
+
+            pllData = (long long *)MALLOC(sizeof(long long) * iRows * iCols);
+            iRet = readInteger64Matrix_v1(_iDatasetId, iRows, iCols, pllData);
+            if (iRet)
+            {
+                return false;
+            }
+
+            if (_piAddress == NULL)
+            {
+                sciErr = createNamedMatrixOfInteger64(_pstVarname, iRows, iCols, pllData);
+            }
+            else
+            {
+                sciErr = createMatrixOfInteger64InNamedList(_pstVarname, _piAddress, _iItemPos, iRows, iCols, pllData);
+            }
+#else
+            return false;
+#endif
+        }
+        break;
+        case SCI_UINT64:
+        {
+#ifdef __SCILAB_INT64__
+            unsigned long long *pullData = NULL;
+
+            pullData = (unsigned long long *)MALLOC(sizeof(unsigned long long) * iRows * iCols);
+            iRet = readUnsignedInteger64Matrix_v1(_iDatasetId, iRows, iCols, pullData);
+            if (iRet)
+            {
+                return false;
+            }
+
+            if (_piAddress == NULL)
+            {
+                sciErr = createNamedMatrixOfUnsignedInteger64(_pstVarname, iRows, iCols, pullData);
+            }
+            else
+            {
+                sciErr = createMatrixOfUnsignedInteger64InNamedList(_pstVarname, _piAddress, _iItemPos, iRows, iCols, pullData);
+            }
+#else
+            return false;
+#endif
+        }
+        break;
+        default:
+            return false;
+    }
+
+#ifdef PRINT_DEBUG
+    char pstMsg[512];
+
+    sprintf(pstMsg, "integer_%d (%d x %d)", _iItemPos, iRows, iCols);
+    print_tree(pstMsg);
+#endif
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return false;
+    }
+
+    return true;
+}
+
+static bool import_boolean_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
+{
+    int iRet = 0;
+    int *piData = NULL;
+    int iRows = 0;
+    int iCols = 0;
+    SciErr sciErr;
+
+    iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
+    if (iRet)
+    {
+        return false;
+    }
+
+    if (iRows * iCols != 0)
+    {
+        piData = (int *)MALLOC(iRows * iCols * sizeof(int));
+        iRet = readBooleanMatrix_v1(_iDatasetId, iRows, iCols, piData);
+        if (iRet)
+        {
+            return false;
+        }
+    }
+
+    if (_piAddress == NULL)
+    {
+        sciErr = createNamedMatrixOfBoolean(pvApiCtx, _pstVarname, iRows, iCols, piData);
+    }
+    else                        //if not null this variable is in a list
+    {
+        sciErr = createMatrixOfBooleanInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, piData);
+    }
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return false;
+    }
+
+#ifdef PRINT_DEBUG
+    char pstMsg[512];
+
+    sprintf(pstMsg, "boolean_%d (%d x %d)", _iItemPos, iRows, iCols);
+    print_tree(pstMsg);
+#endif
+
+    if (piData)
+    {
+        FREE(piData);
+    }
+
+    if (iRet)
+    {
+        return false;
+    }
+
+    return true;
+}
+
+static bool import_poly_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
+{
+    int iRet = 0;
+    int i = 0;
+    int iRows = 0;
+    int iCols = 0;
+    int iComplex = 0;
+    char pstVarName[64] = { 0 };
+    double **pdblReal = NULL;
+    double **pdblImg = NULL;
+    int *piNbCoef = NULL;
+    SciErr sciErr;
+
+    iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
+    if (iRet)
+    {
+        return false;
+    }
+
+    iComplex = isComplexData_v1(_iDatasetId);
+
+    if (iComplex)
+    {
+        piNbCoef = (int *)MALLOC(iRows * iCols * sizeof(int));
+        pdblReal = (double **)MALLOC(iRows * iCols * sizeof(double *));
+        pdblImg = (double **)MALLOC(iRows * iCols * sizeof(double *));
+        iRet = readPolyComplexMatrix_v1(_iDatasetId, pstVarName, iRows, iCols, piNbCoef, pdblReal, pdblImg);
+    }
+    else
+    {
+        piNbCoef = (int *)MALLOC(iRows * iCols * sizeof(int));
+        pdblReal = (double **)MALLOC(iRows * iCols * sizeof(double *));
+        iRet = readPolyMatrix_v1(_iDatasetId, pstVarName, iRows, iCols, piNbCoef, pdblReal);
+    }
+
+    if (iRet)
+    {
+        return false;
+    }
+
+    if (_piAddress == NULL)
+    {
+        if (iComplex)
+        {
+            sciErr = createNamedComplexMatrixOfPoly(pvApiCtx, _pstVarname, pstVarName, iRows, iCols, piNbCoef, pdblReal, pdblImg);
+        }
+        else
+        {
+            sciErr = createNamedMatrixOfPoly(pvApiCtx, _pstVarname, pstVarName, iRows, iCols, piNbCoef, pdblReal);
+        }
+    }
+    else                        //if not null this variable is in a list
+    {
+        if (iComplex)
+        {
+            sciErr =
+                createComplexMatrixOfPolyInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, pstVarName, iRows, iCols, piNbCoef, pdblReal,
+                        pdblImg);
+        }
+        else
+        {
+            sciErr = createMatrixOfPolyInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, pstVarName, iRows, iCols, piNbCoef, pdblReal);
+        }
+    }
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return false;
+    }
+
+#ifdef PRINT_DEBUG
+    char pstMsg[512];
+
+    sprintf(pstMsg, "poly_%d (%d x %d)", _iItemPos, iRows, iCols);
+    print_tree(pstMsg);
+#endif
+
+    for (i = 0; i < iRows * iCols; i++)
+    {
+        FREE(pdblReal[i]);
+    }
+    FREE(pdblReal);
+    FREE(piNbCoef);
+
+    if (iRet)
+    {
+        return false;
+    }
+
+    return true;
+}
+
+static bool import_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
+{
+    int iRet = 0;
+    int iRows = 0;
+    int iCols = 0;
+    int iComplex = 0;
+    double *pdblReal = NULL;
+    double *pdblImg = NULL;
+    int iNbItem = 0;
+    int *piNbItemRow = NULL;
+    int *piColPos = NULL;
+    SciErr sciErr;
+
+    iRet = getSparseDimension_v1(_iDatasetId, &iRows, &iCols, &iNbItem);
+    if (iRet)
+    {
+        return false;
+    }
+
+    iComplex = isComplexData_v1(_iDatasetId);
+
+    if (iComplex)
+    {
+        piNbItemRow = (int *)MALLOC(iRows * sizeof(int));
+        piColPos = (int *)MALLOC(iNbItem * sizeof(int));
+        pdblReal = (double *)MALLOC(iNbItem * sizeof(double));
+        pdblImg = (double *)MALLOC(iNbItem * sizeof(double));
+        iRet = readSparseComplexMatrix_v1(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg);
+    }
+    else
+    {
+        piNbItemRow = (int *)MALLOC(iRows * sizeof(int));
+        piColPos = (int *)MALLOC(iNbItem * sizeof(int));
+        pdblReal = (double *)MALLOC(iNbItem * sizeof(double));
+        iRet = readSparseMatrix_v1(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
+    }
+
+    if (iRet)
+    {
+        return false;
+    }
+
+    if (_piAddress == NULL)
+    {
+        if (iComplex)
+        {
+            sciErr = createNamedComplexSparseMatrix(pvApiCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg);
+        }
+        else
+        {
+            sciErr = createNamedSparseMatrix(pvApiCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
+        }
+    }
+    else                        //if not null this variable is in a list
+    {
+        if (iComplex)
+        {
+            sciErr =
+                createComplexSparseMatrixInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos,
+                        pdblReal, pdblImg);
+        }
+        else
+        {
+            sciErr =
+                createSparseMatrixInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
+        }
+    }
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return false;
+    }
+
+#ifdef PRINT_DEBUG
+    char pstMsg[512];
+
+    sprintf(pstMsg, "sparse_%d (%d x %d)", _iItemPos, iRows, iCols);
+    print_tree(pstMsg);
+#endif
+
+    FREE(piNbItemRow);
+    FREE(piColPos);
+    FREE(pdblReal);
+    if (iComplex)
+    {
+        FREE(pdblImg);
+    }
+
+    if (iRet)
+    {
+        return false;
+    }
+
+    return true;
+}
+
+static bool import_boolean_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
+{
+    int iRet = 0;
+    int iRows = 0;
+    int iCols = 0;
+    int iNbItem = 0;
+    int *piNbItemRow = NULL;
+    int *piColPos = NULL;
+    SciErr sciErr;
+
+    iRet = getSparseDimension_v1(_iDatasetId, &iRows, &iCols, &iNbItem);
+    if (iRet)
+    {
+        return false;
+    }
+
+    piNbItemRow = (int *)MALLOC(iRows * sizeof(int));
+    piColPos = (int *)MALLOC(iNbItem * sizeof(int));
+    iRet = readBooleanSparseMatrix_v1(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos);
+    if (iRet)
+    {
+        return false;
+    }
+
+    if (_piAddress == NULL)
+    {
+        sciErr = createNamedBooleanSparseMatrix(pvApiCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos);
+    }
+    else                        //if not null this variable is in a list
+    {
+        sciErr = createBooleanSparseMatrixInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos);
+    }
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return false;
+    }
+
+#ifdef PRINT_DEBUG
+    char pstMsg[512];
+
+    sprintf(pstMsg, "boolean sparse_%d (%d x %d)", _iItemPos, iRows, iCols);
+    print_tree(pstMsg);
+#endif
+
+    FREE(piNbItemRow);
+    FREE(piColPos);
+
+    if (iRet)
+    {
+        return false;
+    }
+
+    return true;
+}
+
+static bool import_list_v1(int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname)
+{
+    int iRet = 0;
+    int i = 0;
+    int iItems = 0;
+    int *piListAddr = NULL;
+    hobj_ref_t *piItemRef = NULL;
+    SciErr sciErr;
+
+    iRet = getListDims_v1(_iDatasetId, &iItems);
+    if (iRet)
+    {
+        return false;
+    }
+
+    if (iItems == 0)
+    {
+        //special case for empty list
+    }
+    else
+    {
+        iRet = getListItemReferences_v1(_iDatasetId, &piItemRef);
+        if (iRet)
+        {
+            return false;
+        }
+    }
+
+#ifdef PRINT_DEBUG
+    char pstMsg[512];
+
+    sprintf(pstMsg, "list_%d (%d)", _iItemPos, iItems);
+    print_tree(pstMsg);
+#endif
+
+    if (_piAddress == 0)
+    {
+        switch (_iVarType)
+        {
+            case sci_list:
+                sciErr = createNamedList(pvApiCtx, _pstVarname, iItems, &piListAddr);
+                break;
+            case sci_tlist:
+                sciErr = createNamedTList(pvApiCtx, _pstVarname, iItems, &piListAddr);
+                break;
+            case sci_mlist:
+                sciErr = createNamedMList(pvApiCtx, _pstVarname, iItems, &piListAddr);
+                break;
+            default:
+                return false;
+        }
+    }
+    else                        //if not null this variable is in a list
+    {
+        switch (_iVarType)
+        {
+            case sci_list:
+                sciErr = createListInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iItems, &piListAddr);
+                break;
+            case sci_tlist:
+                sciErr = createTListInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iItems, &piListAddr);
+                break;
+            case sci_mlist:
+                sciErr = createMListInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iItems, &piListAddr);
+                break;
+            default:
+                return false;
+        }
+    }
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return false;
+    }
+
+    iTab++;
+    for (i = 0; i < iItems; i++)
+    {
+        int iItemDataset = 0;
+
+        iRet = getListItemDataset_v1(_iDatasetId, piItemRef, i, &iItemDataset);
+        if (iRet || iItemDataset == 0)
+        {
+            return false;
+        }
+
+        bool bRet = import_data_v1(iItemDataset, i + 1, piListAddr, _pstVarname);
+
+        if (bRet == false)
+        {
+            return false;
+        }
+    }
+    iTab--;
+
+    iRet = deleteListItemReferences_v1(_iDatasetId, piItemRef);
+    if (iRet)
+    {
+        return false;
+    }
+
+#ifdef TIME_DEBUG
+    printf("Close List %d\n\n", iCloseList++);
+#endif
+
+#ifdef PRINT_DEBUG
+    char pstMsg1[512];
+
+    sprintf(pstMsg1, "ListEnd_%d", _iItemPos);
+    print_tree(pstMsg1);
+#endif
+    return true;
+}
+
+void print_tree(char *_pstMsg)
+{
+#ifdef PRINT_DEBUG
+    for (int i = 0; i < iTab; i++)
+    {
+        printf("\t");
+    }
+    printf("%s\n", _pstMsg);
+#endif
+}
+
+/*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/hdf5/src/cpp/listvar_in_hdf5_v1.cpp b/scilab/modules/hdf5/src/cpp/listvar_in_hdf5_v1.cpp
new file mode 100644 (file)
index 0000000..c71fef9
--- /dev/null
@@ -0,0 +1,569 @@
+/*
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+* Copyright (C) 2012 - DIGITEO - Antoine ELIAS
+*
+* This file must be used under the terms of the CeCILL.
+* This source file is licensed as described in the file COPYING, which
+* you should have received as part of this distribution.  The terms
+* are also available at
+* http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*
+*/
+
+extern "C"
+{
+#include <hdf5.h>
+#include <string.h>
+#include "gw_hdf5.h"
+#include "MALLOC.h"
+#include "Scierror.h"
+#include "localization.h"
+#include "sciprint.h"
+#include "api_scilab.h"
+#include "../../../call_scilab/includes/call_scilab.h"
+#include "h5_fileManagement.h"
+#include "h5_readDataFromFile_v1.h"
+#include "expandPathVariable.h"
+}
+
+#include <vector>
+
+typedef struct __VAR_INFO_V1__
+{
+    char pstInfo[128];
+    char varName[128];
+    int iType;
+    int iSize;
+    int iDims;
+    int piDims[2];
+
+    __VAR_INFO_V1__() : iType(0), iSize(0), iDims(0) {}
+} VarInfo_v1;
+
+static bool read_data_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
+static bool read_double_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
+static bool read_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
+static bool read_boolean_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
+static bool read_integer_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
+static bool read_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
+static bool read_boolean_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
+static bool read_poly_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
+static bool read_list_v1(int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
+static bool read_void_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
+static bool read_undefined_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo);
+
+static void generateInfo_v1(VarInfo_v1* _pInfo, const char* _pstType);
+
+int sci_listvar_in_hdf5_v1(char *fname, unsigned long fname_len)
+{
+    SciErr sciErr;
+    int *piAddr     = NULL;
+    char* pstFile   = NULL;
+    int iFile       = 0;
+    int iNbItem     = 0;
+    VarInfo_v1* pInfo  = NULL;
+
+    CheckRhs(1, 1);
+    CheckLhs(1, 4);
+
+    sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 1;
+    }
+
+    if (getAllocatedSingleString(pvApiCtx, piAddr, &pstFile))
+    {
+        Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 1);
+        return 1;
+    }
+
+    char* pstFileName = expandPathVariable(pstFile);
+    iFile = openHDF5File(pstFileName);
+    if (iFile < 0)
+    {
+        FREE(pstFileName);
+        FREE(pstFile);
+        Scierror(999, _("%s: Unable to open file: %s\n"), fname, pstFile);
+        return 1;
+    }
+    FREE(pstFileName);
+    FREE(pstFile);
+
+    iNbItem = getVariableNames_v1(iFile, NULL);
+    if (iNbItem != 0)
+    {
+        char** pstVarNameList = (char**)MALLOC(sizeof(char*) * iNbItem);
+        pInfo = (VarInfo_v1*)MALLOC(iNbItem * sizeof(VarInfo_v1));
+
+        if (Lhs == 1)
+        {
+            sciprint("Name                     Type           Size            Bytes\n");
+            sciprint("---------------------------------------------------------------\n");
+        }
+
+        iNbItem = getVariableNames_v1(iFile, pstVarNameList);
+        for (int i = 0; i < iNbItem; i++)
+        {
+            int iDataSetId = getDataSetIdFromName_v1(iFile, pstVarNameList[i]);
+            if (iDataSetId == 0)
+            {
+                break;
+            }
+
+            strcpy(pInfo[i].varName, pstVarNameList[i]);
+            FREE(pstVarNameList[i]);
+            if (read_data_v1(iDataSetId, 0, NULL, &pInfo[i]) == false)
+            {
+                break;
+            }
+
+            if (Lhs == 1)
+            {
+                sciprint("%s\n", pInfo[i].pstInfo);
+            }
+        }
+    }
+    else
+    {
+        //no variable returms [] for each Lhs
+        for (int i = 0 ; i < Lhs ; i++)
+        {
+            createEmptyMatrix(pvApiCtx, Rhs + i + 1);
+            LhsVar(i + 1) = Rhs + i + 1;
+        }
+
+        PutLhsVar();
+        return 0;
+    }
+
+    //1st Lhs
+    char** pstVarName = (char**)MALLOC(sizeof(char*) * iNbItem);
+    for (int i = 0 ; i < iNbItem ; i++)
+    {
+        pstVarName[i] = pInfo[i].varName;
+    }
+
+    sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, iNbItem, 1, pstVarName);
+    FREE(pstVarName);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 1;
+    }
+
+    LhsVar(1) = Rhs + 1;
+
+    if (Lhs > 1)
+    {
+        //2nd Lhs
+        double* pdblType;
+        sciErr = allocMatrixOfDouble(pvApiCtx, Rhs + 2, iNbItem, 1, &pdblType);
+        if (sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 1;
+        }
+
+        for (int i = 0 ; i < iNbItem ; i++)
+        {
+            pdblType[i] = pInfo[i].iType;
+        }
+
+        LhsVar(2) = Rhs + 2;
+
+        if (Lhs > 2)
+        {
+            //3rd Lhs
+            int* pList = NULL;
+            sciErr = createList(pvApiCtx, Rhs + 3, iNbItem, &pList);
+            for (int i = 0 ; i < iNbItem ; i++)
+            {
+                double* pdblDims = NULL;
+                allocMatrixOfDoubleInList(pvApiCtx, Rhs + 3, pList, i + 1, 1, pInfo[i].iDims, &pdblDims);
+                for (int j = 0 ; j < pInfo[i].iDims ; j++)
+                {
+                    pdblDims[j] = pInfo[i].piDims[j];
+                }
+            }
+
+            LhsVar(3) = Rhs + 3;
+        }
+
+        if (Lhs > 3)
+        {
+            //4th Lhs
+            double* pdblSize;
+            sciErr = allocMatrixOfDouble(pvApiCtx, Rhs + 4, iNbItem, 1, &pdblSize);
+            for (int i = 0 ; i < iNbItem ; i++)
+            {
+                pdblSize[i] = pInfo[i].iSize;
+            }
+
+            LhsVar(4) = Rhs + 4;
+        }
+
+    }
+
+    FREE(pInfo);
+    PutLhsVar();
+    return 0;
+}
+
+static bool read_data_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
+{
+    bool bRet = false;
+
+    _pInfo->iType = getScilabTypeFromDataSet_v1(_iDatasetId);
+    switch (_pInfo->iType)
+    {
+        case sci_matrix:
+        {
+            bRet = read_double_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
+            break;
+        }
+        case sci_strings:
+        {
+            bRet = read_string_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
+            break;
+        }
+        case sci_list:
+        case sci_tlist:
+        case sci_mlist:
+        {
+            bRet = read_list_v1(_iDatasetId, _pInfo->iType, _iItemPos, _piAddress, _pInfo);
+            break;
+        }
+        case sci_boolean:
+        {
+            bRet = read_boolean_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
+            break;
+        }
+        case sci_poly:
+        {
+            bRet = read_poly_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
+            break;
+        }
+        case sci_ints:
+        {
+            bRet = read_integer_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
+            break;
+        }
+        case sci_sparse:
+        {
+            bRet = read_sparse_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
+            break;
+        }
+        case sci_boolean_sparse:
+        {
+            bRet = read_boolean_sparse_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
+            break;
+        }
+        case sci_void:             //void item only on list variable
+        {
+            bRet = read_void_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
+            break;
+        }
+        case sci_undefined:        //undefined item only on list variable
+        {
+            bRet = read_undefined_v1(_iDatasetId, _iItemPos, _piAddress, _pInfo);
+            break;
+        }
+        default:
+        {
+            Scierror(999, _("%s: Invalid HDF5 Scilab format.\n"), "listvar_in_hdf5");
+            break;
+        }
+    }
+
+    return bRet;
+}
+
+static bool read_double_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
+{
+    int iRet = 0;
+    int iRows = 0;
+    int iCols = 0;
+    int iComplex = 0;
+
+    iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
+    iComplex = isComplexData_v1(_iDatasetId);
+
+    _pInfo->iDims = 2;
+    _pInfo->piDims[0] = iRows;
+    _pInfo->piDims[1] = iCols;
+    _pInfo->iSize = (2 + (iRows * iCols * (iComplex + 1))) * 8;
+
+    generateInfo_v1(_pInfo, "constant");
+    return true;
+}
+
+static bool read_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
+{
+    int iRet = 0;
+    int iRows = 0;
+    int iCols = 0;
+    char** pstData = NULL;
+
+    iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
+
+    _pInfo->iDims = 2;
+    _pInfo->piDims[0] = iRows;
+    _pInfo->piDims[1] = iCols;
+
+    pstData = (char **)MALLOC(iRows * iCols * sizeof(char *));
+    iRet = readStringMatrix_v1(_iDatasetId, iRows, iCols, pstData);
+
+
+    for (int i = 0 ; i < iRows * iCols ; i++)
+    {
+        _pInfo->iSize += (int)strlen(pstData[i]) * 4;
+        FREE(pstData[i]);
+    }
+
+    FREE(pstData);
+    //always full double size
+    _pInfo->iSize += (8 - (_pInfo->iSize % 8));
+    //header + offset
+    _pInfo->iSize += 16 + (1 + iRows * iCols) * 4;
+
+    generateInfo_v1(_pInfo, "string");
+    return true;
+}
+
+static bool read_boolean_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
+{
+    int iRet = 0;
+    int iRows = 0;
+    int iCols = 0;
+
+    iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
+
+    _pInfo->iDims = 2;
+    _pInfo->piDims[0] = iRows;
+    _pInfo->piDims[1] = iCols;
+    _pInfo->iSize = (3 + iRows * iCols) * 4;
+
+    generateInfo_v1(_pInfo, "boolean");
+    return true;
+}
+
+static bool read_integer_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
+{
+    int iRet = 0;
+    int iRows = 0;
+    int iCols = 0;
+    int iPrec = 0;
+
+    iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
+    iRet = getDatasetPrecision_v1(_iDatasetId, &iPrec);
+
+    _pInfo->iDims = 2;
+    _pInfo->piDims[0] = iRows;
+    _pInfo->piDims[1] = iCols;
+    _pInfo->iSize = 16 + iRows * iCols * (iPrec % 10);
+
+    generateInfo_v1(_pInfo, "integer");
+    return true;
+}
+
+static bool read_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
+{
+    int iRet = 0;
+    int iRows = 0;
+    int iCols = 0;
+    int iNbItem = 0;
+    int iComplex = 0;
+
+    iRet = getSparseDimension_v1(_iDatasetId, &iRows, &iCols, &iNbItem);
+    if (iRet)
+    {
+        return false;
+    }
+
+    iComplex = isComplexData_v1(_iDatasetId);
+
+    _pInfo->iDims = 2;
+    _pInfo->piDims[0] = iRows;
+    _pInfo->piDims[1] = iCols;
+    _pInfo->iSize = 20 + iRows * 4 + iNbItem * 4 + (iNbItem * (iComplex + 1) * 8);
+
+    generateInfo_v1(_pInfo, "sparse");
+    return true;
+}
+
+static bool read_boolean_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
+{
+    int iRet = 0;
+    int iRows = 0;
+    int iCols = 0;
+    int iNbItem = 0;
+    int iComplex = 0;
+
+    iRet = getSparseDimension_v1(_iDatasetId, &iRows, &iCols, &iNbItem);
+    if (iRet)
+    {
+        return false;
+    }
+
+    _pInfo->iDims = 2;
+    _pInfo->piDims[0] = iRows;
+    _pInfo->piDims[1] = iCols;
+    _pInfo->iSize = 20 + iRows * 4 + iNbItem * 4;
+
+    generateInfo_v1(_pInfo, "boolean sparse");
+    return true;
+}
+
+static bool read_poly_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
+{
+    int iRet = 0;
+    int iRows = 0;
+    int iCols = 0;
+    int iComplex = 0;
+    char pstVarName[64] = { 0 };
+    double **pdblReal = NULL;
+    double **pdblImg = NULL;
+    int *piNbCoef = NULL;
+
+    iRet = getDatasetDims_v1(_iDatasetId, &iRows, &iCols);
+    if (iRet)
+    {
+        return false;
+    }
+
+    iComplex = isComplexData_v1(_iDatasetId);
+
+    _pInfo->iDims = 2;
+    _pInfo->piDims[0] = iRows;
+    _pInfo->piDims[1] = iCols;
+    _pInfo->iSize = 8 * 4 + (iRows * iCols + 1) * 4;
+
+    if (iComplex)
+    {
+        piNbCoef = (int *)MALLOC(iRows * iCols * sizeof(int));
+        pdblReal = (double **)MALLOC(iRows * iCols * sizeof(double *));
+        pdblImg = (double **)MALLOC(iRows * iCols * sizeof(double *));
+        iRet = readPolyComplexMatrix_v1(_iDatasetId, pstVarName, iRows, iCols, piNbCoef, pdblReal, pdblImg);
+    }
+    else
+    {
+        piNbCoef = (int *)MALLOC(iRows * iCols * sizeof(int));
+        pdblReal = (double **)MALLOC(iRows * iCols * sizeof(double *));
+        iRet = readPolyMatrix_v1(_iDatasetId, pstVarName, iRows, iCols, piNbCoef, pdblReal);
+    }
+
+    for (int i = 0 ; i < iRows * iCols ; i++)
+    {
+        _pInfo->iSize += piNbCoef[i] * 8 * (iComplex + 1);
+        FREE(pdblReal[i]);
+        if (iComplex)
+        {
+            FREE(pdblImg[i]);
+        }
+    }
+
+    FREE(piNbCoef);
+    FREE(pdblReal);
+    if (iComplex)
+    {
+        FREE(pdblImg);
+    }
+
+    generateInfo_v1(_pInfo, "polynomial");
+    return true;
+}
+
+static bool read_list_v1(int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
+{
+    int iRet = 0;
+    int iItems = 0;
+    int *piListAddr = NULL;
+    hobj_ref_t *piItemRef = NULL;
+
+    iRet = getListDims_v1(_iDatasetId, &iItems);
+    if (iRet)
+    {
+        return false;
+    }
+
+    if (iItems == 0)
+    {
+        //special case for empty list
+    }
+    else
+    {
+        iRet = getListItemReferences_v1(_iDatasetId, &piItemRef);
+        if (iRet)
+        {
+            return false;
+        }
+    }
+    //_pInfo = (VarInfo_v1*)MALLOC(sizeof(VarInfo));
+    _pInfo->iDims = 1;
+    _pInfo->piDims[0] = iItems;
+    _pInfo->iSize = (2 + iItems + 1) * 4;
+
+    for (int i = 0; i < iItems; i++)
+    {
+        int iItemDataset = 0;
+
+        iRet = getListItemDataset_v1(_iDatasetId, piItemRef, i, &iItemDataset);
+        if (iRet || iItemDataset == 0)
+        {
+            return false;
+        }
+        VarInfo_v1 info;
+        bool bRet = read_data_v1(iItemDataset, i + 1, piListAddr, &info);
+        if (bRet == false)
+        {
+            return false;
+        }
+
+        _pInfo->iSize += info.iSize;
+    }
+
+    if (_iVarType == sci_list)
+    {
+        generateInfo_v1(_pInfo, "list");
+    }
+    else if (_iVarType == sci_tlist)
+    {
+        generateInfo_v1(_pInfo, "tlist");
+    }
+    else if (_iVarType == sci_mlist)
+    {
+        generateInfo_v1(_pInfo, "mlist");
+    }
+
+    return true;
+}
+
+static bool read_void_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
+{
+    _pInfo->iSize = 1;
+    return true;
+}
+
+static bool read_undefined_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo_v1* _pInfo)
+{
+    _pInfo->iSize = 1;
+    return true;
+}
+
+static void generateInfo_v1(VarInfo_v1* _pInfo, const char* _pstType)
+{
+    char pstSize[17];
+
+    if (_pInfo->iDims == 2)
+    {
+        sprintf(pstSize, "%d by %d", _pInfo->piDims[0], _pInfo->piDims[1]);
+    }
+    else
+    {
+        sprintf(pstSize, "%d", _pInfo->piDims[0]);
+    }
+    sprintf(_pInfo->pstInfo, "%-*s%-*s%-*s%-*d", 25, _pInfo->varName, 15, _pstType, 16, pstSize, 10, _pInfo->iSize);
+}
+
index 57b4b4c..9b71307 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/booleanmatrix.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/booleanmatrix.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/booleanmatrix_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/booleanmatrix_v1.sod
new file mode 100644 (file)
index 0000000..57b4b4c
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/booleanmatrix_v1.sod differ
index c25e371..bb38c89 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/booleanscalar.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/booleanscalar.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/booleanscalar_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/booleanscalar_v1.sod
new file mode 100644 (file)
index 0000000..c25e371
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/booleanscalar_v1.sod differ
index cbbc939..e4ff56b 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/booleansparse.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/booleansparse.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/booleansparse_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/booleansparse_v1.sod
new file mode 100644 (file)
index 0000000..cbbc939
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/booleansparse_v1.sod differ
index fc48348..2225d30 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/emptysparse.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/emptysparse.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/emptysparse_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/emptysparse_v1.sod
new file mode 100644 (file)
index 0000000..fc48348
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/emptysparse_v1.sod differ
index b86350f..5f5451b 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/hypermatrix.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/hypermatrix.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/hypermatrix_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/hypermatrix_v1.sod
new file mode 100644 (file)
index 0000000..b86350f
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/hypermatrix_v1.sod differ
index 3575e10..0b2eb06 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/hypermatrixcomplex.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/hypermatrixcomplex.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/hypermatrixcomplex_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/hypermatrixcomplex_v1.sod
new file mode 100644 (file)
index 0000000..3575e10
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/hypermatrixcomplex_v1.sod differ
index b1491bf..eb14265 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/int16.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/int16.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/int16_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/int16_v1.sod
new file mode 100644 (file)
index 0000000..b1491bf
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/int16_v1.sod differ
index 80bedff..3f9c9a8 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/int32.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/int32.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/int32_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/int32_v1.sod
new file mode 100644 (file)
index 0000000..80bedff
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/int32_v1.sod differ
index 30aad01..09632f9 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/int8.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/int8.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/int8_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/int8_v1.sod
new file mode 100644 (file)
index 0000000..30aad01
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/int8_v1.sod differ
index dcd8be1..d6b84c8 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/list.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/list.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/list_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/list_v1.sod
new file mode 100644 (file)
index 0000000..dcd8be1
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/list_v1.sod differ
index df64a37..1814639 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/listnested.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/listnested.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/listnested_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/listnested_v1.sod
new file mode 100644 (file)
index 0000000..df64a37
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/listnested_v1.sod differ
index 4ae9315..7cd0647 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/matricedouble.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/matricedouble.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/matricedouble_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/matricedouble_v1.sod
new file mode 100644 (file)
index 0000000..4ae9315
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/matricedouble_v1.sod differ
index 07f34e7..faf0177 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublecomplex.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublecomplex.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublecomplex_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublecomplex_v1.sod
new file mode 100644 (file)
index 0000000..07f34e7
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublecomplex_v1.sod differ
index 3839e66..1805cb0 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublecomplexscalar.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublecomplexscalar.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublecomplexscalar_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublecomplexscalar_v1.sod
new file mode 100644 (file)
index 0000000..3839e66
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublecomplexscalar_v1.sod differ
index eec40e3..b4e6eba 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublescalar.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublescalar.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublescalar_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublescalar_v1.sod
new file mode 100644 (file)
index 0000000..eec40e3
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/matricedoublescalar_v1.sod differ
index dfb6dd5..1c9c55f 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/matricestring.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/matricestring.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/matricestring_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/matricestring_v1.sod
new file mode 100644 (file)
index 0000000..dfb6dd5
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/matricestring_v1.sod differ
index 79cf610..557c89c 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/matricestringscalar.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/matricestringscalar.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/matricestringscalar_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/matricestringscalar_v1.sod
new file mode 100644 (file)
index 0000000..79cf610
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/matricestringscalar_v1.sod differ
index d4043e2..fa9cf23 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/mlist.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/mlist.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/mlist_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/mlist_v1.sod
new file mode 100644 (file)
index 0000000..d4043e2
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/mlist_v1.sod differ
index 74020fd..c4eab30 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/polynomials.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/polynomials.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/polynomials_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/polynomials_v1.sod
new file mode 100644 (file)
index 0000000..74020fd
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/polynomials_v1.sod differ
index 3d28f1f..a0dcfb9 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/polynomialscoef.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/polynomialscoef.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/polynomialscoef_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/polynomialscoef_v1.sod
new file mode 100644 (file)
index 0000000..3d28f1f
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/polynomialscoef_v1.sod differ
index 53d5dd8..562fd34 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/sparsematrix.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/sparsematrix.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/sparsematrix_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/sparsematrix_v1.sod
new file mode 100644 (file)
index 0000000..53d5dd8
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/sparsematrix_v1.sod differ
index ddeef5c..b8e0f9c 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/tlist.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/tlist.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/tlist_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/tlist_v1.sod
new file mode 100644 (file)
index 0000000..ddeef5c
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/tlist_v1.sod differ
index bfcaa5d..e3e728b 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/uint16.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/uint16.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/uint16_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/uint16_v1.sod
new file mode 100644 (file)
index 0000000..bfcaa5d
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/uint16_v1.sod differ
index 81cb889..718fa6c 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/uint32.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/uint32.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/uint32_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/uint32_v1.sod
new file mode 100644 (file)
index 0000000..81cb889
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/uint32_v1.sod differ
index 74e1ea1..994ceca 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/uint8.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/uint8.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/uint8_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/uint8_v1.sod
new file mode 100644 (file)
index 0000000..74e1ea1
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/uint8_v1.sod differ
index 60442ea..946fc4d 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/undefinedelement.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/undefinedelement.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/undefinedelement_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/undefinedelement_v1.sod
new file mode 100644 (file)
index 0000000..60442ea
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/undefinedelement_v1.sod differ
index 657d7e0..74cf225 100644 (file)
Binary files a/scilab/modules/hdf5/tests/sample_scilab_data/voidelement.sod and b/scilab/modules/hdf5/tests/sample_scilab_data/voidelement.sod differ
diff --git a/scilab/modules/hdf5/tests/sample_scilab_data/voidelement_v1.sod b/scilab/modules/hdf5/tests/sample_scilab_data/voidelement_v1.sod
new file mode 100644 (file)
index 0000000..657d7e0
Binary files /dev/null and b/scilab/modules/hdf5/tests/sample_scilab_data/voidelement_v1.sod differ
index ffa5091..e79f9da 100644 (file)
@@ -140,9 +140,6 @@ import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/undefinedelement.so
 assert_checkequal(undefinedelement, undefinedelement_ref);
 // void
 voidelement_ref=list(1,,3);
-import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/voidelement.sod")
- ans  =
-  T  
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/voidelement.sod");
 // Commented because of bug 9529
 //assert_checkequal(voidelement, voidelement_ref);
index b423f76..79160de 100644 (file)
@@ -178,7 +178,7 @@ assert_checkequal(undefinedelement, undefinedelement_ref);
 
 // void
 voidelement_ref=list(1,,3);
-import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/voidelement.sod")
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/voidelement.sod");
 // Commented because of bug 9529
 //assert_checkequal(voidelement, voidelement_ref);
 
diff --git a/scilab/modules/hdf5/tests/unit_tests/loadhdf5data_v1.dia.ref b/scilab/modules/hdf5/tests/unit_tests/loadhdf5data_v1.dia.ref
new file mode 100644 (file)
index 0000000..25d8ec3
--- /dev/null
@@ -0,0 +1,145 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 - DIGITEO - Sylvestre LEDRU
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// Load previously saved data (check backward compatibility)
+///// Double
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/matricedoublescalar_v1.sod");
+assert_checkequal(ascalar,42);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/matricedouble_v1.sod");
+assert_checkequal(a,[2,3;4,5]);
+///// Double complex
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/matricedoublecomplex_v1.sod");
+assert_checkequal(b,[2+%i,3+%i*2;4+%i*%pi,5]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/matricedoublecomplexscalar_v1.sod");
+assert_checkequal(bscalar,42+%i);
+///// String
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/matricestring_v1.sod");
+assert_checkequal(c,["my matrix","of strings";"is","saved in Scilab data format"]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/matricestringscalar_v1.sod");
+assert_checkequal(cscalar,["my single string"]);
+// Polynomials
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/polynomials_v1.sod");
+p_reference=poly([1 2],'s') ;
+assert_checkequal(p,p_reference);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/polynomialscoef_v1.sod");
+q_reference=poly([1 42],'s','c');
+assert_checkequal(q,q_reference);
+// Boolean matrices
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/booleanscalar_v1.sod");
+assert_checkequal(bm,%t);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/booleanmatrix_v1.sod");
+assert_checkequal(bmm,[%t,%f; %f, %t]);
+// Sparse
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/sparsematrix_v1.sod");
+assert_checkequal(sp,sparse([1,2;4,5;3,10],[1,2,3]));
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/emptysparse_v1.sod");
+assert_checkequal(emptysparse,sparse([]));
+// boolean sparse
+dense=[%F, %F, %T, %F, %F
+%T, %F, %F, %F, %F
+%F, %F, %F, %F, %F
+%F, %F, %F, %F, %T];
+sp_reference=sparse(dense);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/booleansparse_v1.sod");
+assert_checkequal(sp,sp_reference);
+// List
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/list_v1.sod");
+assert_checkequal(ls,list(2,%i,'f',ones(3,3)));
+ls(2) =  list( %t, [32,42]); // alter ls to add the list
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/listnested_v1.sod");
+assert_checkequal(lsnested,ls);
+// tlist
+lst_reference  =  tlist(['random numbers';'Name';'Example'], 'Uniform',ones(1,2, 3));
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/tlist_v1.sod");
+assert_checkequal(lst,lst_reference);
+// mlist
+M_ref=mlist(['V','name','value'],['a','b';'c' 'd'],[1 2; 3 4]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/mlist_v1.sod");
+// Commented because of bug 9531
+//assert_checkequal(M_ref,M);
+// hypermatrices
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/hypermatrix_v1.sod");
+assert_checkequal(HM,hypermat([2 3 2 2],1:24));
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/hypermatrixcomplex_v1.sod");
+HMC_reference(1,1,1,1:2)=[1+%i 2*2*%i];
+assert_checkequal(HMC,HMC_reference);
+// int
+emptyint8matrix_ref = int8([]);
+int8scalar_ref = int8(1);
+int8rowvector_ref = int8([1 -4 7]);
+int8colvector_ref = int8([1;-4;7]);
+int8matrix_ref = int8([1 -4 7;-9 6 -3]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/int8_v1.sod");
+assert_checkequal(emptyint8matrix, emptyint8matrix_ref);
+assert_checkequal(int8scalar, int8scalar_ref);
+assert_checkequal(int8rowvector, int8rowvector_ref);
+assert_checkequal(int8colvector, int8colvector_ref);
+assert_checkequal(int8matrix, int8matrix_ref);
+emptyint16matrix_ref = int16([]);
+int16scalar_ref = int16(1);
+int16rowvector_ref = int16([1 -4 7]);
+int16colvector_ref = int16([1;-4;7]);
+int16matrix_ref = int16([1 -4 7;-9 6 -3]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/int16_v1.sod");
+assert_checkequal(emptyint16matrix, emptyint16matrix_ref);
+assert_checkequal(int16scalar, int16scalar_ref);
+assert_checkequal(int16rowvector, int16rowvector_ref);
+assert_checkequal(int16colvector, int16colvector_ref);
+assert_checkequal(int16matrix, int16matrix_ref);
+emptyint32matrix_ref = int32([]);
+int32scalar_ref = int32(1);
+int32rowvector_ref = int32([1 -4 7]);
+int32colvector_ref = int32([1;-4;7]);
+int32matrix_ref = int32([1 -4 7;-9 6 -3]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/int32_v1.sod");
+assert_checkequal(emptyint32matrix, emptyint32matrix_ref);
+assert_checkequal(int32scalar, int32scalar_ref);
+assert_checkequal(int32rowvector, int32rowvector_ref);
+assert_checkequal(int32colvector, int32colvector_ref);
+assert_checkequal(int32matrix, int32matrix_ref);
+emptyuint8matrix_ref = uint8([]);
+uint8scalar_ref = uint8(1);
+uint8rowvector_ref = uint8([1 4 7]);
+uint8colvector_ref = uint8([1;4;7]);
+uint8matrix_ref = uint8([1 4 7;9 6 3]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/uint8_v1.sod");
+assert_checkequal(emptyuint8matrix, emptyuint8matrix_ref);
+assert_checkequal(uint8scalar, uint8scalar_ref);
+assert_checkequal(uint8rowvector, uint8rowvector_ref);
+assert_checkequal(uint8colvector, uint8colvector_ref);
+assert_checkequal(uint8matrix, uint8matrix_ref);
+emptyuint16matrix_ref = uint16([]);
+uint16scalar_ref = uint16(1);
+uint16rowvector_ref = uint16([1 4 7]);
+uint16colvector_ref = uint16([1;4;7]);
+uint16matrix_ref = uint16([1 4 7;9 6 3]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/uint16_v1.sod");
+assert_checkequal(emptyuint16matrix, emptyuint16matrix_ref);
+assert_checkequal(uint16scalar, uint16scalar_ref);
+assert_checkequal(uint16rowvector, uint16rowvector_ref);
+assert_checkequal(uint16colvector, uint16colvector_ref);
+assert_checkequal(uint16matrix, uint16matrix_ref);
+emptyuint32matrix_ref = uint32([]);
+uint32scalar_ref = uint32(1);
+uint32rowvector_ref = uint32([1 4 7]);
+uint32colvector_ref = uint32([1;4;7]);
+uint32matrix_ref = uint32([1 4 7;9 6 3]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/uint32_v1.sod");
+assert_checkequal(emptyuint32matrix, emptyuint32matrix_ref);
+assert_checkequal(uint32scalar, uint32scalar_ref);
+assert_checkequal(uint32rowvector, uint32rowvector_ref);
+assert_checkequal(uint32colvector, uint32colvector_ref);
+assert_checkequal(uint32matrix, uint32matrix_ref);
+// undefined
+undefinedelement_ref=list(2,%i,'f',ones(3,3));
+undefinedelement_ref(6)="toto";
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/undefinedelement_v1.sod");
+assert_checkequal(undefinedelement, undefinedelement_ref);
+// void
+voidelement_ref=list(1,,3);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/voidelement_v1.sod");
+// Commented because of bug 9529
+//assert_checkequal(voidelement, voidelement_ref);
diff --git a/scilab/modules/hdf5/tests/unit_tests/loadhdf5data_v1.tst b/scilab/modules/hdf5/tests/unit_tests/loadhdf5data_v1.tst
new file mode 100644 (file)
index 0000000..9b2cfe1
--- /dev/null
@@ -0,0 +1,184 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 - DIGITEO - Sylvestre LEDRU
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// Load previously saved data (check backward compatibility)
+
+
+///// Double
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/matricedoublescalar_v1.sod");
+assert_checkequal(ascalar,42);
+
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/matricedouble_v1.sod");
+assert_checkequal(a,[2,3;4,5]);
+
+
+///// Double complex
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/matricedoublecomplex_v1.sod");
+assert_checkequal(b,[2+%i,3+%i*2;4+%i*%pi,5]);
+
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/matricedoublecomplexscalar_v1.sod");
+assert_checkequal(bscalar,42+%i);
+
+
+///// String
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/matricestring_v1.sod");
+assert_checkequal(c,["my matrix","of strings";"is","saved in Scilab data format"]);
+  
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/matricestringscalar_v1.sod");
+assert_checkequal(cscalar,["my single string"]);
+
+// Polynomials
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/polynomials_v1.sod");
+p_reference=poly([1 2],'s') ;
+assert_checkequal(p,p_reference);
+
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/polynomialscoef_v1.sod");
+q_reference=poly([1 42],'s','c');
+assert_checkequal(q,q_reference);
+
+
+// Boolean matrices
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/booleanscalar_v1.sod");
+assert_checkequal(bm,%t);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/booleanmatrix_v1.sod");
+assert_checkequal(bmm,[%t,%f; %f, %t]);
+
+// Sparse
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/sparsematrix_v1.sod");
+assert_checkequal(sp,sparse([1,2;4,5;3,10],[1,2,3]));
+
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/emptysparse_v1.sod");
+assert_checkequal(emptysparse,sparse([]));
+
+// boolean sparse
+dense=[%F, %F, %T, %F, %F
+%T, %F, %F, %F, %F
+%F, %F, %F, %F, %F
+%F, %F, %F, %F, %T];
+sp_reference=sparse(dense);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/booleansparse_v1.sod");
+assert_checkequal(sp,sp_reference);
+
+// List
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/list_v1.sod");
+assert_checkequal(ls,list(2,%i,'f',ones(3,3)));
+ls(2) =  list( %t, [32,42]); // alter ls to add the list
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/listnested_v1.sod");
+assert_checkequal(lsnested,ls);
+
+// tlist
+lst_reference  =  tlist(['random numbers';'Name';'Example'], 'Uniform',ones(1,2, 3));
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/tlist_v1.sod");
+assert_checkequal(lst,lst_reference);
+
+// mlist
+M_ref=mlist(['V','name','value'],['a','b';'c' 'd'],[1 2; 3 4]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/mlist_v1.sod");
+// Commented because of bug 9531
+//assert_checkequal(M_ref,M);
+
+// hypermatrices
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/hypermatrix_v1.sod");
+assert_checkequal(HM,hypermat([2 3 2 2],1:24));
+
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/hypermatrixcomplex_v1.sod");
+HMC_reference(1,1,1,1:2)=[1+%i 2*2*%i];
+assert_checkequal(HMC,HMC_reference);
+
+// int
+
+emptyint8matrix_ref = int8([]);
+int8scalar_ref = int8(1);
+int8rowvector_ref = int8([1 -4 7]);
+int8colvector_ref = int8([1;-4;7]);
+int8matrix_ref = int8([1 -4 7;-9 6 -3]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/int8_v1.sod");
+assert_checkequal(emptyint8matrix, emptyint8matrix_ref);
+assert_checkequal(int8scalar, int8scalar_ref);
+assert_checkequal(int8rowvector, int8rowvector_ref);
+assert_checkequal(int8colvector, int8colvector_ref);
+assert_checkequal(int8matrix, int8matrix_ref);
+
+
+emptyint16matrix_ref = int16([]);
+int16scalar_ref = int16(1);
+int16rowvector_ref = int16([1 -4 7]);
+int16colvector_ref = int16([1;-4;7]);
+int16matrix_ref = int16([1 -4 7;-9 6 -3]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/int16_v1.sod");
+assert_checkequal(emptyint16matrix, emptyint16matrix_ref);
+assert_checkequal(int16scalar, int16scalar_ref);
+assert_checkequal(int16rowvector, int16rowvector_ref);
+assert_checkequal(int16colvector, int16colvector_ref);
+assert_checkequal(int16matrix, int16matrix_ref);
+
+
+emptyint32matrix_ref = int32([]);
+int32scalar_ref = int32(1);
+int32rowvector_ref = int32([1 -4 7]);
+int32colvector_ref = int32([1;-4;7]);
+int32matrix_ref = int32([1 -4 7;-9 6 -3]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/int32_v1.sod");
+assert_checkequal(emptyint32matrix, emptyint32matrix_ref);
+assert_checkequal(int32scalar, int32scalar_ref);
+assert_checkequal(int32rowvector, int32rowvector_ref);
+assert_checkequal(int32colvector, int32colvector_ref);
+assert_checkequal(int32matrix, int32matrix_ref);
+
+
+emptyuint8matrix_ref = uint8([]);
+uint8scalar_ref = uint8(1);
+uint8rowvector_ref = uint8([1 4 7]);
+uint8colvector_ref = uint8([1;4;7]);
+uint8matrix_ref = uint8([1 4 7;9 6 3]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/uint8_v1.sod");
+assert_checkequal(emptyuint8matrix, emptyuint8matrix_ref);
+assert_checkequal(uint8scalar, uint8scalar_ref);
+assert_checkequal(uint8rowvector, uint8rowvector_ref);
+assert_checkequal(uint8colvector, uint8colvector_ref);
+assert_checkequal(uint8matrix, uint8matrix_ref);
+
+
+emptyuint16matrix_ref = uint16([]);
+uint16scalar_ref = uint16(1);
+uint16rowvector_ref = uint16([1 4 7]);
+uint16colvector_ref = uint16([1;4;7]);
+uint16matrix_ref = uint16([1 4 7;9 6 3]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/uint16_v1.sod");
+assert_checkequal(emptyuint16matrix, emptyuint16matrix_ref);
+assert_checkequal(uint16scalar, uint16scalar_ref);
+assert_checkequal(uint16rowvector, uint16rowvector_ref);
+assert_checkequal(uint16colvector, uint16colvector_ref);
+assert_checkequal(uint16matrix, uint16matrix_ref);
+
+
+emptyuint32matrix_ref = uint32([]);
+uint32scalar_ref = uint32(1);
+uint32rowvector_ref = uint32([1 4 7]);
+uint32colvector_ref = uint32([1;4;7]);
+uint32matrix_ref = uint32([1 4 7;9 6 3]);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/uint32_v1.sod");
+assert_checkequal(emptyuint32matrix, emptyuint32matrix_ref);
+assert_checkequal(uint32scalar, uint32scalar_ref);
+assert_checkequal(uint32rowvector, uint32rowvector_ref);
+assert_checkequal(uint32colvector, uint32colvector_ref);
+assert_checkequal(uint32matrix, uint32matrix_ref);
+
+
+// undefined
+undefinedelement_ref=list(2,%i,'f',ones(3,3));
+undefinedelement_ref(6)="toto";
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/undefinedelement_v1.sod");
+assert_checkequal(undefinedelement, undefinedelement_ref);
+
+
+// void
+voidelement_ref=list(1,,3);
+import_from_hdf5(SCI+"/modules/hdf5/tests/sample_scilab_data/voidelement_v1.sod");
+// Commented because of bug 9529
+//assert_checkequal(voidelement, voidelement_ref);
+