Fix bugs and it is now possible to read hyperslabs 22/9122/2
Calixte DENIZET [Mon, 24 Sep 2012 13:57:02 +0000 (15:57 +0200)]
Change-Id: Ia9a1b7d6effedce758a7550e5acb073cb2a7bfdd

53 files changed:
scilab/modules/hdf5/Makefile.am
scilab/modules/hdf5/Makefile.in
scilab/modules/hdf5/includes/gw_hdf5.h
scilab/modules/hdf5/sci_gateway/c/gw_hdf5.c
scilab/modules/hdf5/sci_gateway/cpp/sci_h5cp.cpp [new file with mode: 0644]
scilab/modules/hdf5/sci_gateway/cpp/sci_h5dump.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_h5flush.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_h5group.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_h5isfoo.cpp [new file with mode: 0644]
scilab/modules/hdf5/sci_gateway/cpp/sci_h5ln.cpp [new file with mode: 0644]
scilab/modules/hdf5/sci_gateway/cpp/sci_h5ls.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_h5open.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_h5read.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_h5readattr.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_h5rm.cpp [new file with mode: 0644]
scilab/modules/hdf5/sci_gateway/cpp/sci_percent_H5Object_e.cpp
scilab/modules/hdf5/sci_gateway/hdf5_gateway.xml
scilab/modules/hdf5/src/cpp/H5Attribute.cpp
scilab/modules/hdf5/src/cpp/H5Attribute.hxx
scilab/modules/hdf5/src/cpp/H5AttributesList.cpp
scilab/modules/hdf5/src/cpp/H5AttributesList.hxx
scilab/modules/hdf5/src/cpp/H5BasicData.hxx
scilab/modules/hdf5/src/cpp/H5CompoundData.hxx
scilab/modules/hdf5/src/cpp/H5Data.hxx
scilab/modules/hdf5/src/cpp/H5DataConverter.cpp
scilab/modules/hdf5/src/cpp/H5DataConverter.hxx
scilab/modules/hdf5/src/cpp/H5DataFactory.cpp
scilab/modules/hdf5/src/cpp/H5DataFactory.hxx
scilab/modules/hdf5/src/cpp/H5Dataset.cpp
scilab/modules/hdf5/src/cpp/H5Dataset.hxx
scilab/modules/hdf5/src/cpp/H5Dataspace.cpp
scilab/modules/hdf5/src/cpp/H5Dataspace.hxx
scilab/modules/hdf5/src/cpp/H5File.cpp
scilab/modules/hdf5/src/cpp/H5File.hxx
scilab/modules/hdf5/src/cpp/H5Group.cpp
scilab/modules/hdf5/src/cpp/H5Group.hxx
scilab/modules/hdf5/src/cpp/H5HardLink.cpp
scilab/modules/hdf5/src/cpp/H5Link.cpp
scilab/modules/hdf5/src/cpp/H5Link.hxx
scilab/modules/hdf5/src/cpp/H5ListObject.hxx
scilab/modules/hdf5/src/cpp/H5NamedObjectsList.hxx
scilab/modules/hdf5/src/cpp/H5Object.cpp
scilab/modules/hdf5/src/cpp/H5Object.hxx
scilab/modules/hdf5/src/cpp/H5ReferenceData.cpp [new file with mode: 0644]
scilab/modules/hdf5/src/cpp/H5ReferenceData.hxx
scilab/modules/hdf5/src/cpp/H5StringData.cpp [new file with mode: 0644]
scilab/modules/hdf5/src/cpp/H5StringData.hxx
scilab/modules/hdf5/src/cpp/H5TransformedData.hxx [new file with mode: 0644]
scilab/modules/hdf5/src/cpp/H5Type.cpp
scilab/modules/hdf5/src/cpp/H5Type.hxx
scilab/modules/hdf5/src/cpp/HDF5Scilab.cpp
scilab/modules/hdf5/src/cpp/HDF5Scilab.hxx
scilab/modules/hdf5/src/cpp/h5create.hpp

index 2d51e9c..18adf12 100644 (file)
@@ -38,7 +38,9 @@ HDF5_CXX_SOURCES = src/cpp/H5Attribute.cpp \
                   src/cpp/H5ExternalLink.cpp \
                   src/cpp/H5HardLink.cpp \
                   src/cpp/H5Link.cpp \
-                  src/cpp/HDF5Scilab.cpp
+                  src/cpp/HDF5Scilab.cpp \
+                  src/cpp/H5StringData.cpp \
+                  src/cpp/H5ReferenceData.cpp
 
 GATEWAY_C_SOURCES = sci_gateway/c/gw_hdf5.c
 
@@ -54,12 +56,14 @@ sci_gateway/cpp/sci_h5ls.cpp \
 sci_gateway/cpp/sci_percent_H5Object_p.cpp \
 sci_gateway/cpp/sci_percent_H5Object_e.cpp \
 sci_gateway/cpp/sci_h5group.cpp \
-sci_gateway/cpp/sci_h5delete.cpp \
+sci_gateway/cpp/sci_h5rm.cpp \
 sci_gateway/cpp/sci_h5dataset.cpp \
 sci_gateway/cpp/sci_h5attr.cpp \
-sci_gateway/cpp/sci_h5link.cpp \
+sci_gateway/cpp/sci_h5ln.cpp \
 sci_gateway/cpp/sci_h5readattr.cpp \
-sci_gateway/cpp/sci_h5flush.cpp
+sci_gateway/cpp/sci_h5flush.cpp \
+sci_gateway/cpp/sci_h5cp.cpp \
+sci_gateway/cpp/sci_h5isfoo.cpp
 
 if GIWS
 BUILT_SOURCES=giws
index f2d7390..4915056 100644 (file)
@@ -157,7 +157,9 @@ am__objects_2 = libscihdf5_algo_la-H5Attribute.lo \
        libscihdf5_algo_la-H5SoftLink.lo \
        libscihdf5_algo_la-H5ExternalLink.lo \
        libscihdf5_algo_la-H5HardLink.lo libscihdf5_algo_la-H5Link.lo \
-       libscihdf5_algo_la-HDF5Scilab.lo
+       libscihdf5_algo_la-HDF5Scilab.lo \
+       libscihdf5_algo_la-H5StringData.lo \
+       libscihdf5_algo_la-H5ReferenceData.lo
 am_libscihdf5_algo_la_OBJECTS = $(am__objects_1) $(am__objects_2)
 libscihdf5_algo_la_OBJECTS = $(am_libscihdf5_algo_la_OBJECTS)
 libscihdf5_la_DEPENDENCIES = libscihdf5-algo.la
@@ -170,10 +172,11 @@ am__objects_3 = libscihdf5_la-sci_export_to_hdf5.lo \
        libscihdf5_la-sci_h5ls.lo \
        libscihdf5_la-sci_percent_H5Object_p.lo \
        libscihdf5_la-sci_percent_H5Object_e.lo \
-       libscihdf5_la-sci_h5group.lo libscihdf5_la-sci_h5delete.lo \
+       libscihdf5_la-sci_h5group.lo libscihdf5_la-sci_h5rm.lo \
        libscihdf5_la-sci_h5dataset.lo libscihdf5_la-sci_h5attr.lo \
-       libscihdf5_la-sci_h5link.lo libscihdf5_la-sci_h5readattr.lo \
-       libscihdf5_la-sci_h5flush.lo
+       libscihdf5_la-sci_h5ln.lo libscihdf5_la-sci_h5readattr.lo \
+       libscihdf5_la-sci_h5flush.lo libscihdf5_la-sci_h5cp.lo \
+       libscihdf5_la-sci_h5isfoo.lo
 am__objects_4 = libscihdf5_la-gw_hdf5.lo
 am_libscihdf5_la_OBJECTS = $(am__objects_3) $(am__objects_4)
 libscihdf5_la_OBJECTS = $(am_libscihdf5_la_OBJECTS)
@@ -493,7 +496,9 @@ HDF5_CXX_SOURCES = src/cpp/H5Attribute.cpp \
                   src/cpp/H5ExternalLink.cpp \
                   src/cpp/H5HardLink.cpp \
                   src/cpp/H5Link.cpp \
-                  src/cpp/HDF5Scilab.cpp
+                  src/cpp/HDF5Scilab.cpp \
+                  src/cpp/H5StringData.cpp \
+                  src/cpp/H5ReferenceData.cpp
 
 GATEWAY_C_SOURCES = sci_gateway/c/gw_hdf5.c
 GATEWAY_CXX_SOURCES = sci_gateway/cpp/sci_export_to_hdf5.cpp \
@@ -508,12 +513,14 @@ sci_gateway/cpp/sci_h5ls.cpp \
 sci_gateway/cpp/sci_percent_H5Object_p.cpp \
 sci_gateway/cpp/sci_percent_H5Object_e.cpp \
 sci_gateway/cpp/sci_h5group.cpp \
-sci_gateway/cpp/sci_h5delete.cpp \
+sci_gateway/cpp/sci_h5rm.cpp \
 sci_gateway/cpp/sci_h5dataset.cpp \
 sci_gateway/cpp/sci_h5attr.cpp \
-sci_gateway/cpp/sci_h5link.cpp \
+sci_gateway/cpp/sci_h5ln.cpp \
 sci_gateway/cpp/sci_h5readattr.cpp \
-sci_gateway/cpp/sci_h5flush.cpp
+sci_gateway/cpp/sci_h5flush.cpp \
+sci_gateway/cpp/sci_h5cp.cpp \
+sci_gateway/cpp/sci_h5isfoo.cpp
 
 @GIWS_TRUE@BUILT_SOURCES = giws
 
@@ -795,7 +802,9 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-H5Link.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-H5LinksList.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-H5Object.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-H5ReferenceData.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-H5SoftLink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-H5StringData.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-H5Type.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-H5VariableScope.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_algo_la-HDF5Scilab.Plo@am__quote@
@@ -809,16 +818,18 @@ distclean-compile:
 @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_h5attr.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5close.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5cp.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5dataset.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5delete.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5dump.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5flush.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5group.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5link.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5isfoo.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5ln.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5ls.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5open.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5read.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5readattr.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5rm.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_import_from_hdf5.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_is_hdf5_file.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_listvar_in_hdf5.Plo@am__quote@
@@ -1035,6 +1046,20 @@ libscihdf5_algo_la-HDF5Scilab.lo: src/cpp/HDF5Scilab.cpp
 @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-HDF5Scilab.lo `test -f 'src/cpp/HDF5Scilab.cpp' || echo '$(srcdir)/'`src/cpp/HDF5Scilab.cpp
 
+libscihdf5_algo_la-H5StringData.lo: src/cpp/H5StringData.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-H5StringData.lo -MD -MP -MF $(DEPDIR)/libscihdf5_algo_la-H5StringData.Tpo -c -o libscihdf5_algo_la-H5StringData.lo `test -f 'src/cpp/H5StringData.cpp' || echo '$(srcdir)/'`src/cpp/H5StringData.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscihdf5_algo_la-H5StringData.Tpo $(DEPDIR)/libscihdf5_algo_la-H5StringData.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='src/cpp/H5StringData.cpp' object='libscihdf5_algo_la-H5StringData.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-H5StringData.lo `test -f 'src/cpp/H5StringData.cpp' || echo '$(srcdir)/'`src/cpp/H5StringData.cpp
+
+libscihdf5_algo_la-H5ReferenceData.lo: src/cpp/H5ReferenceData.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-H5ReferenceData.lo -MD -MP -MF $(DEPDIR)/libscihdf5_algo_la-H5ReferenceData.Tpo -c -o libscihdf5_algo_la-H5ReferenceData.lo `test -f 'src/cpp/H5ReferenceData.cpp' || echo '$(srcdir)/'`src/cpp/H5ReferenceData.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscihdf5_algo_la-H5ReferenceData.Tpo $(DEPDIR)/libscihdf5_algo_la-H5ReferenceData.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='src/cpp/H5ReferenceData.cpp' object='libscihdf5_algo_la-H5ReferenceData.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-H5ReferenceData.lo `test -f 'src/cpp/H5ReferenceData.cpp' || echo '$(srcdir)/'`src/cpp/H5ReferenceData.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
@@ -1119,12 +1144,12 @@ libscihdf5_la-sci_h5group.lo: sci_gateway/cpp/sci_h5group.cpp
 @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_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscihdf5_la-sci_h5group.lo `test -f 'sci_gateway/cpp/sci_h5group.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5group.cpp
 
-libscihdf5_la-sci_h5delete.lo: sci_gateway/cpp/sci_h5delete.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_h5delete.lo -MD -MP -MF $(DEPDIR)/libscihdf5_la-sci_h5delete.Tpo -c -o libscihdf5_la-sci_h5delete.lo `test -f 'sci_gateway/cpp/sci_h5delete.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5delete.cpp
-@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscihdf5_la-sci_h5delete.Tpo $(DEPDIR)/libscihdf5_la-sci_h5delete.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_h5delete.cpp' object='libscihdf5_la-sci_h5delete.lo' libtool=yes @AMDEPBACKSLASH@
+libscihdf5_la-sci_h5rm.lo: sci_gateway/cpp/sci_h5rm.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_h5rm.lo -MD -MP -MF $(DEPDIR)/libscihdf5_la-sci_h5rm.Tpo -c -o libscihdf5_la-sci_h5rm.lo `test -f 'sci_gateway/cpp/sci_h5rm.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5rm.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscihdf5_la-sci_h5rm.Tpo $(DEPDIR)/libscihdf5_la-sci_h5rm.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_h5rm.cpp' object='libscihdf5_la-sci_h5rm.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_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscihdf5_la-sci_h5delete.lo `test -f 'sci_gateway/cpp/sci_h5delete.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5delete.cpp
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscihdf5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscihdf5_la-sci_h5rm.lo `test -f 'sci_gateway/cpp/sci_h5rm.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5rm.cpp
 
 libscihdf5_la-sci_h5dataset.lo: sci_gateway/cpp/sci_h5dataset.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_h5dataset.lo -MD -MP -MF $(DEPDIR)/libscihdf5_la-sci_h5dataset.Tpo -c -o libscihdf5_la-sci_h5dataset.lo `test -f 'sci_gateway/cpp/sci_h5dataset.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5dataset.cpp
@@ -1140,12 +1165,12 @@ libscihdf5_la-sci_h5attr.lo: sci_gateway/cpp/sci_h5attr.cpp
 @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_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscihdf5_la-sci_h5attr.lo `test -f 'sci_gateway/cpp/sci_h5attr.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5attr.cpp
 
-libscihdf5_la-sci_h5link.lo: sci_gateway/cpp/sci_h5link.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_h5link.lo -MD -MP -MF $(DEPDIR)/libscihdf5_la-sci_h5link.Tpo -c -o libscihdf5_la-sci_h5link.lo `test -f 'sci_gateway/cpp/sci_h5link.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5link.cpp
-@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscihdf5_la-sci_h5link.Tpo $(DEPDIR)/libscihdf5_la-sci_h5link.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_h5link.cpp' object='libscihdf5_la-sci_h5link.lo' libtool=yes @AMDEPBACKSLASH@
+libscihdf5_la-sci_h5ln.lo: sci_gateway/cpp/sci_h5ln.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_h5ln.lo -MD -MP -MF $(DEPDIR)/libscihdf5_la-sci_h5ln.Tpo -c -o libscihdf5_la-sci_h5ln.lo `test -f 'sci_gateway/cpp/sci_h5ln.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5ln.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscihdf5_la-sci_h5ln.Tpo $(DEPDIR)/libscihdf5_la-sci_h5ln.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_h5ln.cpp' object='libscihdf5_la-sci_h5ln.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_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscihdf5_la-sci_h5link.lo `test -f 'sci_gateway/cpp/sci_h5link.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5link.cpp
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscihdf5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscihdf5_la-sci_h5ln.lo `test -f 'sci_gateway/cpp/sci_h5ln.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5ln.cpp
 
 libscihdf5_la-sci_h5readattr.lo: sci_gateway/cpp/sci_h5readattr.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_h5readattr.lo -MD -MP -MF $(DEPDIR)/libscihdf5_la-sci_h5readattr.Tpo -c -o libscihdf5_la-sci_h5readattr.lo `test -f 'sci_gateway/cpp/sci_h5readattr.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5readattr.cpp
@@ -1161,6 +1186,20 @@ libscihdf5_la-sci_h5flush.lo: sci_gateway/cpp/sci_h5flush.cpp
 @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_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscihdf5_la-sci_h5flush.lo `test -f 'sci_gateway/cpp/sci_h5flush.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5flush.cpp
 
+libscihdf5_la-sci_h5cp.lo: sci_gateway/cpp/sci_h5cp.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_h5cp.lo -MD -MP -MF $(DEPDIR)/libscihdf5_la-sci_h5cp.Tpo -c -o libscihdf5_la-sci_h5cp.lo `test -f 'sci_gateway/cpp/sci_h5cp.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5cp.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscihdf5_la-sci_h5cp.Tpo $(DEPDIR)/libscihdf5_la-sci_h5cp.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_h5cp.cpp' object='libscihdf5_la-sci_h5cp.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_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscihdf5_la-sci_h5cp.lo `test -f 'sci_gateway/cpp/sci_h5cp.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5cp.cpp
+
+libscihdf5_la-sci_h5isfoo.lo: sci_gateway/cpp/sci_h5isfoo.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_h5isfoo.lo -MD -MP -MF $(DEPDIR)/libscihdf5_la-sci_h5isfoo.Tpo -c -o libscihdf5_la-sci_h5isfoo.lo `test -f 'sci_gateway/cpp/sci_h5isfoo.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5isfoo.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscihdf5_la-sci_h5isfoo.Tpo $(DEPDIR)/libscihdf5_la-sci_h5isfoo.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_h5isfoo.cpp' object='libscihdf5_la-sci_h5isfoo.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_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscihdf5_la-sci_h5isfoo.lo `test -f 'sci_gateway/cpp/sci_h5isfoo.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5isfoo.cpp
+
 mostlyclean-libtool:
        -rm -f *.lo
 
index 02a764c..0a85af3 100644 (file)
@@ -29,12 +29,21 @@ HDF5_SCILAB_IMPEXP int sci_h5ls(char *fname, unsigned long fname_len);
 HDF5_SCILAB_IMPEXP int sci_percent_H5Object_p(char *fname, unsigned long fname_len);
 HDF5_SCILAB_IMPEXP int sci_percent_H5Object_e(char *fname, unsigned long fname_len);
 HDF5_SCILAB_IMPEXP int sci_h5group(char *fname, unsigned long fname_len);
-HDF5_SCILAB_IMPEXP int sci_h5delete(char *fname, unsigned long fname_len);
+HDF5_SCILAB_IMPEXP int sci_h5rm(char *fname, unsigned long fname_len);
 HDF5_SCILAB_IMPEXP int sci_h5dataset(char *fname, unsigned long fname_len);
 HDF5_SCILAB_IMPEXP int sci_h5attr(char *fname, unsigned long fname_len);
-HDF5_SCILAB_IMPEXP int sci_h5link(char *fname, unsigned long fname_len);
+HDF5_SCILAB_IMPEXP int sci_h5ln(char *fname, unsigned long fname_len);
 HDF5_SCILAB_IMPEXP int sci_h5readattr(char *fname, unsigned long fname_len);
 HDF5_SCILAB_IMPEXP int sci_h5flush(char *fname, unsigned long fname_len);
+HDF5_SCILAB_IMPEXP int sci_h5cp(char *fname, unsigned long fname_len);
+HDF5_SCILAB_IMPEXP int sci_h5isFile(char *fname, unsigned long fname_len);
+HDF5_SCILAB_IMPEXP int sci_h5isGroup(char *fname, unsigned long fname_len);
+HDF5_SCILAB_IMPEXP int sci_h5isSet(char *fname, unsigned long fname_len);
+HDF5_SCILAB_IMPEXP int sci_h5isAttr(char *fname, unsigned long fname_len);
+HDF5_SCILAB_IMPEXP int sci_h5isSpace(char *fname, unsigned long fname_len);
+HDF5_SCILAB_IMPEXP int sci_h5isType(char *fname, unsigned long fname_len);
+HDF5_SCILAB_IMPEXP int sci_h5isRef(char *fname, unsigned long fname_len);
+HDF5_SCILAB_IMPEXP int sci_h5isList(char *fname, unsigned long fname_len);
 /*--------------------------------------------------------------------------*/
 #endif /* __GW_HDF5_H__ */
 /*--------------------------------------------------------------------------*/
index 69771e1..c06fc9f 100644 (file)
@@ -33,12 +33,21 @@ static gw_generic_table Tab[] =
     {sci_percent_H5Object_p, "%H5Object_p"},
     {sci_percent_H5Object_e, "%H5Object_e"},
     {sci_h5group, "h5group"},
-    {sci_h5delete, "h5delete"},
+    {sci_h5rm, "h5rm"},
     {sci_h5dataset, "h5dataset"},
     {sci_h5attr, "h5attr"},
-    {sci_h5link, "h5link"},
+    {sci_h5ln, "h5ln"},
     {sci_h5readattr, "h5readattr"},
     {sci_h5flush, "h5flush"},
+    {sci_h5cp, "h5cp"},
+    {sci_h5isFile, "h5isFile"},
+    {sci_h5isGroup, "h5isGroup"},
+    {sci_h5isSet, "h5isSet"},
+    {sci_h5isAttr, "h5isAttr"},
+    {sci_h5isSpace, "h5isSpace"},
+    {sci_h5isType, "h5isType"},
+    {sci_h5isRef, "h5isRef"},
+    {sci_h5isList, "h5isList"},
 };
 /*--------------------------------------------------------------------------*/
 int gw_hdf5(void)
diff --git a/scilab/modules/hdf5/sci_gateway/cpp/sci_h5cp.cpp b/scilab/modules/hdf5/sci_gateway/cpp/sci_h5cp.cpp
new file mode 100644 (file)
index 0000000..a0c84da
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - Scilab Enterprises - Calixte DENIZET
+ *
+ * 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 "gw_hdf5.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "localization.h"
+#include "expandPathVariable.h"
+}
+
+#include "HDF5Scilab.hxx"
+#include "H5File.hxx"
+
+using namespace org_modules_hdf5;
+
+/*--------------------------------------------------------------------------*/
+int sci_h5cp(char *fname, unsigned long fname_len)
+{
+    SciErr err;
+    H5Object * sobj = 0;
+    H5Object * dobj = 0;
+    int * addr = 0;
+    char * str = 0;
+    char * expandedPath = 0;
+    std::string sfile;
+    std::string dfile;
+    std::string sloc;
+    std::string dloc("");
+
+    CheckLhs(1, 1);
+    CheckRhs(2, 4);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+        return 0;
+    }
+
+    if (HDF5Scilab::isH5Object(addr, pvApiCtx))
+    {
+        sobj = HDF5Scilab::getH5Object(addr, pvApiCtx);
+        if (!sobj)
+        {
+            Scierror(999, _("%s: Invalid H5Object.\n"), fname);
+            return 0;
+        }
+    }
+    else
+    {
+        if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
+        {
+            Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
+            return 0;
+        }
+
+        if (getAllocatedSingleString(pvApiCtx, addr, &str) != 0)
+        {
+            Scierror(999, _("%s: No more memory.\n"), fname);
+            return 0;
+        }
+
+        expandedPath = expandPathVariable(str);
+        freeAllocatedSingleString(str);
+        sfile = std::string(expandedPath);
+        FREE(expandedPath);
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
+        return 0;
+    }
+
+    if (HDF5Scilab::isH5Object(addr, pvApiCtx))
+    {
+        dobj = HDF5Scilab::getH5Object(addr, pvApiCtx);
+        if (!dobj)
+        {
+            Scierror(999, _("%s: Invalid H5Object.\n"), fname);
+            return 0;
+        }
+    }
+    else
+    {
+        if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
+        {
+            Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
+            return 0;
+        }
+
+        if (getAllocatedSingleString(pvApiCtx, addr, &str) != 0)
+        {
+            Scierror(999, _("%s: No more memory.\n"), fname);
+            return 0;
+        }
+
+        if (Rhs == 3)
+        {
+            expandedPath = expandPathVariable(str);
+            dfile = std::string(expandedPath);
+            FREE(expandedPath);
+        }
+        else
+        {
+            sloc = std::string(str);
+        }
+        freeAllocatedSingleString(str);
+    }
+
+    if (Rhs >= 3)
+    {
+        err = getVarAddressFromPosition(pvApiCtx, 3, &addr);
+        if (err.iErr)
+        {
+            printError(&err, 0);
+            Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 3);
+            return 0;
+        }
+
+        if (HDF5Scilab::isH5Object(addr, pvApiCtx))
+        {
+            dobj = HDF5Scilab::getH5Object(addr, pvApiCtx);
+            if (!dobj)
+            {
+                Scierror(999, _("%s: Invalid H5Object.\n"), fname);
+                return 0;
+            }
+        }
+        else
+        {
+            if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
+            {
+                Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 3);
+                return 0;
+            }
+
+            if (getAllocatedSingleString(pvApiCtx, addr, &str) != 0)
+            {
+                Scierror(999, _("%s: No more memory.\n"), fname);
+                return 0;
+            }
+
+            if (Rhs == 4)
+            {
+                expandedPath = expandPathVariable(str);
+                dfile = std::string(expandedPath);
+                FREE(expandedPath);
+            }
+            else
+            {
+                dloc = std::string(str);
+            }
+            freeAllocatedSingleString(str);
+        }
+
+        if (Rhs == 4)
+        {
+            err = getVarAddressFromPosition(pvApiCtx, 4, &addr);
+            if (err.iErr)
+            {
+                printError(&err, 0);
+                Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 4);
+                return 0;
+            }
+
+            if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
+            {
+                Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 3);
+                return 0;
+            }
+
+            if (getAllocatedSingleString(pvApiCtx, addr, &str) != 0)
+            {
+                Scierror(999, _("%s: No more memory.\n"), fname);
+                return 0;
+            }
+
+            dloc = std::string(str);
+            freeAllocatedSingleString(str);
+        }
+    }
+
+    try
+    {
+        if (sobj)
+        {
+            if (dobj)
+            {
+                HDF5Scilab::copy(*sobj, *dobj, dloc);
+            }
+            else
+            {
+                HDF5Scilab::copy(*sobj, dfile, dloc);
+            }
+        }
+        else
+        {
+            if (dobj)
+            {
+                HDF5Scilab::copy(sfile, sloc, *dobj, dloc);
+            }
+            else
+            {
+                HDF5Scilab::copy(sfile, sloc, dfile, dloc);
+            }
+        }
+    }
+    catch (const std::exception & e)
+    {
+        Scierror(999, _("%s: %s\n"), fname, e.what());
+        return 0;
+    }
+
+    LhsVar(1) = 0;
+    PutLhsVar();
+
+    return 0;
+}
index dd13563..3714308 100644 (file)
@@ -54,7 +54,7 @@ int sci_h5dump(char *fname, unsigned long fname_len)
 
         if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
         {
-            Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
+            Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
             return 0;
         }
 
@@ -88,9 +88,9 @@ int sci_h5dump(char *fname, unsigned long fname_len)
             {
                 hobj = &H5Object::getObject(*hobj, name);
             }
-            catch (H5Exception & e)
+            catch (const std::exception & e)
             {
-                Scierror(999, gettext("%s: %s\n"), fname, e.what());
+                Scierror(999, _("%s: %s\n"), fname, e.what());
                 return 0;
             }
         }
@@ -103,7 +103,7 @@ int sci_h5dump(char *fname, unsigned long fname_len)
     {
         if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
         {
-            Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
+            Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
             return 0;
         }
 
@@ -126,7 +126,7 @@ int sci_h5dump(char *fname, unsigned long fname_len)
             }
             FREE(expandedPath);
         }
-        catch (const H5Exception & e)
+        catch (const std::exception & e)
         {
             Scierror(999, _("%s: %s\n"), fname, e.what());
             FREE(expandedPath);
@@ -142,7 +142,7 @@ int sci_h5dump(char *fname, unsigned long fname_len)
             delete hobj;
         }
     }
-    catch (const H5Exception & e)
+    catch (const std::exception & e)
     {
         Scierror(999, _("%s: %s\n"), fname, e.what());
         if (mustDelete)
index 2438195..c58763e 100644 (file)
@@ -87,7 +87,7 @@ int sci_h5flush(char *fname, unsigned long fname_len)
     {
         hobj->getFile().flush(_local);
     }
-    catch (const H5Exception & e)
+    catch (const std::exception & e)
     {
         Scierror(999, _("%s: %s\n"), fname, e.what());
         return 0;
index 173d9d3..055c59c 100644 (file)
@@ -88,7 +88,7 @@ int sci_h5group(char *fname, unsigned long fname_len)
         group = &H5Group::createGroup(*hobj, _name);
         group->createOnScilabStack(Rhs + 1, pvApiCtx);
     }
-    catch (const H5Exception & e)
+    catch (const std::exception & e)
     {
         Scierror(999, _("%s: %s\n"), fname, e.what());
         return 0;
diff --git a/scilab/modules/hdf5/sci_gateway/cpp/sci_h5isfoo.cpp b/scilab/modules/hdf5/sci_gateway/cpp/sci_h5isfoo.cpp
new file mode 100644 (file)
index 0000000..6e31450
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - Scilab Enterprises - Calixte DENIZET
+ *
+ * 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
+ *
+ */
+
+#include <set>
+#include <string>
+
+extern "C"
+{
+#include "gw_hdf5.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "localization.h"
+}
+
+#include "HDF5Scilab.hxx"
+
+using namespace org_modules_hdf5;
+
+/*--------------------------------------------------------------------------*/
+inline static int sci_h5isfoo(const HDF5Scilab::H5ObjectType type, char * fname, unsigned long fname_len)
+{
+    H5Object * hobj = 0;
+    SciErr err;
+    int * addr = 0;
+    bool ok = false;
+
+    CheckLhs(1, 1);
+    CheckRhs(1, 1);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+        return 0;
+    }
+
+    if (HDF5Scilab::isH5Object(addr, pvApiCtx))
+    {
+        hobj = HDF5Scilab::getH5Object(addr, pvApiCtx);
+        if (!hobj)
+        {
+            Scierror(999, _("%s: Invalid H5Object.\n"), fname);
+            return 0;
+        }
+    }
+    else
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d: A H5Object expected.\n"), fname, 1);
+        return 0;
+    }
+
+    try
+    {
+        ok = HDF5Scilab::checkType(*hobj, type);
+    }
+    catch (const std::exception & e)
+    {
+        Scierror(999, _("%s: %s\n"), fname, e.what());
+        return 0;
+    }
+
+    if (createScalarBoolean(pvApiCtx, Rhs + 1, ok ? 1 : 0))
+    {
+        Scierror(999, _("%s: Can not create output argument.\n"), fname);
+        return 0;
+    }
+
+    LhsVar(1) = Rhs + 1;
+    PutLhsVar();
+
+    return 0;
+}
+/*--------------------------------------------------------------------------*/
+
+int sci_h5isFile(char * fname, unsigned long fname_len)
+{
+    return sci_h5isfoo(HDF5Scilab::H5FILE, fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+
+int sci_h5isGroup(char * fname, unsigned long fname_len)
+{
+    return sci_h5isfoo(HDF5Scilab::H5GROUP, fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+
+int sci_h5isSet(char * fname, unsigned long fname_len)
+{
+    return sci_h5isfoo(HDF5Scilab::H5DATASET, fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+
+int sci_h5isAttr(char * fname, unsigned long fname_len)
+{
+    return sci_h5isfoo(HDF5Scilab::H5ATTRIBUTE, fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+
+int sci_h5isSpace(char * fname, unsigned long fname_len)
+{
+    return sci_h5isfoo(HDF5Scilab::H5SPACE, fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+
+int sci_h5isType(char * fname, unsigned long fname_len)
+{
+    return sci_h5isfoo(HDF5Scilab::H5TYPE, fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+
+int sci_h5isRef(char * fname, unsigned long fname_len)
+{
+    return sci_h5isfoo(HDF5Scilab::H5REFERENCE, fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
+int sci_h5isList(char * fname, unsigned long fname_len)
+{
+    return sci_h5isfoo(HDF5Scilab::H5LIST, fname, fname_len);
+}
+/*--------------------------------------------------------------------------*/
diff --git a/scilab/modules/hdf5/sci_gateway/cpp/sci_h5ln.cpp b/scilab/modules/hdf5/sci_gateway/cpp/sci_h5ln.cpp
new file mode 100644 (file)
index 0000000..3265838
--- /dev/null
@@ -0,0 +1,200 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - Scilab Enterprises - Calixte DENIZET
+ *
+ * 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
+ *
+ */
+
+#include <string>
+
+extern "C"
+{
+#include "gw_hdf5.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "localization.h"
+}
+
+#include "HDF5Scilab.hxx"
+
+using namespace org_modules_hdf5;
+
+/*--------------------------------------------------------------------------*/
+int sci_h5ln(char *fname, unsigned long fname_len)
+{
+    H5Object * hobj = 0;
+    H5Object * target = 0;
+    SciErr err;
+    int * addr = 0;
+    char * name = 0;
+    char * targetName = 0;
+    char * targetFile = 0;
+    std::string _name;
+    std::string _targetName;
+    std::string _targetFile;
+    int _hard = 0;
+    bool hard = false;
+
+    CheckLhs(1, 1);
+    CheckRhs(3, 4);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+        return 0;
+    }
+
+    if (HDF5Scilab::isH5Object(addr, pvApiCtx))
+    {
+        hobj = HDF5Scilab::getH5Object(addr, pvApiCtx);
+        if (!hobj)
+        {
+            Scierror(999, _("%s: Can not print H5Object: invalid object.\n"), fname);
+            return 0;
+        }
+    }
+    else
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d: A H5Object expected.\n"), fname, 1);
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
+        return 0;
+    }
+
+    if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
+        return 0;
+    }
+
+    if (getAllocatedSingleString(pvApiCtx, addr, &name) != 0)
+    {
+        Scierror(999, _("%s: No more memory.\n"), fname);
+        return 0;
+    }
+
+    _name = std::string(name);
+    freeAllocatedSingleString(name);
+
+    err = getVarAddressFromPosition(pvApiCtx, 3, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 3);
+        return 0;
+    }
+
+    if (HDF5Scilab::isH5Object(addr, pvApiCtx))
+    {
+        target = HDF5Scilab::getH5Object(addr, pvApiCtx);
+        if (!target)
+        {
+            Scierror(999, _("%s: Can not use H5Object: invalid object.\n"), fname);
+            return 0;
+        }
+    }
+    else
+    {
+        if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
+        {
+            Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 3);
+            return 0;
+        }
+
+        if (getAllocatedSingleString(pvApiCtx, addr, &targetName) != 0)
+        {
+            Scierror(999, _("%s: No more memory.\n"), fname);
+            return 0;
+        }
+
+        _targetName = std::string(targetName);
+        freeAllocatedSingleString(targetName);
+    }
+
+    if (Rhs == 4)
+    {
+        err = getVarAddressFromPosition(pvApiCtx, 4, &addr);
+        if (err.iErr)
+        {
+            printError(&err, 0);
+            Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 4);
+            return 0;
+        }
+
+        if (!checkVarDimension(pvApiCtx, addr, 1, 1))
+        {
+            Scierror(999, _("%s: Wrong size for input argument #%d.\n"), fname, 4);
+            return 0;
+        }
+
+        if (isBooleanType(pvApiCtx, addr))
+        {
+            if (getScalarBoolean(pvApiCtx, addr, &_hard) != 0)
+            {
+                Scierror(999, _("%s: No more memory.\n"), fname);
+                return 0;
+            }
+
+            hard = _hard != 0;
+        }
+        else if (isStringType(pvApiCtx, addr) && !_targetName.empty())
+        {
+            if (getAllocatedSingleString(pvApiCtx, addr, &targetFile) != 0)
+            {
+                Scierror(999, _("%s: No more memory.\n"), fname);
+                return 0;
+            }
+
+            _targetFile = std::string(targetFile);
+            freeAllocatedSingleString(targetFile);
+        }
+        else
+        {
+            Scierror(999, _("%s: Wrong type for input argument #%d: A string or a boolean expected.\n"), fname);
+            return 0;
+        }
+    }
+
+    try
+    {
+        if (target)
+        {
+            HDF5Scilab::createLink(*hobj, _name, *target, hard);
+        }
+        else
+        {
+            if (_targetFile.empty())
+            {
+                HDF5Scilab::createLink(*hobj, _name, _targetName, hard);
+            }
+            else
+            {
+                HDF5Scilab::createLink(*hobj, _name, _targetName, _targetFile);
+            }
+        }
+    }
+    catch (const std::exception & e)
+    {
+        Scierror(999, _("%s: %s\n"), fname, e.what());
+        return 0;
+    }
+
+    LhsVar(1) = 0;
+    PutLhsVar();
+
+    return 0;
+}
+
+/*--------------------------------------------------------------------------*/
index f4b8eac..ddb5259 100644 (file)
@@ -32,37 +32,15 @@ int sci_h5ls(char *fname, unsigned long fname_len)
     H5Object * hobj = 0;
     SciErr err;
     int * addr = 0;
-    char * path = 0;
+    char * str = 0;
     char * expandedPath = 0;
-    char * name = 0;
+    std::string path;
+    std::string name;
     bool mustDelete = true;
 
     CheckLhs(1, 1);
     CheckRhs(1, 2);
 
-    if (Rhs == 2)
-    {
-        err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
-        if (err.iErr)
-        {
-            printError(&err, 0);
-            Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
-            return 0;
-        }
-
-        if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
-        {
-            Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
-            return 0;
-        }
-
-        if (getAllocatedSingleString(pvApiCtx, addr, &name) != 0)
-        {
-            Scierror(999, _("%s: No more memory.\n"), fname);
-            return 0;
-        }
-    }
-
     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
     if (err.iErr)
     {
@@ -79,22 +57,6 @@ int sci_h5ls(char *fname, unsigned long fname_len)
             Scierror(999, _("%s: Can not print H5Object: invalid object.\n"), fname);
             return 0;
         }
-        if (Rhs == 2)
-        {
-            try
-            {
-                hobj = &H5Object::getObject(*hobj, name);
-            }
-            catch (H5Exception & e)
-            {
-                Scierror(999, _("%s: %s\n"), fname, e.what());
-                return 0;
-            }
-        }
-        else
-        {
-            mustDelete = false;
-        }
     }
     else
     {
@@ -104,55 +66,63 @@ int sci_h5ls(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        if (getAllocatedSingleString(pvApiCtx, addr, &path) != 0)
+        if (getAllocatedSingleString(pvApiCtx, addr, &str) != 0)
         {
             Scierror(999, _("%s: No more memory.\n"), fname);
             return 0;
         }
-        expandedPath = expandPathVariable(path);
-        freeAllocatedSingleString(path);
-        try
+        expandedPath = expandPathVariable(str);
+        freeAllocatedSingleString(str);
+        path = std::string(expandedPath);
+        FREE(expandedPath);
+    }
+
+    if (Rhs == 2)
+    {
+        err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
+        if (err.iErr)
         {
-            if (Rhs == 2)
-            {
-                hobj = new H5File((const char *)expandedPath, (const char *)name, "r");
-            }
-            else
-            {
-                hobj = new H5File((const char *)expandedPath, "/", "r");
-            }
-            FREE(expandedPath);
+            printError(&err, 0);
+            Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
+            return 0;
         }
-        catch (const H5Exception & e)
+
+        if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
         {
-            Scierror(999, _("%s: %s\n"), fname, e.what());
-            FREE(expandedPath);
+            Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
             return 0;
         }
+
+        if (getAllocatedSingleString(pvApiCtx, addr, &str) != 0)
+        {
+            Scierror(999, _("%s: No more memory.\n"), fname);
+            return 0;
+        }
+
+        name = std::string(str);
+        freeAllocatedSingleString(str);
     }
 
     try
     {
-        HDF5Scilab::scilabPrint(hobj->ls());
-        if (mustDelete)
+        if (hobj)
         {
-            delete hobj;
+            HDF5Scilab::ls(*hobj, name, Rhs + 1, pvApiCtx);
+        }
+        else
+        {
+            HDF5Scilab::ls(path, name, Rhs + 1, pvApiCtx);
         }
     }
-    catch (const H5Exception & e)
+    catch (const std::exception & e)
     {
         Scierror(999, _("%s: %s\n"), fname, e.what());
-        if (mustDelete)
-        {
-            delete hobj;
-        }
         return 0;
     }
 
-    LhsVar(1) = 0;
+    LhsVar(1) = Rhs + 1;
     PutLhsVar();
 
     return 0;
 }
-
 /*--------------------------------------------------------------------------*/
index 3b2faea..797675b 100644 (file)
@@ -120,7 +120,7 @@ int sci_h5open(char *fname, unsigned long fname_len)
         }
         FREE(path);
     }
-    catch (const H5Exception & e)
+    catch (const std::exception & e)
     {
         for (int i = 0; i < Rhs; i++)
         {
@@ -135,7 +135,7 @@ int sci_h5open(char *fname, unsigned long fname_len)
     {
         h5file->createOnScilabStack(Rhs + 1, pvApiCtx);
     }
-    catch (const H5Exception & e)
+    catch (const std::exception & e)
     {
         Scierror(999, _("%s: %s\n"), fname, e.what());
         delete h5file;
index effb835..1322588 100644 (file)
@@ -34,9 +34,17 @@ int sci_h5read(char *fname, unsigned long fname_len)
     char * location = 0;
     std::string _expandedPath;
     std::string _location;
+    double * start = 0;
+    double * stride = 0;
+    double * count = 0;
+    double * block = 0;
+    double ** dptrs[4] = {&start, &count, &stride, &block};
+    int inc = 0;
+    int row, col;
+    unsigned int size = 0;
 
     CheckLhs(1, 1);
-    CheckRhs(1, 2);
+    CheckRhs(1, 6);
 
     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
     if (err.iErr)
@@ -57,12 +65,6 @@ int sci_h5read(char *fname, unsigned long fname_len)
     }
     else
     {
-        if (Rhs != 2)
-        {
-            Scierror(999, _("%s: Invalid number of arguments: %d expected.\n"), fname, 2);
-            return 0;
-        }
-
         if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
         {
             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
@@ -81,7 +83,7 @@ int sci_h5read(char *fname, unsigned long fname_len)
         freeAllocatedSingleString(path);
     }
 
-    if (Rhs == 2)
+    if (Rhs >= 2)
     {
         err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
         if (err.iErr)
@@ -91,38 +93,98 @@ int sci_h5read(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
+        if (isStringType(pvApiCtx, addr))
         {
-            Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
-            return 0;
+            if (getAllocatedSingleString(pvApiCtx, addr, &location) != 0)
+            {
+                Scierror(999, _("%s: No more memory.\n"), fname);
+                return 0;
+            }
+
+            _location = std::string(location);
+            freeAllocatedSingleString(location);
         }
-
-        if (getAllocatedSingleString(pvApiCtx, addr, &location) != 0)
+        else
         {
-            Scierror(999, _("%s: No more memory.\n"), fname);
-            return 0;
+            _location = std::string(".");
+
+            if (isDoubleType(pvApiCtx, addr))
+            {
+                err = getMatrixOfDouble(pvApiCtx, addr, &row, &col, dptrs[0]);
+                if (row != 1 && col != 1)
+                {
+                    Scierror(999, _("%s: Bad dimensions for input argument #%d: a row or a column expected.\n"), fname, 2);
+                    return 0;
+                }
+
+                if (size == 0)
+                {
+                    size = row > col ? row : col;
+                }
+                else if (size != (row > col ? row : col))
+                {
+                    Scierror(999, _("%s: Bad dimensions for input argument #%d: the same size are expected.\n"), fname, 2);
+                    return 0;
+                }
+
+                inc = 1;
+            }
+            else
+            {
+                Scierror(999, _("%s: Wrong type for input argument #%d: A row of doubles expected.\n"), fname, 2);
+                return 0;
+            }
         }
-
-        _location = std::string(location);
-        freeAllocatedSingleString(location);
     }
-    else
+
+
+    for (unsigned int i = 3; i <= Rhs; i++)
     {
-        _location = std::string(".");
+        err = getVarAddressFromPosition(pvApiCtx, i, &addr);
+        if (err.iErr)
+        {
+            printError(&err, 0);
+            Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, i);
+            return 0;
+        }
+        if (isDoubleType(pvApiCtx, addr))
+        {
+            err = getMatrixOfDouble(pvApiCtx, addr, &row, &col, dptrs[i - 3 + inc]);
+            if (row != 1 && col != 1)
+            {
+                Scierror(999, _("%s: Bad dimensions for input argument #%d: a row or a column expected.\n"), fname, i);
+                return 0;
+            }
+
+            if (size == 0)
+            {
+                size = row > col ? row : col;
+            }
+            else if (size != (row > col ? row : col))
+            {
+                Scierror(999, _("%s: Bad dimensions for input argument #%d: the same size are expected.\n"), fname, i);
+                return 0;
+            }
+        }
+        else
+        {
+            Scierror(999, _("%s: Wrong type for input argument #%d: A row of doubles expected.\n"), fname, i);
+            return 0;
+        }
     }
 
     try
     {
         if (hobj)
         {
-            HDF5Scilab::readData(*hobj, _location, Rhs + 1, pvApiCtx);
+            HDF5Scilab::readData(*hobj, _location, size, start, stride, count, block, Rhs + 1, pvApiCtx);
         }
         else
         {
-            HDF5Scilab::readData(_expandedPath, _location, Rhs + 1, pvApiCtx);
+            HDF5Scilab::readData(_expandedPath, _location, size, start, stride, count, block, Rhs + 1, pvApiCtx);
         }
     }
-    catch (const H5Exception & e)
+    catch (const std::exception & e)
     {
         Scierror(999, _("%s: %s\n"), fname, e.what());
         return 0;
index 2e1aa0b..cdf473e 100644 (file)
@@ -146,7 +146,7 @@ int sci_h5readattr(char *fname, unsigned long fname_len)
             HDF5Scilab::readAttributeData(_expandedPath, _location, _name, Rhs + 1, pvApiCtx);
         }
     }
-    catch (const H5Exception & e)
+    catch (const std::exception & e)
     {
         Scierror(999, _("%s: %s\n"), fname, e.what());
         return 0;
diff --git a/scilab/modules/hdf5/sci_gateway/cpp/sci_h5rm.cpp b/scilab/modules/hdf5/sci_gateway/cpp/sci_h5rm.cpp
new file mode 100644 (file)
index 0000000..ced9d47
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - Scilab Enterprises - Calixte DENIZET
+ *
+ * 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
+ *
+ */
+
+#include <set>
+#include <string>
+
+extern "C"
+{
+#include "gw_hdf5.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "localization.h"
+#include "sciprint.h"
+#include "expandPathVariable.h"
+}
+
+#include "HDF5Scilab.hxx"
+
+using namespace org_modules_hdf5;
+
+/*--------------------------------------------------------------------------*/
+int sci_h5rm(char *fname, unsigned long fname_len)
+{
+    H5Object * hobj = 0;
+    SciErr err;
+    int * addr = 0;
+    char * name = 0;
+    std::string _name;
+
+    CheckLhs(1, 1);
+    CheckRhs(1, 2);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+        return 0;
+    }
+
+    if (HDF5Scilab::isH5Object(addr, pvApiCtx))
+    {
+        hobj = HDF5Scilab::getH5Object(addr, pvApiCtx);
+        if (!hobj)
+        {
+            Scierror(999, _("%s: Can not print H5Object: invalid object.\n"), fname);
+            return 0;
+        }
+    }
+    else
+    {
+        Scierror(999, _("%s: Invalid input argument #%d: a H5Object expected.\n"), fname, 1);
+    }
+
+    if (Rhs == 2)
+    {
+        err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
+        if (err.iErr)
+        {
+            printError(&err, 0);
+            Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
+            return 0;
+        }
+
+        if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
+        {
+            Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
+            return 0;
+        }
+
+        if (getAllocatedSingleString(pvApiCtx, addr, &name) != 0)
+        {
+            Scierror(999, _("%s: No more memory.\n"), fname);
+            return 0;
+        }
+
+        _name = std::string(name);
+        freeAllocatedSingleString(name);
+    }
+
+    try
+    {
+        HDF5Scilab::deleteObject(*hobj, _name);
+    }
+    catch (const std::exception & e)
+    {
+        Scierror(999, _("%s: %s\n"), fname, e.what());
+        return 0;
+    }
+
+    LhsVar(1) = 0;
+    PutLhsVar();
+
+    return 0;
+}
+
+/*--------------------------------------------------------------------------*/
index 3105ccc..206965d 100644 (file)
@@ -13,6 +13,7 @@
 #include "H5Exception.hxx"
 #include "HDF5Scilab.hxx"
 #include "H5Object.hxx"
+#include "H5ReferenceData.hxx"
 
 extern "C"
 {
@@ -29,25 +30,28 @@ using namespace org_modules_hdf5;
 int sci_percent_H5Object_e(char * fname, unsigned long fname_len)
 {
     H5Object * obj = 0;
-    int id;
     SciErr err;
-    int * fieldaddr = 0;
-    int * mlistaddr = 0;
+    int * addr = 0;
     char * field = 0;
+    std::string _field;
     int fieldtype;
-    double index;
+    double  * index = 0;
 
     CheckLhs(1, 1);
-    CheckRhs(2, 2);
 
-    err = getVarAddressFromPosition(pvApiCtx, 1, &fieldaddr);
+    if (Rhs < 2)
+    {
+        Scierror(999, gettext("%s: Wrong number of input argument: More than %d expected.\n"), fname, 2);
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
     if (err.iErr)
     {
         printError(&err, 0);
         return 0;
     }
 
-    err = getVarType(pvApiCtx, fieldaddr, &fieldtype);
+    err = getVarType(pvApiCtx, addr, &fieldtype);
     if (err.iErr)
     {
         printError(&err, 0);
@@ -60,59 +64,110 @@ int sci_percent_H5Object_e(char * fname, unsigned long fname_len)
         return 0;
     }
 
-    err = getVarAddressFromPosition(pvApiCtx, 2, &mlistaddr);
+    if (fieldtype == sci_strings)
+    {
+        if (Rhs >= 3)
+        {
+            Scierror(999, gettext("%s: Only one field can be requested.\n"), fname);
+        }
+
+        if (getAllocatedSingleString(pvApiCtx, addr, &field) != 0)
+        {
+            Scierror(999, _("%s: No more memory.\n"), fname);
+            return 0;
+        }
+
+        _field = std::string(field);
+        freeAllocatedSingleString(field);
+    }
+    else
+    {
+        index = new double[Rhs - 1];
+
+        for (unsigned int i = 1; i <= Rhs - 1; i++)
+        {
+            err = getVarAddressFromPosition(pvApiCtx, i, &addr);
+            if (err.iErr)
+            {
+                delete[] index;
+                printError(&err, 0);
+                return 0;
+            }
+
+            if (getScalarDouble(pvApiCtx, addr, index + i - 1) != 0)
+            {
+                delete[] index;
+                Scierror(999, _("%s: No more memory.\n"), fname);
+                return 0;
+            }
+            index[i - 1]--;
+        }
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, Rhs, &addr);
     if (err.iErr)
     {
+        if (index)
+        {
+            delete[] index;
+        }
         printError(&err, 0);
-        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, Rhs);
         return 0;
     }
 
-    if (fieldtype == sci_strings)
+    if (HDF5Scilab::isH5Object(addr, pvApiCtx))
     {
-        if (getAllocatedSingleString(pvApiCtx, fieldaddr, &field) != 0)
+        obj = HDF5Scilab::getH5Object(addr, pvApiCtx);
+        if (!obj)
         {
-            Scierror(999, _("%s: No more memory.\n"), fname);
+            if (index)
+            {
+                delete[] index;
+            }
+            Scierror(999, _("%s: Invalid H5Object.\n"), fname);
             return 0;
         }
     }
     else
     {
-        if (getScalarDouble(pvApiCtx, fieldaddr, &index) != 0)
+        if (index)
         {
-            Scierror(999, _("%s: No more memory.\n"), fname);
-            return 0;
+            delete[] index;
         }
+        Scierror(999, gettext("%s: Wrong type for input argument #%i: A H5Object expected.\n"), fname, Rhs);
+        return 0;
     }
 
     try
     {
-        id = HDF5Scilab::getH5ObjectId(mlistaddr, pvApiCtx);
-        obj = H5VariableScope::getVariableFromId(id);
-
         if (fieldtype == sci_strings)
         {
-            obj->getAccessibleAttribute(std::string(field), Rhs + 1, pvApiCtx);
+            obj->getAccessibleAttribute(_field, Rhs + 1, pvApiCtx);
         }
         else
         {
-            obj->getAccessibleAttribute(index - 1, Rhs + 1, pvApiCtx);
+            if (obj->isReference())
+            {
+                H5ReferenceData * ref = reinterpret_cast<H5ReferenceData *>(obj);
+                H5Object & robj = ref->getReferencesObject(Rhs - 1, index);
+                robj.createOnScilabStack(Rhs + 1, pvApiCtx);
+            }
         }
     }
     catch (std::exception & e)
     {
-        if (fieldtype == sci_strings)
+        if (index)
         {
-            freeAllocatedSingleString(field);
+            delete[] index;
         }
         Scierror(999, _("%s: Error in retrieving field content:\n%s\n"), fname, e.what());
-
         return 0;
     }
 
-    if (fieldtype == sci_strings)
+    if (index)
     {
-        freeAllocatedSingleString(field);
+        delete[] index;
     }
 
     LhsVar(1) = Rhs + 1;
index e36d80f..7335ed0 100644 (file)
     <PRIMITIVE gatewayId="62" primitiveId="10" primitiveName="%H5Object_p" />
     <PRIMITIVE gatewayId="62" primitiveId="11" primitiveName="%H5Object_e" />
     <PRIMITIVE gatewayId="62" primitiveId="12" primitiveName="h5group" />
-    <PRIMITIVE gatewayId="62" primitiveId="13" primitiveName="h5delete" />
+    <PRIMITIVE gatewayId="62" primitiveId="13" primitiveName="h5rm" />
     <PRIMITIVE gatewayId="62" primitiveId="14" primitiveName="h5dataset" />
     <PRIMITIVE gatewayId="62" primitiveId="15" primitiveName="h5attr" />
-    <PRIMITIVE gatewayId="62" primitiveId="16" primitiveName="h5link" />
+    <PRIMITIVE gatewayId="62" primitiveId="16" primitiveName="h5ln" />
     <PRIMITIVE gatewayId="62" primitiveId="17" primitiveName="h5readattr" />
     <PRIMITIVE gatewayId="62" primitiveId="18" primitiveName="h5flush" />
+    <PRIMITIVE gatewayId="62" primitiveId="19" primitiveName="h5cp" />
+    <PRIMITIVE gatewayId="62" primitiveId="20" primitiveName="h5isFile" />
+    <PRIMITIVE gatewayId="62" primitiveId="21" primitiveName="h5isGroup" />
+    <PRIMITIVE gatewayId="62" primitiveId="22" primitiveName="h5isSet" />
+    <PRIMITIVE gatewayId="62" primitiveId="23" primitiveName="h5isAttr" />
+    <PRIMITIVE gatewayId="62" primitiveId="24" primitiveName="h5isSpace" />
+    <PRIMITIVE gatewayId="62" primitiveId="25" primitiveName="h5isType" />
+    <PRIMITIVE gatewayId="62" primitiveId="26" primitiveName="h5isRef" />
+    <PRIMITIVE gatewayId="62" primitiveId="27" primitiveName="h5isList" />
 </GATEWAY>
index 91ce7c6..fe173f4 100644 (file)
 namespace org_modules_hdf5
 {
 
-H5Attribute::H5Attribute(H5Object & _parent, const unsigned int pos) : H5Object(_parent), name("")
-{
-    attr = H5Aopen_by_idx(getParent().getH5Id(), ".", H5_INDEX_NAME, H5_ITER_NATIVE, (hsize_t)pos, H5P_DEFAULT, H5P_DEFAULT);
-    if (attr < 0)
-    {
-        throw H5Exception(__LINE__, __FILE__, _("Cannot open attribute at position %u."), pos);
-    }
-
-    ssize_t size = H5Aget_name(attr, 0, 0);
-    if (size > 0)
-    {
-        char * _name = new char[size + 1];
-        H5Aget_name(attr, size + 1, _name);
-        name = std::string(_name);
-        delete[] _name;
-    }
-}
-
-H5Attribute::H5Attribute(H5Object & _parent, const std::string & _name) : H5Object(_parent), name(_name)
+H5Attribute::H5Attribute(H5Object & _parent, const std::string & _name) : H5Object(_parent, _name)
 {
     if (H5Aexists(getParent().getH5Id(), name.c_str()) <= 0)
     {
@@ -48,12 +30,7 @@ H5Attribute::H5Attribute(H5Object & _parent, const std::string & _name) : H5Obje
     }
 }
 
-H5Attribute::H5Attribute(H5Object & _parent, hid_t _attr, const std::string & _name) : H5Object(_parent), attr(_attr), name(_name)
-{
-
-}
-
-H5Attribute::H5Attribute(H5Object & _parent, hid_t _attr, const char * _name) : H5Object(_parent), attr(_attr), name(std::string(_name))
+H5Attribute::H5Attribute(H5Object & _parent, hid_t _attr, const std::string & _name) : H5Object(_parent, _name), attr(_attr)
 {
 
 }
@@ -68,7 +45,7 @@ H5Attribute::~H5Attribute()
 
 H5Data & H5Attribute::getData()
 {
-    return H5DataFactory::getData(*this, attr, true);
+    return H5DataFactory::getData(*this, attr, 0, 0, true);
 }
 
 H5Type & H5Attribute::getDataType()
@@ -163,10 +140,20 @@ std::string H5Attribute::toString(const unsigned int indentLevel) const
     return os.str();
 }
 
-hid_t H5Attribute::create(H5Object & loc, const std::string & name, hid_t type, hid_t targettype, hid_t space, void * data)
+void H5Attribute::copy(H5Object & parent, const std::string & name)
+{
+    H5Attribute::copy(this->getH5Id(), parent.getH5Id(), name);
+}
+
+hid_t H5Attribute::create(H5Object & loc, const std::string & name, const hid_t type, const hid_t targettype, const hid_t space, void * data)
+{
+    return create(loc.getH5Id(), name, type, targettype, space, data);
+}
+
+hid_t H5Attribute::create(const hid_t loc, const std::string & name, const hid_t type, const hid_t targettype, const hid_t space, void * data)
 {
     herr_t err;
-    hid_t attr = H5Acreate2(loc.getH5Id(), name.c_str(), targettype, space, H5P_DEFAULT, H5P_DEFAULT);
+    hid_t attr = H5Acreate2(loc, name.c_str(), targettype, space, H5P_DEFAULT, H5P_DEFAULT);
     if (attr < 0)
     {
         throw H5Exception(__LINE__, __FILE__, _("Cannot create a new attribute."));
@@ -175,10 +162,75 @@ hid_t H5Attribute::create(H5Object & loc, const std::string & name, hid_t type,
     err = H5Awrite(attr, type, data);
     if (err < 0)
     {
-        H5Dclose(attr);
+        H5Aclose(attr);
         throw H5Exception(__LINE__, __FILE__, _("Cannot write data in the attribute."));
     }
 
     return attr;
 }
+
+void H5Attribute::copy(const hid_t src, const hid_t dest, const std::string & name)
+{
+    hid_t type, stype;
+    hid_t space, sspace;
+    char * data = 0;
+    hsize_t size;
+    hsize_t * dims = 0;
+    hsize_t ndims;
+
+    sspace = H5Aget_space(src);
+    if (sspace < 0)
+    {
+        throw H5Exception(__LINE__, __FILE__, _("Cannot copy the attribute"));
+    }
+    space = H5Scopy(sspace);
+    H5Sclose(sspace);
+
+    stype = H5Aget_type(src);
+    if (stype < 0)
+    {
+        H5Sclose(space);
+        throw H5Exception(__LINE__, __FILE__, _("Cannot copy the attribute"));
+    }
+    type = H5Tcopy(stype);
+    H5Tclose(stype);
+
+    size = H5Tget_size(type);
+    dims = new hsize_t[__SCILAB_HDF5_MAX_DIMS__];
+    ndims = H5Sget_simple_extent_dims(space, dims, 0);
+    for (unsigned int i = 0; i < ndims; i++)
+    {
+        size *= dims[i];
+    }
+
+    data = new char[size];
+    if (H5Aread(src, type, data) < 0)
+    {
+        H5Sclose(space);
+        H5Tclose(type);
+        delete[] dims;
+        delete[] data;
+
+        throw H5Exception(__LINE__, __FILE__, _("Cannot read attribute data."));
+    }
+
+    try
+    {
+        hid_t attr = create(dest, name, type, type, space, data);
+        H5Aclose(attr);
+        H5Sclose(space);
+        H5Tclose(type);
+        delete[] dims;
+        delete[] data;
+    }
+    catch (const H5Exception & e)
+    {
+        H5Sclose(space);
+        H5Tclose(type);
+        delete[] dims;
+        delete[] data;
+        throw;
+    }
+}
+
 }
index bf5584b..a57a102 100644 (file)
@@ -24,13 +24,10 @@ namespace org_modules_hdf5
 class H5Attribute : public H5Object
 {
     hid_t attr;
-    std::string name;
 
 public :
 
-    H5Attribute(H5Object & _parent, const unsigned int pos);
     H5Attribute(H5Object & _parent, const std::string & name);
-    H5Attribute(H5Object & _parent, hid_t _attr, const char * _name);
     H5Attribute(H5Object & _parent, hid_t _attr, const std::string & _name);
 
     ~H5Attribute();
@@ -40,20 +37,23 @@ public :
         return attr;
     }
 
-    virtual const std::string & getName() const
+    virtual bool isAttribute() const
     {
-        return name;
+        return true;
     }
 
     H5Data & getData();
     H5Type & getDataType();
     H5Dataspace & getSpace();
+    virtual void copy(H5Object & parent, const std::string & name);
     virtual void getAccessibleAttribute(const std::string & _name, const int pos, void * pvApiCtx) const;
 
     virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const;
     virtual std::string toString(const unsigned int indentLevel) const;
 
-    static hid_t create(H5Object & loc, const std::string & name, hid_t type, hid_t targettype, hid_t space, void * data);
+    static hid_t create(const hid_t loc, const std::string & name, const hid_t type, const hid_t targettype, const hid_t space, void * data);
+    static hid_t create(H5Object & loc, const std::string & name, const hid_t type, const hid_t targettype, const hid_t space, void * data);
+    static void copy(const hid_t src, const hid_t dest, const std::string & name);
 };
 }
 
index 6d5bd43..544322a 100644 (file)
@@ -18,19 +18,28 @@ namespace org_modules_hdf5
 
 H5AttributesList::H5AttributesList(H5Object & _parent) : H5ListObject(_parent) { }
 
+H5AttributesList::H5AttributesList(H5Object & _parent, const unsigned int _size, const unsigned int * _index) : H5ListObject(_parent, _size, _index) { }
+
 H5AttributesList::~H5AttributesList() { }
 
 const unsigned int H5AttributesList::getSize() const
 {
-    H5O_info_t info;
-    herr_t err = H5Oget_info(parent.getH5Id(), &info);
-
-    if (err < 0)
+    if (H5ListObject::indexList)
     {
-        throw H5Exception(__LINE__, __FILE__, _("Cannot get the size of attribute list."));
+        return H5ListObject::indexSize;
     }
+    else
+    {
+        H5O_info_t info;
+        herr_t err = H5Oget_info(parent.getH5Id(), &info);
 
-    return (unsigned int)info.num_attrs;
+        if (err < 0)
+        {
+            throw H5Exception(__LINE__, __FILE__, _("Cannot get the size of attribute list."));
+        }
+
+        return (unsigned int)info.num_attrs;
+    }
 }
 
 void H5AttributesList::setObject(const unsigned int pos, H5Attribute & attribute)
@@ -50,6 +59,11 @@ H5Attribute & H5AttributesList::getObject(const int pos)
 
 H5Attribute & H5AttributesList::getObject(const int pos, const bool checkPos)
 {
+    hid_t attr;
+    ssize_t ssize;
+    std::string name;
+    int _pos = pos;
+
     if (checkPos)
     {
         unsigned int size = getSize();
@@ -59,7 +73,27 @@ H5Attribute & H5AttributesList::getObject(const int pos, const bool checkPos)
         }
     }
 
-    return *new H5Attribute(parent, (const unsigned int)pos);
+    if (H5ListObject::indexList)
+    {
+        _pos = H5ListObject::indexList[pos];
+    }
+
+    attr = H5Aopen_by_idx(parent.getH5Id(), ".", H5_INDEX_NAME, H5_ITER_NATIVE, (hsize_t)_pos, H5P_DEFAULT, H5P_DEFAULT);
+    if (attr < 0)
+    {
+        throw H5Exception(__LINE__, __FILE__, _("Cannot open attribute at position %u."), pos);
+    }
+
+    ssize = H5Aget_name(attr, 0, 0);
+    if (ssize > 0)
+    {
+        char * _name = new char[ssize + 1];
+        H5Aget_name(attr, ssize + 1, _name);
+        name = std::string(_name);
+        delete[] _name;
+    }
+
+    return *new H5Attribute(parent, name);
 }
 
 std::string H5AttributesList::dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const
index 191e100..add3fc5 100644 (file)
@@ -25,6 +25,7 @@ class H5AttributesList : public H5ListObject<H5Attribute>
 public :
 
     H5AttributesList(H5Object & _parent);
+    H5AttributesList(H5Object & _parent, const unsigned int size, const unsigned int * index);
 
     ~H5AttributesList();
 
index ab9bf3d..57329c2 100644 (file)
@@ -29,7 +29,7 @@
             err = createMatrixOf##NAME(pvApiCtx, position, rows, cols, ptr); \
         }                                                               \
         if (err.iErr)                                                   \
-        {           printError(&err, 0);                               \
+        {                                                              \
             throw H5Exception(__LINE__, __FILE__, "Cannot allocate memory"); \
         }                                                               \
     }
@@ -46,7 +46,7 @@
             err = allocMatrixOf##NAME(pvApiCtx, position, rows, cols, ptr); \
         }                                                               \
         if (err.iErr)                                                   \
-        {           printError(&err, 0);                                                            \
+        {                                                              \
             throw H5Exception(__LINE__, __FILE__, "Cannot allocate memory"); \
         }                                                               \
     }
@@ -136,7 +136,12 @@ public:
     {
         SciErr err;
         T * newData = 0;
-        if (ndims == 1)
+
+        if (ndims == 0)
+        {
+            create(pvApiCtx, lhsPosition, 1, 1, static_cast<T *>(getData()), parentList, listPosition);
+        }
+        else if (ndims == 1)
         {
             alloc(pvApiCtx, lhsPosition, 1, *dims, parentList, listPosition, &newData);
             copyData(newData);
index c5a6ca2..db60108 100644 (file)
@@ -73,6 +73,8 @@ public:
 
     virtual void toScilab(void * pvApiCtx, const int lhsPosition, int * parentList = 0, const int listPosition = 0) const
     {
+        // TODO: gerer le cas ndims=0 (cas SCALAR)
+
         static int structdims[2] = { 1, 1 };
         const char ** _fieldsname = new const char *[nfields + 2];
         SciErr err;
index 727fa62..ef5fa9e 100644 (file)
@@ -59,6 +59,18 @@ public:
 
 protected:
 
+    void createEmpty(void * pvApiCtx, const int position, int * parentList = 0, const int listPosition = 0) const
+    {
+        if (parentList)
+        {
+            createMatrixOfDoubleInList(pvApiCtx, position, parentList, listPosition, 0, 0, 0);
+        }
+        else
+        {
+            createEmptyMatrix(pvApiCtx, position);
+        }
+    }
+
     int * getHypermatrix(void * pvApiCtx, const int position, int * parentList = 0, const int listPosition = 0) const
     {
         static const char * hypermat[3] = {"hm", "dims", "entries"};
index 2e8407f..1bd291b 100644 (file)
@@ -56,433 +56,4 @@ int * H5DataConverter::getHypermatrix(void * pvApiCtx, const int position, const
 
     return list;
 }
-
-void H5DataConverter::toScilabString(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, char ** data)
-{
-    SciErr err;
-    if (ndims == 1)
-    {
-        err = createMatrixOfString(pvApiCtx, position, 1, *dims, data);
-        if (err.iErr)
-        {
-            throw H5Exception(__LINE__, __FILE__, _("Cannot create a double matrix on the stack"));
-        }
-    }
-    else
-    {
-        if (ndims == 2)
-        {
-            char ** newData = new char*[dims[0] * dims[1]];
-            C2FHypermatrix(2, dims, 0, data, newData);
-            err = createMatrixOfString(pvApiCtx, position, dims[0], dims[1], newData);
-            delete[] newData;
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot allocate a double matrix on the stack"));
-            }
-        }
-        else
-        {
-            int * list = getHypermatrix(pvApiCtx, position, ndims, dims);
-            hsize_t size = dims[0];
-            for (int i = 1; i < ndims; i++)
-            {
-                size *= dims[i];
-            }
-            char ** newData = new char*[size];
-            C2FHypermatrix(ndims, dims, size, data, newData);
-
-            err = createMatrixOfStringInList(pvApiCtx, position, list, 3, 1, (int)size, newData);
-            delete[] newData;
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an hypermatrix on the stack"));
-            }
-        }
-    }
-}
-
-void H5DataConverter::toScilabDouble(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, double * data)
-{
-    SciErr err;
-    if (ndims == 1)
-    {
-        err = createMatrixOfDouble(pvApiCtx, position, 1, *dims, data);
-        if (err.iErr)
-        {
-            throw H5Exception(__LINE__, __FILE__, _("Cannot create a double matrix on the stack"));
-        }
-    }
-    else
-    {
-        double * newData = 0;
-        if (ndims == 2)
-        {
-            err = allocMatrixOfDouble(pvApiCtx, position, dims[0], dims[1], &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot allocate a double matrix on the stack"));
-            }
-            C2FHypermatrix(2, dims, 0, data, newData);
-        }
-        else
-        {
-            int * list = getHypermatrix(pvApiCtx, position, ndims, dims);
-            hsize_t size = dims[0];
-            for (int i = 1; i < ndims; i++)
-            {
-                size *= dims[i];
-            }
-
-            err = allocMatrixOfDoubleInList(pvApiCtx, position, list, 3, 1, (int)size, &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an hypermatrix on the stack"));
-            }
-            C2FHypermatrix(ndims, dims, size, data, newData);
-        }
-    }
-}
-
-void H5DataConverter::toScilabInt8(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, char * data)
-{
-    SciErr err;
-    if (ndims == 1)
-    {
-        err = createMatrixOfInteger8(pvApiCtx, position, 1, *dims, data);
-        if (err.iErr)
-        {
-            throw H5Exception(__LINE__, __FILE__, _("Cannot create an int8 matrix on the stack"));
-        }
-    }
-    else
-    {
-        char * newData = 0;
-        if (ndims == 2)
-        {
-
-            err = allocMatrixOfInteger8(pvApiCtx, position, dims[0], dims[1], &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an int8 matrix on the stack"));
-            }
-            C2FHypermatrix(2, dims, 0, data, newData);
-        }
-        else
-        {
-            int * list = getHypermatrix(pvApiCtx, position, ndims, dims);
-            hsize_t size = dims[0];
-            for (int i = 1; i < ndims; i++)
-            {
-                size *= dims[i];
-            }
-
-            err = allocMatrixOfInteger8InList(pvApiCtx, position, list, 3, 1, (int)size, &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an hypermatrix on the stack"));
-            }
-            C2FHypermatrix(ndims, dims, size, data, newData);
-        }
-    }
-}
-
-void H5DataConverter::toScilabUInt8(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, unsigned char * data)
-{
-    SciErr err;
-    if (ndims == 1)
-    {
-        err = createMatrixOfUnsignedInteger8(pvApiCtx, position, 1, *dims, data);
-        if (err.iErr)
-        {
-            throw H5Exception(__LINE__, __FILE__, _("Cannot create an uint8 matrix on the stack"));
-        }
-    }
-    else
-    {
-        unsigned char * newData = 0;
-        if (ndims == 2)
-        {
-            err = allocMatrixOfUnsignedInteger8(pvApiCtx, position, dims[0], dims[1], &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an uint8 matrix on the stack"));
-            }
-            C2FHypermatrix(2, dims, 0, data, newData);
-        }
-        else
-        {
-            int * list = getHypermatrix(pvApiCtx, position, ndims, dims);
-            hsize_t size = dims[0];
-            for (int i = 1; i < ndims; i++)
-            {
-                size *= dims[i];
-            }
-
-            err = allocMatrixOfUnsignedInteger8InList(pvApiCtx, position, list, 3, 1, (int)size, &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an hypermatrix on the stack"));
-            }
-            C2FHypermatrix(ndims, dims, size, data, newData);
-        }
-    }
-}
-
-void H5DataConverter::toScilabInt16(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, short * data)
-{
-    SciErr err;
-    if (ndims == 1)
-    {
-        err = createMatrixOfInteger16(pvApiCtx, position, 1, *dims, data);
-        if (err.iErr)
-        {
-            throw H5Exception(__LINE__, __FILE__, _("Cannot create an int16 matrix on the stack"));
-        }
-    }
-    else
-    {
-        short * newData = 0;
-        if (ndims == 2)
-        {
-            err = allocMatrixOfInteger16(pvApiCtx, position, dims[0], dims[1], &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an int16 matrix on the stack"));
-            }
-            C2FHypermatrix(2, dims, 0, data, newData);
-        }
-        else
-        {
-            int * list = getHypermatrix(pvApiCtx, position, ndims, dims);
-            hsize_t size = dims[0];
-            for (int i = 1; i < ndims; i++)
-            {
-                size *= dims[i];
-            }
-
-            err = allocMatrixOfInteger16InList(pvApiCtx, position, list, 3, 1, (int)size, &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an hypermatrix on the stack"));
-            }
-            C2FHypermatrix(ndims, dims, size, data, newData);
-        }
-    }
-}
-
-void H5DataConverter::toScilabUInt16(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, unsigned short * data)
-{
-    SciErr err;
-    if (ndims == 1)
-    {
-        err = createMatrixOfUnsignedInteger16(pvApiCtx, position, 1, *dims, data);
-        if (err.iErr)
-        {
-            throw H5Exception(__LINE__, __FILE__, _("Cannot create an uint16 matrix on the stack"));
-        }
-    }
-    else
-    {
-        unsigned short * newData = 0;
-        if (ndims == 2)
-        {
-            err = allocMatrixOfUnsignedInteger16(pvApiCtx, position, dims[0], dims[1], &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an uint16 matrix on the stack"));
-            }
-            C2FHypermatrix(2, dims, 0, data, newData);
-        }
-        else
-        {
-            int * list = getHypermatrix(pvApiCtx, position, ndims, dims);
-            hsize_t size = dims[0];
-            for (int i = 1; i < ndims; i++)
-            {
-                size *= dims[i];
-            }
-
-            err = allocMatrixOfUnsignedInteger16InList(pvApiCtx, position, list, 3, 1, (int)size, &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an hypermatrix on the stack"));
-            }
-            C2FHypermatrix(ndims, dims, size, data, newData);
-        }
-    }
-}
-
-void H5DataConverter::toScilabInt32(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, int * data)
-{
-    SciErr err;
-    if (ndims == 1)
-    {
-        err = createMatrixOfInteger32(pvApiCtx, position, 1, *dims, data);
-        if (err.iErr)
-        {
-            throw H5Exception(__LINE__, __FILE__, _("Cannot create an int32 matrix on the stack"));
-        }
-    }
-    else
-    {
-        int * newData = 0;
-        if (ndims == 2)
-        {
-            err = allocMatrixOfInteger32(pvApiCtx, position, dims[0], dims[1], &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an int32 matrix on the stack"));
-            }
-            C2FHypermatrix(2, dims, 0, data, newData);
-        }
-        else
-        {
-            int * list = getHypermatrix(pvApiCtx, position, ndims, dims);
-            hsize_t size = dims[0];
-            for (int i = 1; i < ndims; i++)
-            {
-                size *= dims[i];
-            }
-
-            err = allocMatrixOfInteger32InList(pvApiCtx, position, list, 3, 1, (int)size, &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an hypermatrix on the stack"));
-            }
-            C2FHypermatrix(ndims, dims, size, data, newData);
-        }
-    }
-}
-
-void H5DataConverter::toScilabUInt32(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, unsigned int * data)
-{
-    SciErr err;
-    if (ndims == 1)
-    {
-        err = createMatrixOfUnsignedInteger32(pvApiCtx, position, 1, *dims, data);
-        if (err.iErr)
-        {
-            throw H5Exception(__LINE__, __FILE__, _("Cannot create an uint32 matrix on the stack"));
-        }
-    }
-    else
-    {
-        unsigned int * newData = 0;
-        if (ndims == 2)
-        {
-            err = allocMatrixOfUnsignedInteger32(pvApiCtx, position, dims[0], dims[1], &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an uint32 matrix on the stack"));
-            }
-            C2FHypermatrix(2, dims, 0, data, newData);
-        }
-        else
-        {
-            int * list = getHypermatrix(pvApiCtx, position, ndims, dims);
-            hsize_t size = dims[0];
-            for (int i = 1; i < ndims; i++)
-            {
-                size *= dims[i];
-            }
-
-            err = allocMatrixOfUnsignedInteger32InList(pvApiCtx, position, list, 3, 1, (int)size, &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an hypermatrix on the stack"));
-            }
-            C2FHypermatrix(ndims, dims, size, data, newData);
-        }
-    }
-}
-
-#ifdef __SCILAB_INT64__
-
-void H5DataConverter::toScilabInt64(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, long long * data)
-{
-    SciErr err;
-    if (ndims == 1)
-    {
-        err = createMatrixOfInteger64(pvApiCtx, position, 1, *dims, data);
-        if (err.iErr)
-        {
-            throw H5Exception(__LINE__, __FILE__, _("Cannot create an int64 matrix on the stack"));
-        }
-    }
-    else
-    {
-        long long * newData = 0;
-        if (ndims == 2)
-        {
-            err = allocMatrixOfInteger64(pvApiCtx, position, dims[0], dims[1], &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an int64 matrix on the stack"));
-            }
-            C2FHypermatrix(2, dims, 0, data, newData);
-        }
-        else
-        {
-            int * list = getHypermatrix(pvApiCtx, position, ndims, dims);
-            hsize_t size = dims[0];
-            for (int i = 1; i < ndims; i++)
-            {
-                size *= dims[i];
-            }
-
-            err = allocMatrixOfInteger64InList(pvApiCtx, position, list, 3, 1, (int)size, &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an hypermatrix on the stack"));
-            }
-            C2FHypermatrix(ndims, dims, size, data, newData);
-        }
-    }
-}
-
-void H5DataConverter::toScilabUInt64(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, unsigned long long * data)
-{
-    SciErr err;
-    if (ndims == 1)
-    {
-        err = createMatrixOfUnsignedInteger64(pvApiCtx, position, 1, *dims, data);
-        if (err.iErr)
-        {
-            throw H5Exception(__LINE__, __FILE__, _("Cannot create an uint64 matrix on the stack"));
-        }
-    }
-    else
-    {
-        unsigned long long * newData = 0;
-        if (ndims == 2)
-        {
-            err = allocMatrixOfUnsignedInteger64(pvApiCtx, position, dims[0], dims[1], &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an uint64 matrix on the stack"));
-            }
-            C2FHypermatrix(2, dims, 0, data, newData);
-        }
-        else
-        {
-            int * list = getHypermatrix(pvApiCtx, position, ndims, dims);
-            hsize_t size = dims[0];
-            for (int i = 1; i < ndims; i++)
-            {
-                size *= dims[i];
-            }
-
-            err = allocMatrixOfUnsignedInteger64InList(pvApiCtx, position, list, 3, 1, (int)size, &newData);
-            if (err.iErr)
-            {
-                throw H5Exception(__LINE__, __FILE__, _("Cannot create an hypermatrix on the stack"));
-            }
-            C2FHypermatrix(ndims, dims, size, data, newData);
-        }
-    }
-}
-
-#endif // __SCILAB_INT64__
-
 }
index 1201c3f..d9ae41b 100644 (file)
@@ -52,7 +52,9 @@ public:
 
         if (ndims == 0)
         {
-            os << start << "0): 0";
+            os << start << "0): ";
+            obj.printData(os, 0, 0);
+            os << std::endl;
         }
         else if (ndims == 1)
         {
@@ -93,30 +95,6 @@ public:
         }
     }
 
-    static void toScilabString(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, char ** data);
-
-    static void toScilabDouble(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, double * data);
-
-    static void toScilabInt8(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, char * data);
-
-    static void toScilabUInt8(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, unsigned char * data);
-
-    static void toScilabInt16(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, short * data);
-
-    static void toScilabUInt16(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, unsigned short * data);
-
-    static void toScilabInt32(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, int * data);
-
-    static void toScilabUInt32(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, unsigned int * data);
-
-#ifdef __SCILAB_INT64__
-
-    static void toScilabInt64(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, long long * data);
-
-    static void toScilabUInt64(void * pvApiCtx, const int position, const int ndims, const hsize_t * dims, unsigned long long * data);
-
-#endif // __SCILAB_INT64__
-
     template <typename T>
     static void C2FHypermatrix(const int ndims, const hsize_t * dims, const hsize_t size, const T * src, T * dest)
     {
index ac6bb45..6704a79 100644 (file)
@@ -15,7 +15,7 @@
 namespace org_modules_hdf5
 {
 
-H5Data & H5DataFactory::getData(H5Object & parent, const hid_t obj, const bool isAttribute)
+H5Data & H5DataFactory::getData(H5Object & parent, const hid_t obj, H5Dataspace * space, hsize_t * selectdims, const bool isAttribute)
 {
     const hid_t type = isAttribute ? H5Aget_type(obj) : H5Dget_type(obj);
     if (type < 0)
@@ -23,41 +23,47 @@ H5Data & H5DataFactory::getData(H5Object & parent, const hid_t obj, const bool i
         throw H5Exception(__LINE__, __FILE__, _("Cannot get the data type"));
     }
     H5Data * data = 0;
+    hid_t spaceId = space ? space->getH5Id() : -1;
+
     // TODO: le type est ferme dans getNativeData: bonne idee ou pas ??
 
     switch (H5Tget_class(type))
     {
         case H5T_INTEGER:
-            data = &getIntegerData(parent, obj, type, isAttribute);
+            data = &getIntegerData(parent, obj, spaceId, selectdims, type, isAttribute);
             break;
         case H5T_FLOAT:
-            data = &getFloatingData(parent, obj, type, isAttribute);
+            data = &getFloatingData(parent, obj, spaceId, selectdims, type, isAttribute);
             break;
         case H5T_TIME:
-            data = &getTimeData(parent, obj, type, isAttribute);
+            data = &getTimeData(parent, obj, spaceId, selectdims, type, isAttribute);
             break;
         case H5T_STRING:
-            data = &getStringData(parent, obj, type, isAttribute);
+            data = &getStringData(parent, obj, spaceId, selectdims, type, isAttribute);
             break;
         case H5T_BITFIELD:
-            data = &getBitfieldData(parent, obj, type, isAttribute);
+            data = &getBitfieldData(parent, obj, spaceId, selectdims, type, isAttribute);
             break;
         case H5T_OPAQUE:
-            data = &getOpaqueData(parent, obj, type, isAttribute);
+            data = &getOpaqueData(parent, obj, spaceId, selectdims, type, isAttribute);
             break;
         case H5T_COMPOUND:
-            data = &getCompoundData(parent, obj, type, isAttribute);
+            data = &getCompoundData(parent, obj, spaceId, selectdims, type, isAttribute);
             break;
         case H5T_REFERENCE:
-            data = &getReferenceData(parent, obj, type, isAttribute);
+            data = &getReferenceData(parent, obj, spaceId, selectdims, type, isAttribute);
             break;
         case H5T_ENUM:
+            std::cout << "ENUM" << std::endl;
             //data = &getEnumData(parent, obj, type, isAttribute);
             //break;
         case H5T_VLEN:
+            std::cout << "VLEN" << std::endl;
+
             //data = &getVlenData(parent, obj, type, isAttribute);
             //break;
         case H5T_ARRAY:
+            std::cout << "ARRAY" << std::endl;
             //data = &getArrayData(parent, obj, type, isAttribute);
             //break;
         default:
@@ -115,6 +121,16 @@ H5Data & H5DataFactory::getData(H5Object & parent, const hsize_t totalSize, cons
             {
                 return *new H5BasicData<unsigned long long>(parent, totalSize, dataSize, ndims, dims, (unsigned long long *)data, stride, offset, false);
             }
+#else
+
+            else if (H5Tequal(type, H5T_NATIVE_LONG))
+            {
+                return *new H5TransformedData<long long, int>(parent, totalSize, dataSize, ndims, dims, (long long *)data, stride, offset, false);
+            }
+            else if (H5Tequal(type, H5T_NATIVE_ULONG))
+            {
+                return *new H5TransformedData<unsigned long long, unsigned int>(parent, totalSize, dataSize, ndims, dims, (unsigned long long *)data, stride, offset, false);
+            }
 
 #endif // __SCILAB_INT64__
 
@@ -127,7 +143,8 @@ H5Data & H5DataFactory::getData(H5Object & parent, const hsize_t totalSize, cons
         case H5T_FLOAT:
             if (H5Tequal(type, H5T_NATIVE_FLOAT))
             {
-                return *new H5FloatData(parent, totalSize, dataSize, ndims, dims, (float *)data, stride, offset, false);
+                //return *new H5FloatData(parent, totalSize, dataSize, ndims, dims, (float *)data, stride, offset, false);
+                return *new H5TransformedData<float, double>(parent, totalSize, dataSize, ndims, dims, (float *)data, stride, offset, false);
             }
             else if (H5Tequal(type, H5T_NATIVE_DOUBLE))
             {
@@ -199,7 +216,7 @@ H5Data & H5DataFactory::getData(H5Object & parent, const hsize_t totalSize, cons
     throw H5Exception(__LINE__, __FILE__, _("Cannot get data from an unknown data type."));
 }
 
-H5Data & H5DataFactory::getIntegerData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute)
+H5Data & H5DataFactory::getIntegerData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
 {
     hsize_t ndims;
     hsize_t * dims = 0;
@@ -209,7 +226,7 @@ H5Data & H5DataFactory::getIntegerData(H5Object & parent, const hid_t obj, const
     H5Data * dataObj = 0;
     const hid_t nativeType = H5Tget_native_type(type, H5T_DIR_DEFAULT);
 
-    getNativeData(obj, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
+    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
 
     if (H5Tequal(nativeType, H5T_NATIVE_SCHAR))
     {
@@ -247,6 +264,17 @@ H5Data & H5DataFactory::getIntegerData(H5Object & parent, const hid_t obj, const
         dataObj = new H5BasicData<unsigned long long>(parent, totalSize, dataSize, ndims, dims, (unsigned long long *)data);
     }
 
+#else
+
+    else if (H5Tequal(nativeType, H5T_NATIVE_LONG))
+    {
+        dataObj = new H5TransformedData<long long, int>(parent, totalSize, dataSize, ndims, dims, (long long *)data);
+    }
+    else if (H5Tequal(nativeType, H5T_NATIVE_ULONG))
+    {
+        dataObj = new H5TransformedData<unsigned long long, unsigned int>(parent, totalSize, dataSize, ndims, dims, (unsigned long long *)data);
+    }
+
 #endif // __SCILAB_INT64__
 
     else
@@ -262,7 +290,7 @@ H5Data & H5DataFactory::getIntegerData(H5Object & parent, const hid_t obj, const
     return *dataObj;
 }
 
-H5Data & H5DataFactory::getFloatingData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute)
+H5Data & H5DataFactory::getFloatingData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
 {
     hsize_t ndims;
     hsize_t totalSize;
@@ -272,11 +300,11 @@ H5Data & H5DataFactory::getFloatingData(H5Object & parent, const hid_t obj, cons
     H5Data * dataObj = 0;
     const hid_t nativeType = H5Tget_native_type(type, H5T_DIR_DEFAULT);
 
-    getNativeData(obj, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
+    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
 
     if (H5Tequal(nativeType, H5T_NATIVE_FLOAT))
     {
-        dataObj = new H5FloatData(parent, totalSize, dataSize, ndims, dims, (float *)data);
+        dataObj = new H5TransformedData<float, double>(parent, totalSize, dataSize, ndims, dims, (float *)data);
     }
     else if (H5Tequal(nativeType, H5T_NATIVE_DOUBLE))
     {
@@ -295,7 +323,7 @@ H5Data & H5DataFactory::getFloatingData(H5Object & parent, const hid_t obj, cons
     return *dataObj;
 }
 
-H5StringData & H5DataFactory::getStringData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute)
+H5StringData & H5DataFactory::getStringData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
 {
     hsize_t ndims;
     hsize_t totalSize;
@@ -303,7 +331,7 @@ H5StringData & H5DataFactory::getStringData(H5Object & parent, const hid_t obj,
     hsize_t * dims = 0;
     void * data = 0;
 
-    getNativeData(obj, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
+    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
     if (H5Tis_variable_str(type))
     {
         return *new H5StringData(parent, totalSize, dataSize, ndims, dims, (char **)data);
@@ -314,7 +342,7 @@ H5StringData & H5DataFactory::getStringData(H5Object & parent, const hid_t obj,
     }
 }
 
-H5TimeData & H5DataFactory::getTimeData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute)
+H5TimeData & H5DataFactory::getTimeData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
 {
     hsize_t ndims;
     hsize_t totalSize;
@@ -322,12 +350,12 @@ H5TimeData & H5DataFactory::getTimeData(H5Object & parent, const hid_t obj, cons
     hsize_t * dims = 0;
     void * data = 0;
 
-    getNativeData(obj, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
+    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
 
     return *new H5TimeData(parent, totalSize, dataSize, ndims, dims, static_cast<char *>(data));
 }
 
-H5BitfieldData & H5DataFactory::getBitfieldData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute)
+H5BitfieldData & H5DataFactory::getBitfieldData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
 {
     hsize_t ndims;
     hsize_t totalSize;
@@ -335,12 +363,12 @@ H5BitfieldData & H5DataFactory::getBitfieldData(H5Object & parent, const hid_t o
     hsize_t * dims = 0;
     void * data = 0;
 
-    getNativeData(obj, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
+    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
 
     return *new H5BitfieldData(parent, totalSize, dataSize, ndims, dims, static_cast<char *>(data));
 }
 
-H5OpaqueData & H5DataFactory::getOpaqueData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute)
+H5OpaqueData & H5DataFactory::getOpaqueData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
 {
     hsize_t ndims;
     hsize_t totalSize;
@@ -348,12 +376,12 @@ H5OpaqueData & H5DataFactory::getOpaqueData(H5Object & parent, const hid_t obj,
     hsize_t * dims = 0;
     void * data = 0;
 
-    getNativeData(obj, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
+    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
 
     return *new H5OpaqueData(parent, totalSize, dataSize, ndims, dims, static_cast<char *>(data));
 }
 
-H5Data & H5DataFactory::getCompoundData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute)
+H5Data & H5DataFactory::getCompoundData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
 {
     hsize_t ndims;
     hsize_t totalSize;
@@ -361,7 +389,8 @@ H5Data & H5DataFactory::getCompoundData(H5Object & parent, const hid_t obj, cons
     hsize_t * dims = 0;
     void * data = 0;
     const hid_t nativeType = H5Tget_native_type(type, H5T_DIR_DEFAULT);
-    getNativeData(obj, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
+
+    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
 
     try
     {
@@ -374,7 +403,7 @@ H5Data & H5DataFactory::getCompoundData(H5Object & parent, const hid_t obj, cons
     }
 }
 
-H5ReferenceData & H5DataFactory::getReferenceData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute)
+H5ReferenceData & H5DataFactory::getReferenceData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
 {
     hsize_t ndims;
     hsize_t totalSize;
@@ -382,7 +411,7 @@ H5ReferenceData & H5DataFactory::getReferenceData(H5Object & parent, const hid_t
     hsize_t * dims = 0;
     void * data = 0;
 
-    getNativeData(obj, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
+    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
     return *new H5ReferenceData(parent, H5Tequal(type, H5T_STD_REF_DSETREG) > 0, totalSize, dataSize, ndims, dims, (char *)data);
 }
 
@@ -438,13 +467,13 @@ H5ReferenceData & H5DataFactory::getReferenceData(H5Object & parent, const hid_t
 
 //return *new H5StringData(parent, totalSize, dataSize, ndims, dims, data);
 
-void H5DataFactory::getNativeData(const hid_t obj, const hid_t type, hsize_t * totalSize, hsize_t * dataSize, hsize_t * ndims, hsize_t ** dims, void ** data, const bool isAttribute)
+/*void H5DataFactory::getNativeData(const hid_t obj, const hid_t type, hsize_t * totalSize, hsize_t * dataSize, hsize_t * ndims, hsize_t ** dims, void ** data, const bool isAttribute)
 {
     hid_t nativeType = H5Tget_native_type(type, H5T_DIR_DEFAULT);
     const hid_t space = isAttribute ? H5Aget_space(obj) : H5Dget_space(obj);
     hsize_t size = H5Tget_size(nativeType);
     *totalSize = 1;
-    *dims = new hsize_t[__SCILAB_HDF5_MAX_DIMS__ + 1]();
+    *dims = new hsize_t[__SCILAB_HDF5_MAX_DIMS__]();
     *ndims = H5Sget_simple_extent_dims(space, *dims, 0);
 
     if (H5Tget_class(nativeType) == H5T_STRING && !H5Tis_variable_str(nativeType))
@@ -455,7 +484,7 @@ void H5DataFactory::getNativeData(const hid_t obj, const hid_t type, hsize_t * t
 
     *dataSize = size;
 
-    for (int i = 0; i < *ndims; i++)
+    for (unsigned int i = 0; i < *ndims; i++)
     {
         *totalSize *= (*dims)[i];
     }
@@ -482,7 +511,7 @@ void H5DataFactory::getNativeData(const hid_t obj, const hid_t type, hsize_t * t
     }
 
     if ((isAttribute && H5Aread(obj, nativeType, *data) < 0)
-            || (!isAttribute && H5Dread(obj, nativeType, H5S_ALL, H5S_ALL, H5P_DEFAULT, *data) < 0))
+       || (!isAttribute && H5Dread(obj, nativeType, H5S_ALL, space, H5P_DEFAULT, *data) < 0))
     {
         H5Tclose(type);
         H5Tclose(nativeType);
@@ -495,4 +524,121 @@ void H5DataFactory::getNativeData(const hid_t obj, const hid_t type, hsize_t * t
     H5Tclose(nativeType);
     H5Sclose(space);
 }
+*/
+
+void H5DataFactory::getNativeData(const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, hsize_t * totalSize, hsize_t * dataSize, hsize_t * ndims, hsize_t ** dims, void ** data, const bool isAttribute)
+{
+    hid_t nativeType = H5Tget_native_type(type, H5T_DIR_DEFAULT);
+    hid_t _space = space < 0 ? (isAttribute ? H5Aget_space(obj) : H5Dget_space(obj)) : space;
+    hsize_t size = H5Tget_size(nativeType);
+    H5S_sel_type sel;
+    hid_t targetspace;
+    herr_t err;
+    hsize_t * blockbuf = 0;
+    bool hyperslab = false;
+
+    *totalSize = 1;
+    if (H5Tget_class(nativeType) == H5T_STRING && !H5Tis_variable_str(nativeType))
+    {
+        // We have a C-string so it is null terminated
+        size++;
+    }
+
+    *dataSize = size;
+    *ndims = H5Sget_simple_extent_dims(_space, 0, 0);
+    *dims = new hsize_t[*ndims];
+
+    if (isAttribute)
+    {
+        H5Sget_simple_extent_dims(_space, *dims, 0);
+    }
+    else
+    {
+        sel = H5Sget_select_type(_space);
+        switch (sel)
+        {
+            case H5S_SEL_NONE:
+            case H5S_SEL_ALL:
+                H5Sget_simple_extent_dims(_space, *dims, 0);
+                for (unsigned int i = 0; i < *ndims; i++)
+                {
+                    *totalSize *= (*dims)[i];
+                }
+                break;
+            case H5S_SEL_POINTS:
+                break;
+            case H5S_SEL_HYPERSLABS:
+                for (unsigned int i = 0; i < *ndims; i++)
+                {
+                    (*dims)[i] = selectdims[i];
+                    *totalSize *= (*dims)[i];
+                }
+                hyperslab = true;
+        }
+    }
+
+    size *= *totalSize;
+
+    if ((hsize_t)((size_t)size) != size)
+    {
+        H5Tclose(type);
+        H5Tclose(nativeType);
+        if (space < 0)
+        {
+            H5Sclose(_space);
+        }
+        delete[] *dims;
+        throw H5Exception(__LINE__, __FILE__, _("Memory to allocate is too big"));
+    }
+
+    *data = static_cast<void *>(new char[(size_t)size]());
+    if (!*data)
+    {
+        H5Tclose(type);
+        H5Tclose(nativeType);
+        if (space < 0)
+        {
+            H5Sclose(_space);
+        }
+        delete[] *dims;
+        throw H5Exception(__LINE__, __FILE__, _("Cannot allocate memory to get the data"));
+    }
+
+    if (hyperslab)
+    {
+        targetspace =  H5Screate_simple(*ndims, *dims, 0);
+        err = H5Dread(obj, nativeType, targetspace, _space, H5P_DEFAULT, *data);
+        H5Sclose(targetspace);
+    }
+    else
+    {
+        if (isAttribute)
+        {
+            err = H5Aread(obj, nativeType, *data);
+        }
+        else
+        {
+            err = H5Dread(obj, nativeType, H5S_ALL, H5S_ALL, H5P_DEFAULT, *data);
+        }
+    }
+
+    if (err < 0)
+    {
+        H5Tclose(type);
+        H5Tclose(nativeType);
+        if (space < 0)
+        {
+            H5Sclose(_space);
+        }
+        delete[] static_cast<char *>(*data);
+        delete[] *dims;
+        throw H5Exception(__LINE__, __FILE__, _("Cannot retrieve the data from the attribute"));
+    }
+
+    H5Tclose(nativeType);
+    if (space < 0)
+    {
+        H5Sclose(_space);
+    }
+}
 }
index 13c0a37..d71363f 100644 (file)
 #include "H5ReferenceData.hxx"
 #include "H5CompoundData.hxx"
 #include "H5OpaqueData.hxx"
-#include "H5FloatData.hxx"
+//#include "H5FloatData.hxx"
+#include "H5TransformedData.hxx"
 #include "H5CharData.hxx"
 #include "H5UnsignedCharData.hxx"
 
 namespace org_modules_hdf5
 {
+
 class H5DataFactory
 {
 
 public:
 
     static H5Data & getData(H5Object & parent, const hid_t obj, const bool isAttribute);
+    static H5Data & getData(H5Object & parent, const hid_t obj, H5Dataspace * space, hsize_t * selectdims, const bool isAttribute);
+
+private:
+
     static H5Data & getData(H5Object & parent, const hsize_t totalSize, const hid_t type, hsize_t ndims, hsize_t * dims, void * data, const hsize_t stride, const size_t offset, const bool dataOwner = false);
-    static H5Data & getIntegerData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute);
-    static H5Data & getFloatingData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute);
-    static H5StringData & getStringData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute);
-    static H5TimeData & getTimeData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute);
-    static H5BitfieldData & getBitfieldData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute);
-    static H5OpaqueData & getOpaqueData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute);
-    static H5Data & getCompoundData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute);
-    static H5ReferenceData & getReferenceData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute);
-    static void getNativeData(const hid_t obj, const hid_t type, hsize_t * totalSize, hsize_t * dataSize, hsize_t * ndims, hsize_t ** dims, void ** data, const bool isAttribute);
+    static H5Data & getIntegerData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
+    static H5Data & getFloatingData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
+    static H5StringData & getStringData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
+    static H5TimeData & getTimeData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
+    static H5BitfieldData & getBitfieldData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
+    static H5OpaqueData & getOpaqueData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
+    static H5Data & getCompoundData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
+    static H5ReferenceData & getReferenceData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
+    static void getNativeData(const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, hsize_t * totalSize, hsize_t * dataSize, hsize_t * ndims, hsize_t ** dims, void ** data, const bool isAttribute);
 };
 }
 
index 52b0883..c4102f5 100644 (file)
@@ -27,22 +27,12 @@ void H5Dataset::init()
     }
 }
 
-H5Dataset::H5Dataset(H5Object & _parent, const char * _name) : H5Object(_parent), name(std::string(_name)), dataset((hid_t) - 1)
+H5Dataset::H5Dataset(H5Object & _parent, const std::string & _name) : H5Object(_parent, _name), dataset((hid_t) - 1)
 {
     init();
 }
 
-H5Dataset::H5Dataset(H5Object & _parent, const std::string & _name) : H5Object(_parent), name(_name), dataset((hid_t) - 1)
-{
-    init();
-}
-
-H5Dataset::H5Dataset(H5Object & _parent, hid_t _dataset, const char * _name) : H5Object(_parent), dataset(_dataset), name(std::string(_name))
-{
-
-}
-
-H5Dataset::H5Dataset(H5Object & _parent, hid_t _dataset, const std::string & _name) : H5Object(_parent), dataset(_dataset), name(_name)
+H5Dataset::H5Dataset(H5Object & _parent, hid_t _dataset, const std::string & _name) : H5Object(_parent, _name), dataset(_dataset)
 {
 
 }
@@ -57,7 +47,12 @@ H5Dataset::~H5Dataset()
 
 H5Data & H5Dataset::getData()
 {
-    return H5DataFactory::getData(*this, dataset, false);
+    return H5DataFactory::getData(*this, dataset, 0, 0, false);
+}
+
+H5Data & H5Dataset::getData(H5Dataspace & space, hsize_t * dims)
+{
+    return H5DataFactory::getData(*this, dataset, &space, dims, false);
 }
 
 H5Dataspace & H5Dataset::getSpace()
@@ -121,7 +116,7 @@ void H5Dataset::getAccessibleAttribute(const std::string & _name, const int pos,
 
         return;
     }
-    catch (H5Exception & e) { }
+    catch (const H5Exception & e) { }
 
     std::transform(_name.begin(), _name.end(), lower.begin(), tolower);
 
@@ -151,7 +146,10 @@ void H5Dataset::getAccessibleAttribute(const std::string & _name, const int pos,
         const H5Data & data = const_cast<H5Dataset *>(this)->getData();
         data.toScilab(pvApiCtx, pos);
 
-        delete &data;
+        if (!data.isReference())
+        {
+            delete &data;
+        }
 
         return;
     }
@@ -242,6 +240,22 @@ std::string H5Dataset::ls() const
     return os.str();
 }
 
+void H5Dataset::ls(std::vector<std::string> & name, std::vector<std::string> & type) const
+{
+    herr_t err;
+    OpDataGetLs opdata;
+    opdata.parent = const_cast<H5Dataset *>(this);
+    opdata.name = &name;
+    opdata.type = &type;
+    hsize_t idx = 0;
+
+    err = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, &idx, H5Object::getLsAttributes, &opdata);
+    if (err < 0)
+    {
+        throw H5Exception(__LINE__, __FILE__, _("Cannot list dataset attributes."));
+    }
+}
+
 std::string H5Dataset::toString(const unsigned int indentLevel) const
 {
     std::ostringstream os;
@@ -262,7 +276,7 @@ std::string H5Dataset::toString(const unsigned int indentLevel) const
     return os.str();
 }
 
-hid_t H5Dataset::create(H5Object & loc, const std::string & name, hid_t type, hid_t targettype, hid_t space, void * data)
+hid_t H5Dataset::create(H5Object & loc, const std::string & name, const hid_t type, const hid_t targettype, const hid_t space, void * data)
 {
     herr_t err;
     hid_t dataset = H5Dcreate2(loc.getH5Id(), name.c_str(), targettype, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
index 19f9728..ceef6c3 100644 (file)
@@ -26,13 +26,10 @@ namespace org_modules_hdf5
 class H5Dataset : public H5Object
 {
     hid_t dataset;
-    const std::string name;
 
 public :
 
-    H5Dataset(H5Object & _parent, const char * _name);
     H5Dataset(H5Object & _parent, const std::string & _name);
-    H5Dataset(H5Object & _parent, hid_t _dataset, const char * _name);
     H5Dataset(H5Object & _parent, hid_t _dataset, const std::string & _name);
 
     virtual ~H5Dataset();
@@ -42,17 +39,13 @@ public :
         return dataset;
     }
 
-    virtual bool checkType(const int type) const
+    virtual bool isDataset() const
     {
-        return type == H5O_TYPE_DATASET;
-    }
-
-    virtual const std::string & getName() const
-    {
-        return name;
+        return true;
     }
 
     H5Data & getData();
+    H5Data & getData(H5Dataspace & space, hsize_t * dims);
     H5Dataspace & getSpace();
     H5Type & getDataType();
 
@@ -61,6 +54,7 @@ public :
     virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const;
     virtual std::string toString(const unsigned int indentLevel) const;
     virtual std::string ls() const;
+    virtual void ls(std::vector<std::string> & name, std::vector<std::string> & type) const;
     virtual void printLsInfo(std::ostringstream & os) const;
 
     class H5Layout : public H5Object
@@ -186,7 +180,7 @@ public :
 
     H5Layout & getLayout();
 
-    static hid_t create(H5Object & loc, const std::string & name, hid_t type, hid_t targettype, hid_t space, void * data);
+    static hid_t create(H5Object & loc, const std::string & name, const hid_t type, const hid_t targettype, const hid_t space, void * data);
 
 private:
 
index 2cd0ebb..293ef4a 100644 (file)
@@ -83,6 +83,15 @@ std::vector<unsigned int> H5Dataspace::getDims() const
     return vdims;
 }
 
+void H5Dataspace::select() const
+{
+    herr_t err = H5Sselect_all(space);
+    if (err)
+    {
+        throw H5Exception(__LINE__, __FILE__, _("Cannot select all."));
+    }
+}
+
 void H5Dataspace::getAccessibleAttribute(const std::string & _name, const int pos, void * pvApiCtx) const
 {
     SciErr err;
index 570a1e7..169f39e 100644 (file)
@@ -37,6 +37,81 @@ public:
 
     virtual void getAccessibleAttribute(const std::string & name, const int pos, void * pvApiCtx) const;
 
+    void select() const;
+
+    virtual bool isDataspace() const
+    {
+        return true;
+    }
+
+    template <typename T>
+    hsize_t * select(const unsigned int size, const T * start, const T * stride, const T * count, const T * block) const
+    {
+        if (H5Sget_simple_extent_ndims(space) != size)
+        {
+            throw H5Exception(__LINE__, __FILE__, _("Invalid selection rank."));
+        }
+
+        herr_t err;
+        hsize_t * hstart = new hsize_t[size];
+        hsize_t * hstride = new hsize_t[size];
+        hsize_t * hcount = new hsize_t[size];
+        hsize_t * hblock = new hsize_t[size];
+        hsize_t * dims = new hsize_t[size];
+
+        for (unsigned int i = 0; i < size; i++)
+        {
+            hstart[i] = (hsize_t)start[i] - 1;
+            hstride[i] = stride ? (hsize_t)stride[i] : 1;
+            hblock[i] = block ? (hsize_t)block[i] : 1;
+            hcount[i] = (hsize_t)count[i];
+            dims[i] = hblock[i] * hcount[i];
+        }
+
+        // hstart: coordinates of the starting point in the matrix
+        // hstride:
+        err = H5Sselect_hyperslab(space, H5S_SELECT_SET, hstart, hstride, hcount, hblock);
+        delete[] hstart;
+        delete[] hstride;
+        delete[] hcount;
+        delete[] hblock;
+        if (err < 0)
+        {
+            delete[] dims;
+            throw H5Exception(__LINE__, __FILE__, _("Invalid selection."));
+        }
+
+        if (H5Sselect_valid(space) <= 0)
+        {
+            H5Sselect_all(space);
+            delete[] dims;
+            throw H5Exception(__LINE__, __FILE__, _("Invalid selection."));
+        }
+
+        return dims;
+    }
+
+    template <typename T>
+    void select(const unsigned int size, const T * coords) const
+    {
+        herr_t err;
+        hsize_t * hcoords = new hsize_t[size];
+        H5S_seloper_t selop = H5S_SELECT_SET;
+
+        err = H5Sselect_elements(space, selop, (size_t)size, hcoords);
+        delete[] hcoords;
+        if (err)
+        {
+            throw H5Exception(__LINE__, __FILE__, _("Invalid selection."));
+        }
+
+        if (H5Sselect_valid(space) <= 0)
+        {
+            H5Sselect_all(space);
+            throw H5Exception(__LINE__, __FILE__, _("Invalid selection."));
+        }
+    }
+
     static H5Dataspace & createDataspace(H5Object & parent, const std::string & type);
     static H5Dataspace & createDataspace(H5Object & parent, const int rank, const hsize_t * dims, const hsize_t * maxdims);
 };
index 8e1649b..270fd20 100644 (file)
@@ -150,7 +150,7 @@ H5Object & H5File::getRoot()
     {
         return H5Object::getObject(*this, obj);
     }
-    catch (H5Exception & e)
+    catch (const H5Exception & e)
     {
         H5Oclose(obj);
         throw;
@@ -189,6 +189,17 @@ void H5File::getAccessibleAttribute(const std::string & _name, const int pos, vo
 {
     SciErr err;
     std::string lower(_name);
+
+    /*    try
+        {
+       H5Object & _root = const_cast<H5File *>(this)->getRoot();
+            H5Object & obj = H5Object::getObject(_root, _name);
+            obj.createOnScilabStack(pos, pvApiCtx);
+            return;
+        }
+        catch (const H5Exception & e) { }
+    */
+
     std::transform(_name.begin(), _name.end(), lower.begin(), tolower);
 
     if (lower == "name")
@@ -227,9 +238,8 @@ void H5File::getAccessibleAttribute(const std::string & _name, const int pos, vo
     }
     else if (lower == "root")
     {
-        H5Object & root = const_cast<H5File *>(this)->getRoot();
-        root.createOnScilabStack(pos, pvApiCtx);
-
+        H5Object & _root = const_cast<H5File *>(this)->getRoot();
+        _root.createOnScilabStack(pos, pvApiCtx);
         return;
     }
 
@@ -249,6 +259,13 @@ std::string H5File::dump(std::map<haddr_t, std::string> & alreadyVisited, const
     return os.str();
 }
 
+void H5File::ls(std::vector<std::string> & name, std::vector<std::string> & type) const
+{
+    H5Object & _root = const_cast<H5File *>(this)->getRoot();
+    _root.ls(name, type);
+    delete &_root;
+}
+
 std::string H5File::ls() const
 {
     H5Object & _root = const_cast<H5File *>(this)->getRoot();
index 41992e1..58c460c 100644 (file)
@@ -69,6 +69,7 @@ public :
     virtual std::string toString(const unsigned int indentLevel) const;
     virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel = 0) const;
     virtual std::string ls() const;
+    virtual void ls(std::vector<std::string> & name, std::vector<std::string> & type) const;
 
     static bool checkFileAccess(const std::string & access)
     {
index 74f9a9f..12bab10 100644 (file)
@@ -31,22 +31,12 @@ void H5Group::init()
     }
 }
 
-H5Group::H5Group(H5Object & _parent, const std::string & _name) : H5Object(_parent), name(_name)
+H5Group::H5Group(H5Object & _parent, const std::string & _name) : H5Object(_parent, _name)
 {
     init();
 }
 
-H5Group::H5Group(H5Object & _parent, const char * _name) : H5Object(_parent), name(std::string(_name))
-{
-    init();
-}
-
-H5Group::H5Group(H5Object & _parent, hid_t _group, const char * _name) : H5Object(_parent), group(_group), name(std::string(_name))
-{
-
-}
-
-H5Group::H5Group(H5Object & _parent, hid_t _group, const std::string & _name) : H5Object(_parent), group(_group), name(_name)
+H5Group::H5Group(H5Object & _parent, hid_t _group, const std::string & _name) : H5Object(_parent, _name), group(_group)
 {
 
 }
@@ -140,7 +130,7 @@ void H5Group::getAccessibleAttribute(const std::string & _name, const int pos, v
         obj.createOnScilabStack(pos, pvApiCtx);
         return;
     }
-    catch (H5Exception & e) { }
+    catch (const H5Exception & e) { }
 
     std::transform(_name.begin(), _name.end(), lower.begin(), tolower);
 
@@ -206,11 +196,92 @@ void H5Group::getAccessibleAttribute(const std::string & _name, const int pos, v
     H5Object::getAccessibleAttribute(_name, pos, pvApiCtx);
 }
 
+void H5Group::ls(std::vector<std::string> & name, std::vector<std::string> & type) const
+{
+    herr_t err;
+    OpDataGetLs opdata;
+    opdata.parent = const_cast<H5Group *>(this);
+    opdata.name = &name;
+    opdata.type = &type;
+    hsize_t idx = 0;
+
+    err = H5Literate(group, H5_INDEX_NAME, H5_ITER_INC, &idx, getLsInfo, &opdata);
+    if (err < 0)
+    {
+        throw H5Exception(__LINE__, __FILE__, _("Cannot list group links."));
+    }
+
+    idx = 0;
+    err = H5Aiterate2(group, H5_INDEX_NAME, H5_ITER_INC, &idx, H5Object::getLsAttributes, &opdata);
+    if (err < 0)
+    {
+        throw H5Exception(__LINE__, __FILE__, _("Cannot list group attributes."));
+    }
+}
+
+herr_t H5Group::getLsInfo(hid_t g_id, const char * name, const H5L_info_t * info, void * op_data)
+{
+    H5O_info_t oinfo;
+    herr_t err;
+    H5Object * hobj = 0;
+    hid_t obj;
+    OpDataGetLs & opdata = *(OpDataGetLs *)op_data;
+
+    if (obj < 0)
+    {
+        return (herr_t) - 1;
+    }
+
+    switch (info->type)
+    {
+        case H5L_TYPE_SOFT:
+            opdata.name->push_back(name);
+            opdata.type->push_back("soft");
+            break;
+        case H5L_TYPE_EXTERNAL:
+            opdata.name->push_back(name);
+            opdata.type->push_back("external");
+            break;
+        case H5L_TYPE_HARD:
+            obj = H5Oopen(g_id, name, H5P_DEFAULT);
+            err = H5Oget_info(obj, &oinfo);
+            H5Oclose(obj);
+
+            if (err < 0)
+            {
+                return (herr_t) - 1;
+            }
+
+            switch (oinfo.type)
+            {
+                case H5O_TYPE_GROUP:
+                    opdata.name->push_back(name);
+                    opdata.type->push_back("group");
+                    break;
+                case H5O_TYPE_DATASET:
+                    opdata.name->push_back(name);
+                    opdata.type->push_back("dataset");
+                    break;
+                case H5O_TYPE_NAMED_DATATYPE:
+                    opdata.name->push_back(name);
+                    opdata.type->push_back("type");
+                    break;
+                default:
+                    return (herr_t) - 1;
+            }
+            break;
+        default:
+            return (herr_t) - 1;
+    }
+
+    return (herr_t)0;
+}
+
 std::string H5Group::ls() const
 {
     std::ostringstream os;
     herr_t err;
-    OpData opdata;
+    OpDataPrintLs opdata;
     opdata.parent = const_cast<H5Group *>(this);
     opdata.os = &os;
     hsize_t idx = 0;
@@ -230,7 +301,7 @@ herr_t H5Group::printLsInfo(hid_t g_id, const char * name, const H5L_info_t * in
     herr_t err;
     H5Object * hobj = 0;
     hid_t obj;
-    OpData & opdata = *(OpData *)op_data;
+    OpDataPrintLs & opdata = *(OpDataPrintLs *)op_data;
 
     if (obj < 0)
     {
index dec382f..c8e5c49 100644 (file)
@@ -37,16 +37,13 @@ class H5Group : public H5Object
     {
         H5Object * parent;
         std::ostringstream * os;
-    } OpData;
+    } OpDataPrintLs;
 
     hid_t group;
-    const std::string name;
 
 public:
 
-    H5Group(H5Object & _parent, const char * name);
     H5Group(H5Object & _parent, const std::string & name);
-    H5Group(H5Object & _parent, hid_t _group, const char * _name);
     H5Group(H5Object & _parent, hid_t _group, const std::string & _name);
 
     virtual ~H5Group();
@@ -56,9 +53,9 @@ public:
         return group;
     }
 
-    virtual bool checkType(const int type) const
+    virtual bool isGroup() const
     {
-        return type == H5O_TYPE_GROUP;
+        return true;
     }
 
     virtual H5LinksList & getLinks();
@@ -72,13 +69,10 @@ public:
     virtual H5TypesList & getTypes();
     const unsigned int getLinksSize() const;
     virtual std::string getCompletePath() const;
-    virtual const std::string & getName() const
-    {
-        return name;
-    }
     virtual std::string toString(const unsigned int indentLevel) const;
     virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel = 0) const;
     virtual std::string ls() const;
+    virtual void ls(std::vector<std::string> & name, std::vector<std::string> & type) const;
     virtual void printLsInfo(std::ostringstream & os) const;
 
     virtual void getAccessibleAttribute(const std::string & name, const int pos, void * pvApiCtx) const;
@@ -89,6 +83,7 @@ private :
 
     void init();
     static herr_t printLsInfo(hid_t g_id, const char * name, const H5L_info_t * info, void * op_data);
+    static herr_t getLsInfo(hid_t g_id, const char * name, const H5L_info_t * info, void * op_data);
 };
 }
 
index 76fa6dd..553b59e 100644 (file)
@@ -38,7 +38,7 @@ H5Object & H5HardLink::getLinkedObject() const
     {
         return H5Object::getObject(*const_cast<H5HardLink *>(this), obj);
     }
-    catch (H5Exception & e)
+    catch (const H5Exception & e)
     {
         H5Oclose(obj);
         throw;
index bf70657..f8b53d9 100644 (file)
 namespace org_modules_hdf5
 {
 
-H5Link::H5Link(H5Object & _parent, const char * _name) : H5Object(_parent), name(std::string(_name))
-{
-    if (H5Lexists(_parent.getH5Id(), name.c_str(), H5P_DEFAULT) <= 0)
-    {
-        throw H5Exception(__LINE__, __FILE__, _("The link %s does not exist."), name.c_str());
-    }
-}
-
-H5Link::H5Link(H5Object & _parent, const std::string & _name) : H5Object(_parent), name(_name)
+H5Link::H5Link(H5Object & _parent, const std::string & _name) : H5Object(_parent, _name)
 {
     if (H5Lexists(_parent.getH5Id(), name.c_str(), H5P_DEFAULT) <= 0)
     {
index f31af52..caedcc3 100644 (file)
@@ -24,19 +24,12 @@ class H5Link : public H5Object
 
 protected:
 
-    const std::string name;
-
 public:
 
-    H5Link(H5Object & _parent, const char * name);
     H5Link(H5Object & _parent, const std::string & name);
 
     virtual ~H5Link();
 
-    virtual const std::string & getName() const
-    {
-        return name;
-    }
     virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel = 0) const
     {
         return "";
index 5c5ff3d..d20b858 100644 (file)
@@ -24,7 +24,21 @@ class H5ListObject : public H5Object
 
 public :
 
-    H5ListObject(H5Object & _parent) : H5Object(_parent) { }
+    H5ListObject(H5Object & _parent) : H5Object(_parent), indexSize(0), indexList(0) { }
+    H5ListObject(H5Object & _parent, const unsigned int size, const unsigned int * index) : H5Object(_parent), indexSize(size), indexList(index) { }
+
+    virtual ~H5ListObject()
+    {
+        if (indexList)
+        {
+            delete indexList;
+        }
+    }
+
+    virtual bool isList() const
+    {
+        return true;
+    }
 
     virtual void setObject(const unsigned int pos, T & object) = 0;
     virtual T & getObject(const int pos) = 0;
@@ -46,6 +60,12 @@ public :
         T & obj = const_cast<H5ListObject *>(this)->getObject(name);
         obj.createOnScilabStack(pos, pvApiCtx);
     }
+
+protected :
+
+    const unsigned int indexSize;
+    const unsigned int * indexList;
+
 };
 }
 
index b56aed6..51fbb0f 100644 (file)
@@ -45,6 +45,18 @@ public :
 
     H5NamedObjectsList(H5Group & _parent, const int _baseType, const int _linkType, const std::string _baseTypeName) : H5ListObject<T>(_parent), baseType(_baseType), linkType(_linkType), baseTypeName(_baseTypeName), prevPos(0), idx(0) { }
 
+    H5NamedObjectsList(H5Group & _parent, const unsigned int _size, const unsigned int * _index, const int _baseType, const int _linkType, const std::string _baseTypeName) : H5ListObject<T>(_parent, _size, _index), baseType(_baseType), linkType(_linkType), baseTypeName(_baseTypeName), prevPos(0), idx(0)
+    {
+        const unsigned int lsize = getSize(true);
+        for (unsigned int i = 0; i < H5ListObject<T>::indexSize; i++)
+        {
+            if (H5ListObject<T>::indexList[i] >= lsize)
+            {
+                throw H5Exception(__LINE__, __FILE__, _("Invalid index at position %d"), i);
+            }
+        }
+    }
+
     virtual ~H5NamedObjectsList()
     {
 
@@ -147,22 +159,34 @@ public :
 
     const unsigned int getSize() const
     {
-        hsize_t idx = 0;
-        OpData op_data;
-        herr_t err;
-
-        op_data.u.count = 0;
-        op_data.linktype = linkType;
-        op_data.basetype = baseType;
-
-        err = H5Literate(H5Object::getParent().getH5Id(), H5_INDEX_NAME, H5_ITER_INC, &idx, count, &op_data);
+        return getSize(false);
+    }
 
-        if (err < 0)
+    const unsigned int getSize(const bool indexChecking) const
+    {
+        if (H5ListObject<T>::indexList && !indexChecking)
         {
-            throw H5Exception(__LINE__, __FILE__, _("Cannot get the number of groups %d."));
+            return H5ListObject<T>::indexSize;
         }
+        else
+        {
+            hsize_t idx = 0;
+            OpData op_data;
+            herr_t err;
+
+            op_data.u.count = 0;
+            op_data.linktype = linkType;
+            op_data.basetype = baseType;
+
+            err = H5Literate(H5Object::getParent().getH5Id(), H5_INDEX_NAME, H5_ITER_INC, &idx, count, &op_data);
 
-        return op_data.u.count;
+            if (err < 0)
+            {
+                throw H5Exception(__LINE__, __FILE__, _("Cannot get the number of objects."));
+            }
+
+            return op_data.u.count;
+        }
     }
 
     virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const
@@ -221,32 +245,45 @@ private:
     {
         OpData op_data;
         herr_t err;
+        int _pos = pos;
+
+        if (H5ListObject<T>::indexList)
+        {
+            if (pos >= 0 && pos < H5ListObject<T>::indexSize)
+            {
+                _pos = H5ListObject<T>::indexList[pos];
+            }
+            else
+            {
+                throw H5Exception(__LINE__, __FILE__, _("Invalid index: %d."), pos);
+            }
+        }
 
         op_data.linktype = linkType;
         op_data.basetype = baseType;
 
-        if (pos < prevPos)
+        if (_pos < prevPos)
         {
             idx = 0;
-            op_data.u.count = pos + 1;
+            op_data.u.count = _pos + 1;
         }
         else
         {
-            op_data.u.count = pos - prevPos + 1;
+            op_data.u.count = _pos - prevPos + 1;
         }
 
         err = H5Literate(H5Object::getParent().getH5Id(), H5_INDEX_NAME, H5_ITER_INC, &idx, getElement, &op_data);
 
         if (err > 0)
         {
-            prevPos = pos + 1;
+            prevPos = _pos + 1;
             return *new T(H5Object::getParent(), op_data.u.name);
         }
         else
         {
             idx = 0;
             prevPos = 0;
-            throw H5Exception(__LINE__, __FILE__, _("Cannot get the number of groups %d %d."), getSize(), pos);
+            throw H5Exception(__LINE__, __FILE__, _("Cannot get object at position %d."), pos);
         }
     }
 
index 4c8f4a7..bd151ca 100644 (file)
 #include "H5Dataset.hxx"
 #include "H5Type.hxx"
 #include "H5AttributesList.hxx"
+#include "H5Attribute.hxx"
 
 namespace org_modules_hdf5
 {
 
 H5Object & H5Object::root = *new H5Object();
 
+H5Object::H5Object(H5Object & _parent, const std::string & _name) : parent(_parent), children(std::set<H5Object *>()), locked(false), scilabId(-1), name(_name)
+{
+    parent.registerChild(this);
+}
+
 H5Object::H5Object(H5Object & _parent) : parent(_parent), children(std::set<H5Object *>()), locked(false), scilabId(-1)
 {
     parent.registerChild(this);
@@ -212,25 +218,26 @@ H5Object & H5Object::getObject(H5Object & parent, hid_t obj)
 
 H5Object & H5Object::getObject(H5Object & parent, const std::string & name)
 {
-    return getObject(parent, name.c_str());
-}
-
-H5Object & H5Object::getObject(H5Object & parent, const char * name)
-{
     hid_t loc = parent.getH5Id();
     H5O_info_t info;
     herr_t err;
     H5Object * obj = 0;
 
-    if (H5Lexists(loc, name, H5P_DEFAULT) <= 0)
+    if (H5Lexists(loc, name.c_str(), H5P_DEFAULT) <= 0)
     {
-        throw H5Exception(__LINE__, __FILE__, _("Invalid name: %s."), name);
+        if (H5Aexists(loc, name.c_str()) <= 0)
+        {
+            throw H5Exception(__LINE__, __FILE__, _("Invalid name: %s."), name.c_str());
+        }
+
+        return *new H5Attribute(parent, name);
     }
 
-    err = H5Oget_info_by_name(loc, name, &info, H5P_DEFAULT);
+    err = H5Oget_info_by_name(loc, name.c_str(), &info, H5P_DEFAULT);
+
     if (err < 0)
     {
-        throw H5Exception(__LINE__, __FILE__, _("Invalid name: %s."), name);
+        throw H5Exception(__LINE__, __FILE__, _("Invalid name: %s."), name.c_str());
     }
 
     switch (info.type)
@@ -251,24 +258,6 @@ H5Object & H5Object::getObject(H5Object & parent, const char * name)
     return *obj;
 }
 
-/*    std::string H5Object::getCompletePath() const
-      {
-      std::string name = getName();
-      if (this != &root && name != "")
-      {
-      std::string path = parent.getCompletePath();
-      if (path == "/")
-      {
-      return "/" + name;
-      }
-      else
-      {
-      return path + "/" + name;
-      }
-      }
-      return "";
-      }*/
-
 std::string H5Object::getCompletePath() const
 {
     std::string name = getName();
@@ -361,4 +350,13 @@ herr_t H5Object::iterateGetInfo(hid_t g_id, const char * name, const H5L_info_t
 
     return (herr_t)0;
 }
+
+herr_t H5Object::getLsAttributes(hid_t location_id, const char * attr_name, const H5A_info_t * ainfo, void * op_data)
+{
+    OpDataGetLs & opdata = *(OpDataGetLs *)op_data;
+    opdata.name->push_back(std::string(attr_name));
+    opdata.type->push_back("attribute");
+
+    return (herr_t)0;
+}
 }
index 3a7af1f..25f9fb2 100644 (file)
@@ -48,7 +48,6 @@ class H5Object
     bool locked;
     H5Object & parent;
     int scilabId;
-    std::string name;
 
     friend class H5AttributesList;
     friend class H5LinkList;
@@ -57,6 +56,7 @@ class H5Object
 public :
 
     H5Object(H5Object & _parent);
+    H5Object(H5Object & _parent, const std::string & _name);
     virtual ~H5Object();
 
     virtual hid_t getH5Id() const;
@@ -75,6 +75,41 @@ public :
         return false;
     }
 
+    virtual bool isGroup() const
+    {
+        return false;
+    }
+
+    virtual bool isAttribute() const
+    {
+        return false;
+    }
+
+    virtual bool isReference() const
+    {
+        return false;
+    }
+
+    virtual bool isDataspace() const
+    {
+        return false;
+    }
+
+    virtual bool isDataset() const
+    {
+        return false;
+    }
+
+    virtual bool isType() const
+    {
+        return false;
+    }
+
+    virtual bool isList() const
+    {
+        return false;
+    }
+
     virtual haddr_t getAddr() const
     {
         return getInfo().addr;
@@ -84,6 +119,20 @@ public :
     {
         return name;
     }
+
+    virtual const std::string getBaseName() const
+    {
+        std::string::size_type pos = name.find_last_of('/');
+        if (pos == std::string::npos)
+        {
+            return name;
+        }
+        else
+        {
+            return name.substr(pos + 1);
+        }
+    }
+
     virtual std::string getCompletePath() const;
     virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel = 0) const
     {
@@ -95,6 +144,11 @@ public :
         return "";
     }
 
+    virtual void ls(std::vector<std::string> & name, std::vector<std::string> & type) const
+    {
+
+    }
+
     virtual void printLsInfo(std::ostringstream & os) const
     {
         return;
@@ -124,11 +178,6 @@ public :
         throw H5Exception(__LINE__, __FILE__, _("Invalid operation"));
     }
 
-    virtual bool checkType(const int type) const
-    {
-        return getInfo().type == type;
-    }
-
     void setScilabId(const int id)
     {
         scilabId = id;
@@ -177,11 +226,19 @@ public :
     }
 
     static H5Object & getObject(H5Object & parent, hid_t obj);
-    static H5Object & getObject(H5Object & parent, const char * name);
     static H5Object & getObject(H5Object & parent, const std::string & name);
     static void getLinksInfo(const H5Object & obj, std::vector<std::string> & linksName, std::vector<std::string> & types, std::vector<std::string> & linksType);
 
 protected :
+
+    typedef struct
+    {
+        H5Object * parent;
+        std::vector<std::string> * name;
+        std::vector<std::string> * type;
+    } OpDataGetLs;
+
+    const std::string name;
     std::set<H5Object *> children;
     void registerChild(H5Object * child)
     {
@@ -192,6 +249,8 @@ protected :
         if (!locked) children.erase(child);
     }
 
+    static herr_t getLsAttributes(hid_t location_id, const char * attr_name, const H5A_info_t * ainfo, void * op_data);
+
 private :
 
     H5Object() : parent(*this) { }
diff --git a/scilab/modules/hdf5/src/cpp/H5ReferenceData.cpp b/scilab/modules/hdf5/src/cpp/H5ReferenceData.cpp
new file mode 100644 (file)
index 0000000..6008146
--- /dev/null
@@ -0,0 +1,239 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
+ *
+ * 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
+ *
+ */
+
+#include "H5ReferenceData.hxx"
+
+namespace org_modules_hdf5
+{
+
+H5ReferenceData::H5ReferenceData(H5Object & _parent, const bool _datasetReference, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, char * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner), datasetReference(_datasetReference)
+{
+
+}
+
+H5ReferenceData::~H5ReferenceData()
+{
+
+}
+
+const char ** H5ReferenceData::getReferencesName() const
+{
+    // TODO: tenir compte du stride
+    hid_t file = getFile().getH5Id();
+    char * cdata = static_cast<char *>(data) + offset;
+    const char ** names = new const char*[totalSize];
+
+    for (int i = 0; i < totalSize; i++)
+    {
+        void * ref = &(((void **)cdata)[i]);
+        hid_t obj = H5Rdereference(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref);
+        H5O_info_t info;
+        H5Oget_info(obj, &info);
+        H5Oclose(obj);
+        ssize_t size = H5Rget_name(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref, 0, 0);
+        char * name = new char[size + 1];
+        H5Rget_name(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref, name, size + 1);
+
+        names[i] = name;
+    }
+
+    return names;
+}
+
+H5Object & H5ReferenceData::getReferencesObject(const unsigned int size, const double * index) const
+{
+    H5Object * obj = 0;
+    unsigned int * iindex = new unsigned int[size];
+    for (unsigned int i = 0; i < size; i++)
+    {
+        iindex[i] = (unsigned int)(index[i]);
+    }
+
+    try
+    {
+        obj = &getReferencesObject(size, iindex);
+        delete[] iindex;
+        return *obj;
+    }
+    catch (const H5Exception & e)
+    {
+        delete[] iindex;
+        throw;
+    }
+}
+
+H5Object & H5ReferenceData::getReferencesObject(const unsigned int size, const unsigned int * index) const
+{
+    char * cdata = static_cast<char *>(data) + offset;
+    void ** ref = 0;
+    unsigned int pos = 0;
+    unsigned int cumprod = 1;
+    H5O_info_t info;
+    H5Object * hobj;
+    hid_t obj;
+    hid_t file;
+    ssize_t ssize;
+    char * name = 0;
+    std::string _name;
+
+    for (unsigned int i = 0; i < size; i++)
+    {
+        pos += cumprod * index[i];
+        cumprod *= dims[i];
+    }
+
+    if (pos >= totalSize)
+    {
+        throw H5Exception(__LINE__, __FILE__, _("Invalid index."));
+    }
+
+    file = getFile().getH5Id();
+    ref = &(((void **)cdata)[pos]);
+    obj = H5Rdereference(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref);
+    if (obj < 0)
+    {
+        throw H5Exception(__LINE__, __FILE__, _("Cannot open object at the given position."));
+    }
+
+    ssize = H5Rget_name(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref, 0, 0);
+    name = new char[ssize + 1];
+    H5Rget_name(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref, name, ssize + 1);
+    _name = std::string(name);
+    delete[] name;
+
+    H5Oget_info(obj, &info);
+    switch (info.type)
+    {
+        case H5O_TYPE_GROUP:
+            hobj = new H5Group(getParent(), obj, _name);
+            break;
+        case H5O_TYPE_DATASET:
+            hobj = new H5Dataset(getParent(), obj, _name);
+            break;
+        case H5O_TYPE_NAMED_DATATYPE:
+            hobj = new H5Type(getParent(), obj, _name);
+            break;
+        case H5O_TYPE_UNKNOWN:
+        default:
+            H5Oclose(obj);
+            throw H5Exception(__LINE__, __FILE__, _("Unknown HDF5 object"));
+    }
+
+    return *hobj;
+}
+
+H5Object ** H5ReferenceData::getReferencesObject() const
+{
+    hid_t file = getFile().getH5Id();
+    char * cdata = static_cast<char *>(data) + offset;
+    H5Object ** objs = new H5Object *[totalSize];
+
+    for (int i = 0; i < totalSize; i++)
+    {
+        void * ref = &(((void **)cdata)[i]);
+        hid_t obj = H5Rdereference(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref);
+        objs[i] = &H5Object::getObject(getParent(), obj);
+    }
+
+    return objs;
+}
+
+void H5ReferenceData::deleteReferencesObjects(H5Object ** objs, const unsigned int size)
+{
+    for (unsigned int i = 0; i < size; i++)
+    {
+        delete objs[i];
+    }
+
+    delete[] objs;
+}
+
+std::string H5ReferenceData::toString(const unsigned int indentLevel) const
+{
+    std::ostringstream os;
+    std::string indentString = H5Object::getIndentString(indentLevel + 1);
+
+    os << H5Object::getIndentString(indentLevel) << "HDF5 Reference data" << std::endl
+       << indentString << _("Dimensions") << ": [";
+
+    if (ndims == 0)
+    {
+        os << "1 x 1]";
+    }
+    else if (ndims == 1)
+    {
+        os << "1 x " << dims[0] << "]";
+    }
+    else
+    {
+        for (unsigned int i = 0; i < ndims - 1; i++)
+        {
+            os << dims[i] << " x ";
+        }
+        os << dims[ndims - 1] << "]";
+    }
+
+    return os.str();
+}
+
+std::string H5ReferenceData::dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const
+{
+    return H5DataConverter::dump(alreadyVisited, indentLevel, ndims, dims, *this);
+}
+
+void H5ReferenceData::printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
+{
+    char * cdata = static_cast<char *>(data) + offset;
+    void ** ref = &(((void **)cdata)[pos]);
+    hid_t file = getFile().getH5Id();
+    hid_t obj = H5Rdereference(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref);
+    ssize_t size = H5Rget_name(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref, 0, 0);
+    char * name = new char[size + 1];
+    H5O_info_t info;
+
+    H5Rget_name(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref, name, size + 1);
+    H5Oget_info(obj, &info);
+    H5Oclose(obj);
+
+    switch (info.type)
+    {
+        case H5O_TYPE_GROUP:
+            os << "GROUP ";
+            break;
+        case H5O_TYPE_DATASET:
+            os << "DATASET ";
+            break;
+        case H5O_TYPE_NAMED_DATATYPE:
+            os << "DATATYPE ";
+            break;
+        case H5O_TYPE_UNKNOWN:
+        default:
+            delete[] name;
+            throw H5Exception(__LINE__, __FILE__, _("Unknown HDF5 object"));
+    }
+
+    os << (haddr_t)(*ref) << " " << name;
+    delete[] name;
+}
+
+void H5ReferenceData::toScilab(void * pvApiCtx, const int lhsPosition, int * parentList, const int listPosition) const
+{
+    if (parentList)
+    {
+        createInScilabList(parentList, lhsPosition, listPosition, pvApiCtx);
+    }
+    else
+    {
+        createOnScilabStack(lhsPosition, pvApiCtx);
+    }
+}
+}
index 64ce9f3..1d93418 100644 (file)
@@ -14,6 +14,9 @@
 #define __H5REFERENCEDATA_HXX__
 
 #include "H5File.hxx"
+#include "H5Group.hxx"
+#include "H5Dataset.hxx"
+#include "H5Type.hxx"
 #include "H5BasicData.hxx"
 
 namespace org_modules_hdf5
@@ -26,104 +29,30 @@ class H5ReferenceData : public H5BasicData<char>
 
 public:
 
-    H5ReferenceData(H5Object & _parent, const bool _datasetReference, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, char * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner), datasetReference(_datasetReference)
-    {
+    H5ReferenceData(H5Object & _parent, const bool _datasetReference, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, char * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true);
+    virtual ~H5ReferenceData();
 
+    bool isReference() const
+    {
+        return true;
     }
+    const char ** getReferencesName() const;
 
-    virtual ~H5ReferenceData()
-    {
+    H5Object ** getReferencesObject() const;
 
-    }
+    H5Object & getReferencesObject(const unsigned int size, const unsigned int * index) const;
 
-    const char ** getReferencesName() const
-    {
-        // TODO: tenir compte du stride
-        hid_t file = getFile().getH5Id();
-        char * cdata = static_cast<char *>(data) + offset;
-        const char ** names = new const char*[totalSize];
-
-        for (int i = 0; i < totalSize; i++)
-        {
-            void * ref = &(((void **)cdata)[i]);
-            hid_t obj = H5Rdereference(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref);
-            H5O_info_t info;
-            H5Oget_info(obj, &info);
-            H5Oclose(obj);
-            ssize_t size = H5Rget_name(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref, 0, 0);
-            char * name = new char[size + 1];
-            H5Rget_name(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref, name, size + 1);
-
-            names[i] = name;
-        }
-
-        return names;
-    }
+    H5Object & getReferencesObject(const unsigned int size, const double * index) const;
 
-    H5Object ** getReferencesObject() const
-    {
-        hid_t file = getFile().getH5Id();
-        char * cdata = static_cast<char *>(data) + offset;
-        H5Object ** objs = new H5Object *[totalSize];
-
-        for (int i = 0; i < totalSize; i++)
-        {
-            void * ref = &(((void **)cdata)[i]);
-            hid_t obj = H5Rdereference(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref);
-            objs[i] = &H5Object::getObject(getParent(), obj);
-        }
-
-        return objs;
-    }
+    virtual std::string toString(const unsigned int indentLevel) const;
 
-    static void deleteReferencesObjects(H5Object ** objs, const unsigned int size)
-    {
-        for (unsigned int i = 0; i < size; i++)
-        {
-            delete objs[i];
-        }
+    virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const;
 
-        delete[] objs;
-    }
+    virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const;
 
-    std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const
-    {
-        return H5DataConverter::dump(alreadyVisited, indentLevel, ndims, dims, *this);
-    }
+    virtual void toScilab(void * pvApiCtx, const int lhsPosition, int * parentList = 0, const int listPosition = 0) const;
 
-    virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
-    {
-        char * cdata = static_cast<char *>(data) + offset;
-        void ** ref = &(((void **)cdata)[pos]);
-        hid_t file = getFile().getH5Id();
-        hid_t obj = H5Rdereference(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref);
-        ssize_t size = H5Rget_name(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref, 0, 0);
-        char * name = new char[size + 1];
-        H5O_info_t info;
-        H5Oget_info(obj, &info);
-        H5Oclose(obj);
-        H5Rget_name(file, datasetReference ? H5R_DATASET_REGION : H5R_OBJECT, ref, name, size + 1);
-
-        switch (info.type)
-        {
-            case H5O_TYPE_GROUP:
-                os << "GROUP ";
-                break;
-            case H5O_TYPE_DATASET:
-                os << "DATASET ";
-                break;
-            case H5O_TYPE_NAMED_DATATYPE:
-                os << "DATATYPE ";
-                break;
-            case H5O_TYPE_UNKNOWN:
-            default:
-                delete[] name;
-                throw H5Exception(__LINE__, __FILE__, _("Unknown HDF5 object"));
-        }
-
-        os << (haddr_t)(*ref) << " " << name;
-        delete[] name;
-    }
+    static void deleteReferencesObjects(H5Object ** objs, const unsigned int size);
 };
 }
 
diff --git a/scilab/modules/hdf5/src/cpp/H5StringData.cpp b/scilab/modules/hdf5/src/cpp/H5StringData.cpp
new file mode 100644 (file)
index 0000000..2dcbe8b
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
+ *
+ * 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
+ *
+ */
+
+#include "H5StringData.hxx"
+
+namespace org_modules_hdf5
+{
+
+H5StringData::H5StringData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _stringSize, const hsize_t _ndims, const hsize_t * _dims, char * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5Data(_parent, _totalSize, _stringSize, _ndims, _dims, _data, _stride == -1 ? _stringSize : _stride, _offset, _dataOwner)
+{
+    char * __data = static_cast<char *>(_data);
+    transformedData = new char*[totalSize];
+
+    if (stride == -1)
+    {
+        *transformedData = __data;
+        for (unsigned int i = 1; i < (unsigned int)totalSize; i++)
+        {
+            transformedData[i] = transformedData[i - 1] + dataSize;
+        }
+    }
+    else
+    {
+        for (unsigned int i = 0; i < (unsigned int)totalSize; i++)
+        {
+            transformedData[i] = __data + offset;
+            __data += stride;
+        }
+    }
+}
+
+H5StringData::H5StringData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _stringSize, const hsize_t _ndims, const hsize_t * _dims, char ** _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5Data(_parent, _totalSize, _stringSize, _ndims, _dims, _data, _stride == -1 ? _stringSize : _stride, _offset, _dataOwner), transformedData(0)
+{
+
+}
+
+H5StringData::~H5StringData()
+{
+    if (transformedData)
+    {
+        delete[] transformedData;
+    }
+}
+
+void * H5StringData::getData() const
+{
+    if (transformedData)
+    {
+        return transformedData;
+    }
+    else
+    {
+        return H5Data::getData();
+    }
+}
+
+void H5StringData::printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
+{
+    os << "\"" << static_cast<char **>(getData())[pos] << "\"";
+}
+
+void H5StringData::toScilab(void * pvApiCtx, const int lhsPosition, int * parentList, const int listPosition) const
+{
+    SciErr err;
+    char ** _data = static_cast<char **>(getData());
+
+    if (ndims == 0)
+    {
+        H5BasicData<char *>::create(pvApiCtx, lhsPosition, 1, 1, _data, parentList, listPosition);
+    }
+    else if (ndims == 1)
+    {
+        H5BasicData<char *>::create(pvApiCtx, lhsPosition, 1, *dims, _data, parentList, listPosition);
+    }
+    else
+    {
+        char ** newData = new char *[totalSize];
+        if (ndims == 2)
+        {
+            H5DataConverter::C2FHypermatrix(2, dims, 0, _data, newData);
+            H5BasicData<char *>::create(pvApiCtx, lhsPosition, dims[0], dims[1], newData, parentList, listPosition);
+        }
+        else
+        {
+            int * list = getHypermatrix(pvApiCtx, lhsPosition, parentList, listPosition);
+            H5DataConverter::C2FHypermatrix(ndims, dims, (int)totalSize, _data, newData);
+            H5BasicData<char *>::create(pvApiCtx, lhsPosition, 1, (int)totalSize, newData, parentList, listPosition);
+        }
+        delete[] newData;
+    }
+}
+
+std::string H5StringData::dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const
+{
+    return H5DataConverter::dump(alreadyVisited, indentLevel, ndims, dims, *this);
+}
+}
index bb30df4..93d8ac9 100644 (file)
@@ -27,89 +27,19 @@ protected:
 
 public:
 
-    H5StringData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _stringSize, const hsize_t _ndims, const hsize_t * _dims, char * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5Data(_parent, _totalSize, _stringSize, _ndims, _dims, _data, _stride == -1 ? _stringSize : _stride, _offset, _dataOwner)
-    {
-        char * __data = static_cast<char *>(_data);
-        transformedData = new char*[totalSize];
+    H5StringData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _stringSize, const hsize_t _ndims, const hsize_t * _dims, char * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true);
 
-        if (stride == -1)
-        {
-            *transformedData = __data;
-            for (unsigned int i = 1; i < (unsigned int)totalSize; i++)
-            {
-                transformedData[i] = transformedData[i - 1] + dataSize;
-            }
-        }
-        else
-        {
-            for (unsigned int i = 0; i < (unsigned int)totalSize; i++)
-            {
-                transformedData[i] = __data + offset;
-                __data += stride;
-            }
-        }
-    }
+    H5StringData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _stringSize, const hsize_t _ndims, const hsize_t * _dims, char ** _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true);
 
-    H5StringData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _stringSize, const hsize_t _ndims, const hsize_t * _dims, char ** _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5Data(_parent, _totalSize, _stringSize, _ndims, _dims, _data, _stride == -1 ? _stringSize : _stride, _offset, _dataOwner), transformedData(0)
-    {
+    virtual ~H5StringData();
 
-    }
+    virtual void * getData() const;
 
-    virtual ~H5StringData()
-    {
-        if (transformedData)
-        {
-            delete[] transformedData;
-        }
-    }
+    virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const;
 
-    virtual void * getData() const
-    {
-        if (transformedData)
-        {
-            return transformedData;
-        }
-        else
-        {
-            return H5Data::getData();
-        }
-    }
+    virtual void toScilab(void * pvApiCtx, const int lhsPosition, int * parentList = 0, const int listPosition = 0) const;
 
-    virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
-    {
-        os << "\"" << static_cast<char **>(getData())[pos] << "\"";
-    }
-
-    virtual void toScilab(void * pvApiCtx, const int lhsPosition, int * parentList = 0, const int listPosition = 0) const
-    {
-        SciErr err;
-        char ** _data = static_cast<char **>(getData());
-        if (ndims == 1)
-        {
-            H5BasicData<char>::create(pvApiCtx, lhsPosition, 1, *dims, _data, parentList, listPosition);
-        }
-        else
-        {
-            char ** newData = new char*[totalSize];
-            if (ndims == 2)
-            {
-                H5DataConverter::C2FHypermatrix(2, dims, 0, _data, newData);
-                H5BasicData<char>::create(pvApiCtx, lhsPosition, dims[0], dims[1], newData, parentList, listPosition);
-            }
-            else
-            {
-                int * list = getHypermatrix(pvApiCtx, lhsPosition, parentList, listPosition);
-                H5DataConverter::C2FHypermatrix(ndims, dims, (int)totalSize, _data, newData);
-                H5BasicData<char>::create(pvApiCtx, lhsPosition, 1, (int)totalSize, newData, parentList, listPosition);
-            }
-            delete[] newData;
-        }
-    }
-
-    virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const
-    {
-        return H5DataConverter::dump(alreadyVisited, indentLevel, ndims, dims, *this);
-    }
+    virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const;
 };
 }
 
diff --git a/scilab/modules/hdf5/src/cpp/H5TransformedData.hxx b/scilab/modules/hdf5/src/cpp/H5TransformedData.hxx
new file mode 100644 (file)
index 0000000..fb34f38
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
+ *
+ * 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 __H5TRANSFORMEDDATA_HXX__
+#define __H5TRANSFORMEDDATA_HXX__
+
+#include "H5BasicData.hxx"
+
+namespace org_modules_hdf5
+{
+
+template <typename T, typename U>
+class H5TransformedData : public H5Data
+{
+
+protected:
+
+    U * transformedData;
+
+public:
+
+    H5TransformedData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, T * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5Data(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner)
+    {
+        transformedData = new U[totalSize];
+
+        if (stride == -1)
+        {
+            for (unsigned int i = 0; i < (unsigned int)totalSize; i++)
+            {
+                transformedData[i] = (U)(_data[i]);
+            }
+        }
+        else
+        {
+            char * __data = (char *)_data;
+            for (unsigned int i = 0; i < (unsigned int)totalSize; i++)
+            {
+                transformedData[i] = (U)(*((T *)(__data + offset)));
+                __data += stride;
+            }
+        }
+    }
+
+    virtual ~H5TransformedData()
+    {
+        delete[] transformedData;
+    }
+
+    virtual void * getData() const
+    {
+        return transformedData;
+    }
+
+    virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
+    {
+        os << transformedData[pos];
+    }
+
+    virtual void toScilab(void * pvApiCtx, const int lhsPosition, int * parentList = 0, const int listPosition = 0) const
+    {
+        SciErr err;
+        U * newData = 0;
+
+        if (ndims == 0)
+        {
+            H5BasicData<U>::create(pvApiCtx, lhsPosition, 1, 1, static_cast<U *>(getData()), parentList, listPosition);
+        }
+        else if (ndims == 1)
+        {
+            H5BasicData<U>::alloc(pvApiCtx, lhsPosition, 1, *dims, parentList, listPosition, &newData);
+            memcpy(static_cast<void *>(newData), static_cast<void *>(transformedData), totalSize * sizeof(U));
+        }
+        else
+        {
+            if (ndims == 2)
+            {
+                H5BasicData<U>::alloc(pvApiCtx, lhsPosition, dims[0], dims[1], parentList, listPosition, &newData);
+                H5DataConverter::C2FHypermatrix(2, dims, 0, static_cast<U *>(getData()), newData);
+            }
+            else
+            {
+                int * list = getHypermatrix(pvApiCtx, lhsPosition, parentList, listPosition);
+                H5BasicData<U>::alloc(pvApiCtx, lhsPosition, 1, totalSize, list, 3, &newData);
+                H5DataConverter::C2FHypermatrix(ndims, dims, totalSize, static_cast<U *>(getData()), newData);
+            }
+        }
+    }
+
+    virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const
+    {
+        return H5DataConverter::dump(alreadyVisited, indentLevel, ndims, dims, *this);
+    }
+};
+}
+
+#endif // __H5TRANSFORMEDDATA_HXX__
index 40f1cfb..6b2d43f 100644 (file)
@@ -26,28 +26,17 @@ void H5Type::init()
     }
 }
 
-H5Type::H5Type(H5Object & _parent, const hid_t _type) : H5Object(_parent), type(_type), name("")
+H5Type::H5Type(H5Object & _parent, const hid_t _type) : H5Object(_parent), type(_type)
 {
 
 }
 
-H5Type::H5Type(H5Object & _parent, const hid_t _type, const char * _name) : H5Object(_parent), type(_type), name(std::string(_name))
+H5Type::H5Type(H5Object & _parent, const hid_t _type, const std::string & _name) : H5Object(_parent, _name), type(_type)
 {
 
 }
 
-
-H5Type::H5Type(H5Object & _parent, const hid_t _type, const std::string & _name) : H5Object(_parent), type(_type), name(_name)
-{
-
-}
-
-H5Type::H5Type(H5Object & _parent, const char * _name) : H5Object(_parent), name(std::string(_name))
-{
-    init();
-}
-
-H5Type::H5Type(H5Object & _parent, const std::string & _name) : H5Object(_parent), name(_name)
+H5Type::H5Type(H5Object & _parent, const std::string & _name) : H5Object(_parent, _name)
 {
     init();
 }
index 85eb1cc..3e7c545 100644 (file)
@@ -24,16 +24,13 @@ namespace org_modules_hdf5
 class H5Type : public H5Object
 {
     hid_t type;
-    const std::string name;
 
     static std::map<std::string, hid_t> nameToType;
 
 public:
 
     H5Type(H5Object & _parent, hid_t type);
-    H5Type(H5Object & _parent, const char * name);
     H5Type(H5Object & _parent, const std::string & name);
-    H5Type(H5Object & _parent, hid_t type, const char * name);
     H5Type(H5Object & _parent, hid_t type, const std::string & name);
 
     virtual ~H5Type();
@@ -43,15 +40,11 @@ public:
         return type;
     }
 
-    virtual bool checkType(const int type) const
+    virtual bool isType() const
     {
-        return !name.empty() && type == H5O_TYPE_NAMED_DATATYPE;
+        return true;
     }
 
-    virtual const std::string & getName() const
-    {
-        return name;
-    }
     virtual std::string getClassName() const;
     virtual std::string getTypeName() const;
     virtual unsigned int getTypeSize() const;
index 55de740..ec43c8c 100644 (file)
@@ -142,7 +142,7 @@ void HDF5Scilab::readAttributeData(const std::string & filename, const std::stri
     {
         readAttributeData(root, ".", attrName, pos, pvApiCtx);
     }
-    catch (H5Exception & e)
+    catch (const H5Exception & e)
     {
         delete file;
         throw;
@@ -151,16 +151,16 @@ void HDF5Scilab::readAttributeData(const std::string & filename, const std::stri
     delete file;
 }
 
-void HDF5Scilab::readData(const std::string & filename, const std::string & name, int pos, void * pvApiCtx)
+void HDF5Scilab::readData(const std::string & filename, const std::string & name, const unsigned int size, const double * start, const double * stride, const double * count, const double * block, int pos, void * pvApiCtx)
 {
     H5File * file = new H5File(filename, name, "r");
     H5Object & root = file->getRoot();
 
     try
     {
-        readData(root, ".", pos, pvApiCtx);
+        readData(root, ".", size, start, stride, count, block, pos, pvApiCtx);
     }
-    catch (H5Exception & e)
+    catch (const H5Exception & e)
     {
         delete file;
         throw;
@@ -169,10 +169,11 @@ void HDF5Scilab::readData(const std::string & filename, const std::string & name
     delete file;
 }
 
-void HDF5Scilab::readData(H5Object & obj, const std::string & name, int pos, void * pvApiCtx)
+void HDF5Scilab::readData(H5Object & obj, const std::string & name, const unsigned int size, const double * start, const double * stride, const double * count, const double * block, int pos, void * pvApiCtx)
 {
     H5Object * hobj = &obj;
     const bool mustDelete = name != "." || obj.isFile();
+    hsize_t * dims = 0;
 
     if (name != ".")
     {
@@ -185,25 +186,47 @@ void HDF5Scilab::readData(H5Object & obj, const std::string & name, int pos, voi
 
     try
     {
-        if (hobj->checkType(H5O_TYPE_DATASET))
+        if (hobj->isDataset())
         {
-            reinterpret_cast<H5Dataset *>(hobj)->getData().toScilab(pvApiCtx, pos);
+            H5Dataset * dataset = reinterpret_cast<H5Dataset *>(hobj);
+            H5Dataspace & space = dataset->getSpace();
+            H5Data * data = 0;
+            try
+            {
+                dims = space.select(size, start, stride, count, block);
+                data = &dataset->getData(space, dims);
+                data->toScilab(pvApiCtx, pos);
+            }
+            catch (const H5Exception & e)
+            {
+                if (data)
+                {
+                    delete data;
+                }
+                delete &space;
+                throw;
+            }
+
+            if (!data->isReference())
+            {
+                delete data;
+            }
         }
         else
         {
-            if (mustDelete)
-            {
-                delete hobj;
-            }
             throw H5Exception(__LINE__, __FILE__, _("Invalid object: not a dataset."));
         }
     }
-    catch (H5Exception & e)
+    catch (const H5Exception & e)
     {
         if (mustDelete)
         {
             delete hobj;
         }
+        if (dims)
+        {
+            delete[] dims;
+        }
         throw;
     }
 
@@ -211,20 +234,46 @@ void HDF5Scilab::readData(H5Object & obj, const std::string & name, int pos, voi
     {
         delete hobj;
     }
+    if (dims)
+    {
+        delete[] dims;
+    }
 }
 
-void HDF5Scilab::deleteLink(H5Object & parent, const std::string & name)
+void HDF5Scilab::deleteObject(H5Object & parent, const std::string & name)
 {
     herr_t err;
-    if (H5Lexists(parent.getH5Id(), name.c_str(), H5P_DEFAULT) <= 0)
+    hid_t loc = parent.getH5Id();
+    std::string _name = name;
+    if (name.empty())
+    {
+        _name = parent.getName();
+        if (!parent.isFile())
+        {
+            loc = parent.getParent().getH5Id();
+        }
+    }
+
+    if (H5Lexists(loc, _name.c_str(), H5P_DEFAULT) <= 0)
     {
-        throw H5Exception(__LINE__, __FILE__, _("The link doesn't exist: %s."), name.c_str());
+        if (H5Aexists(loc, _name.c_str()) <= 0)
+        {
+            throw H5Exception(__LINE__, __FILE__, _("The name doesn't exist: %s."), _name.c_str());
+        }
+
+        err = H5Adelete(loc, _name.c_str());
+        if (err < 0)
+        {
+            throw H5Exception(__LINE__, __FILE__, _("Cannot remove the attribute: %s."), _name.c_str());
+        }
+
+        return;
     }
 
-    err = H5Ldelete(parent.getH5Id(), name.c_str(), H5P_DEFAULT);
+    err = H5Ldelete(loc, _name.c_str(), H5P_DEFAULT);
     if (err < 0)
     {
-        throw H5Exception(__LINE__, __FILE__, _("Cannot remove the link: %s."), name.c_str());
+        throw H5Exception(__LINE__, __FILE__, _("Cannot remove the link: %s."), _name.c_str());
     }
 }
 
@@ -293,4 +342,196 @@ void HDF5Scilab::createLink(H5Object & parent, const std::string & name, H5Objec
 {
     createLink(parent, name, targetObject.getFile().getFileName(), targetObject.getCompletePath());
 }
+
+void HDF5Scilab::copy(H5Object & src, H5Object & dest, const std::string & dlocation)
+{
+    H5Object * sobj = &src;
+    H5Object * dobj = &dest;
+    std::string name;
+    herr_t err = 0;
+
+    if (src.isFile())
+    {
+        sobj = &reinterpret_cast<H5File *>(sobj)->getRoot();
+    }
+
+    if (dest.isFile())
+    {
+        dobj = &reinterpret_cast<H5File *>(dobj)->getRoot();
+    }
+
+    name = dlocation.empty() ? sobj->getBaseName() : dlocation;
+
+    if (sobj->isAttribute())
+    {
+        H5Attribute * attr = reinterpret_cast<H5Attribute *>(sobj);
+        try
+        {
+            attr->copy(*dobj, name);
+        }
+        catch (const H5Exception & e)
+        {
+            if (src.isFile())
+            {
+                delete sobj;
+            }
+
+            if (dest.isFile())
+            {
+                delete dobj;
+            }
+            throw;
+        }
+    }
+    else
+    {
+        err = H5Ocopy(sobj->getH5Id(), ".", dobj->getH5Id(), name.c_str(), H5P_DEFAULT, H5P_DEFAULT);
+    }
+
+    if (src.isFile())
+    {
+        delete sobj;
+    }
+
+    if (dest.isFile())
+    {
+        delete dobj;
+    }
+
+    if (err < 0)
+    {
+        throw H5Exception(__LINE__, __FILE__, _("Cannot copy object."));
+    }
+
+    dest.getFile().flush(true);
+}
+
+void HDF5Scilab::copy(H5Object & src, const std::string & dfile, const std::string & dlocation)
+{
+    H5File * dest = new H5File(dfile, dlocation);
+
+    try
+    {
+        copy(src, *dest, ".");
+        delete dest;
+    }
+    catch (const H5Exception & e)
+    {
+        delete dest;
+        throw;
+    }
+}
+
+void HDF5Scilab::copy(const std::string & sfile, const std::string & slocation, H5Object & dest, const std::string & dlocation)
+{
+    H5File * src = new H5File(sfile, slocation);
+
+    try
+    {
+        copy(*src, dest, dlocation);
+        delete src;
+    }
+    catch (const H5Exception & e)
+    {
+        delete src;
+        throw;
+    }
+}
+
+void HDF5Scilab::copy(const std::string & sfile, const std::string & slocation, const std::string & dfile, const std::string & dlocation)
+{
+    H5File * src = new H5File(sfile, slocation);
+    H5File * dest;
+
+    try
+    {
+        dest = new H5File(dfile, dlocation);
+    }
+    catch (const H5Exception & e)
+    {
+        delete src;
+        throw;
+    }
+
+    try
+    {
+        copy(*src, *dest, ".");
+        delete src;
+        delete dest;
+    }
+    catch (const H5Exception & e)
+    {
+        delete src;
+        delete dest;
+        throw;
+    }
+}
+
+void HDF5Scilab::ls(H5Object & obj, std::string name, int position, void * pvApiCtx)
+{
+    std::vector<std::string> _name;
+    std::vector<std::string> _type;
+    std::vector<const char *> strs;
+    H5Object & hobj = name.empty() ? obj : H5Object::getObject(obj, name);
+
+    hobj.ls(_name, _type);
+    strs.reserve(_name.size() * 2);
+    for (unsigned int i = 0; i < _name.size(); i++)
+    {
+        strs.push_back(_name[i].c_str());
+    }
+    for (unsigned int i = 0; i < _type.size(); i++)
+    {
+        strs.push_back(_type[i].c_str());
+    }
+
+    if (!name.empty())
+    {
+        delete &hobj;
+    }
+
+    H5BasicData<char *>::create(pvApiCtx, position, _name.size(), 2, const_cast<char **>(&(strs[0])), 0, 0);
+}
+
+void HDF5Scilab::ls(std::string path, std::string name, int position, void * pvApiCtx)
+{
+    H5File * file = new H5File(path, "/", "r");
+
+    try
+    {
+        ls(*file, name, position, pvApiCtx);
+    }
+    catch (const H5Exception & e)
+    {
+        delete file;
+        throw;
+    }
+
+    delete file;
+}
+
+bool HDF5Scilab::checkType(const H5Object & obj, const H5ObjectType type)
+{
+    switch (type)
+    {
+        case H5FILE:
+            return obj.isFile();
+        case H5GROUP:
+            return obj.isGroup();
+        case H5DATASET:
+            return obj.isDataset();
+        case H5ATTRIBUTE:
+            return obj.isAttribute();
+        case H5SPACE:
+            return obj.isDataspace();
+        case H5TYPE:
+            return obj.isType();
+        case H5REFERENCE:
+            return obj.isReference();
+        case H5LIST:
+            return obj.isList();
+        default:
+            return false;
+    }
+}
 }
index cbdcac5..3c3f38f 100644 (file)
@@ -19,7 +19,9 @@
 #include "H5File.hxx"
 #include "H5Group.hxx"
 #include "H5Dataset.hxx"
+#include "H5Dataspace.hxx"
 #include "H5Attribute.hxx"
+#include "H5BasicData.hxx"
 #include "H5Data.hxx"
 #include "H5VariableScope.hxx"
 
@@ -40,6 +42,17 @@ class HDF5Scilab
 
 public:
 
+    enum H5ObjectType {
+        H5FILE,
+        H5GROUP,
+        H5DATASET,
+        H5ATTRIBUTE,
+        H5SPACE,
+        H5TYPE,
+        H5REFERENCE,
+        H5LIST
+    };
+
     static int getH5ObjectId(int * mlist, void * pvApiCtx);
 
     static H5Object * getH5Object(int * mlist, void * pvApiCtx);
@@ -50,15 +63,15 @@ public:
 
     static void split(const std::string & str, std::vector<std::string> & v, const char c = '\n');
 
-    static void readData(const std::string & filename, const std::string & name, int pos, void * pvApiCtx);
+    static void readData(const std::string & filename, const std::string & name, const unsigned int size, const double * start, const double * stride, const double * count, const double * block, int pos, void * pvApiCtx);
 
-    static void readData(H5Object & obj, const std::string & name, int pos, void * pvApiCtx);
+    static void readData(H5Object & obj, const std::string & name, const unsigned int size, const double * start, const double * stride, const double * count, const double * block, int pos, void * pvApiCtx);
 
     static void readAttributeData(H5Object & obj, const std::string & path, const std::string & attrName, int pos, void * pvApiCtx);
 
     static void readAttributeData(const std::string & filename, const std::string & path, const std::string & attrName, int pos, void * pvApiCtx);
 
-    static void deleteLink(H5Object & parent, const std::string & name);
+    static void deleteObject(H5Object & parent, const std::string & name);
 
     static void createLink(H5Object & parent, const std::string & name, const std::string & targetPath, const bool hard);
 
@@ -68,6 +81,20 @@ public:
 
     static void createLink(H5Object & parent, const std::string & name, H5Object & targetObject);
 
+    static void copy(H5Object & src, H5Object & dest, const std::string & dlocation);
+
+    static void copy(H5Object & src, const std::string & dfile, const std::string & dlocation);
+
+    static void copy(const std::string & sfile, const std::string & slocation, H5Object & dest, const std::string & dlocation);
+
+    static void copy(const std::string & sfile, const std::string & slocation, const std::string & dfile, const std::string & dlocation);
+
+    static void ls(H5Object & obj, std::string name, int position, void * pvApiCtx);
+
+    static void ls(std::string path, std::string name, int position, void * pvApiCtx);
+
+    static bool checkType(const H5Object & obj, const H5ObjectType type);
+
     template <typename T, typename U>
     static U & create(H5Object & parent, const std::string & name, const unsigned int rank, const hsize_t * dims, const hsize_t * maxdims, T * data, const hid_t targetType)
     {
@@ -146,7 +173,7 @@ public:
             H5Tclose(type);
             H5Sclose(space);
         }
-        catch (H5Exception & e)
+        catch (const H5Exception & e)
         {
             H5Tclose(type);
             H5Sclose(space);
@@ -182,7 +209,7 @@ public:
             }
             return obj;
         }
-        catch (H5Exception & e)
+        catch (const H5Exception & e)
         {
             if (targettype >= 0)
             {
index a65fed9..3bb2d25 100644 (file)
@@ -275,7 +275,7 @@ int h5create(char *fname, unsigned long fname_len)
         }
         }
     }
-    catch (H5Exception & e)
+    catch (const H5Exception & e)
     {
         Scierror(999, _("%s: %s\n"), fname, e.what());
         return 0;