Bug 13689 fixed: There were errors in reading enum from hdf5 files 10/16210/2
Calixte DENIZET [Mon, 23 Mar 2015 09:34:13 +0000 (10:34 +0100)]
Change-Id: Id87fcc69224297e4fa05be9ef625c41b83ca44b4

scilab/CHANGES_5.5.X
scilab/modules/hdf5/src/cpp/H5DataFactory.cpp
scilab/modules/hdf5/src/cpp/H5EnumData.hxx
scilab/modules/hdf5/tests/nonreg_tests/bug_13689.dia.ref [new file with mode: 0644]
scilab/modules/hdf5/tests/nonreg_tests/bug_13689.h5 [new file with mode: 0644]
scilab/modules/hdf5/tests/nonreg_tests/bug_13689.tst [new file with mode: 0644]

index 91404b7..46ff9e7 100644 (file)
@@ -86,6 +86,8 @@ Scilab Bug Fixes
 
 * Bug #13681 fixed - Calling cdfnor to get the X vector sometimes produced a vector with some NaN values.
 
+* Bug #13689 fixed - There were errors in reading enum from hdf5 files.
+
 * Bug #13690 fixed - tight_limits property can now manage X, Y and Z axis separately.
 
 * Bug #13692 fixed - group returned an error for a discrete dynamical system with a specified sample time.
index 71c5ae3..e63b6f0 100644 (file)
@@ -149,7 +149,7 @@ H5Data & H5DataFactory::getObjectData(H5Object & parent, const hsize_t totalSize
                 case 4:
                     return *new H5Bitfield4Data(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned int *>(data), stride, offset, dataOwner);
                 case 8:
-                    //return *new H5BitfieldData<unsigned long long>(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned long long *>(data), stride, offset, false);
+                //return *new H5BitfieldData<unsigned long long>(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned long long *>(data), stride, offset, false);
                 default:
                     throw H5Exception(__LINE__, __FILE__, _("Bitfield is too big"));
             }
@@ -173,7 +173,40 @@ H5Data & H5DataFactory::getObjectData(H5Object & parent, const hsize_t totalSize
                 free(mname);
             }
 
-            return *new H5EnumData(parent, totalSize, dataSize, ndims, dims, (unsigned int *)data, nmembers, names, stride, offset, dataOwner);
+            if (H5Tget_sign(type) == H5T_SGN_NONE)
+            {
+                switch (dataSize)
+                {
+                    case 1:
+                        return *new H5EnumData<unsigned char>(parent, totalSize, dataSize, ndims, dims, (unsigned char *)data, type, H5T_NATIVE_UCHAR, nmembers, names, stride, offset, dataOwner);
+                    case 2:
+                        return *new H5EnumData<unsigned short>(parent, totalSize, dataSize, ndims, dims, (unsigned short *)data, type, H5T_NATIVE_USHORT, nmembers, names, stride, offset, dataOwner);
+                    case 4:
+                        return *new H5EnumData<unsigned int>(parent, totalSize, dataSize, ndims, dims, (unsigned int *)data, type, H5T_NATIVE_UINT, nmembers, names, stride, offset, dataOwner);
+#ifdef __SCILAB_INT64__
+                    case 8:
+                        return *new H5EnumData<unsigned long long>(parent, totalSize, dataSize, ndims, dims, (unsigned long long *)data, type, H5T_NATIVE_ULLONG, nmembers, names, stride, offset, dataOwner);
+#endif
+                }
+            }
+            else
+            {
+                switch (dataSize)
+                {
+                    case 1:
+                        return *new H5EnumData<char>(parent, totalSize, dataSize, ndims, dims, (char *)data, type, H5T_NATIVE_CHAR, nmembers, names, stride, offset, dataOwner);
+                    case 2:
+                        return *new H5EnumData<short>(parent, totalSize, dataSize, ndims, dims, (short *)data, type, H5T_NATIVE_SHORT, nmembers, names, stride, offset, dataOwner);
+                    case 4:
+                        return *new H5EnumData<int>(parent, totalSize, dataSize, ndims, dims, (int *)data, type, H5T_NATIVE_INT, nmembers, names, stride, offset, dataOwner);
+#ifdef __SCILAB_INT64__
+                    case 8:
+                        return *new H5EnumData<long long>(parent, totalSize, dataSize, ndims, dims, (long long *)data, type, H5T_NATIVE_LLONG, nmembers, names, stride, offset, dataOwner);
+#endif
+                }
+            }
+
+            return *new H5EnumData<char>(parent, totalSize, dataSize, ndims, dims, (char *)data, type, H5T_NATIVE_CHAR, nmembers, names, stride, offset, dataOwner);
         }
         case H5T_VLEN:
             return *new H5VlenData(parent, totalSize, dataSize, ndims, dims, static_cast<char *>(data), type, stride, offset, dataOwner);
index 7be2c18..e510f96 100644 (file)
 #ifndef __H5ENUMDATA_HXX__
 #define __H5ENUMDATA_HXX__
 
+#include <map>
+#include <string>
+#include <vector>
+
 #include "H5Data.hxx"
 
 namespace org_modules_hdf5
 {
 
-class H5EnumData : public H5BasicData<unsigned int>
+template<typename T>
+class H5EnumData : public H5BasicData<T>
 {
-
-    const int nmembers;
+    typedef std::map<T, std::string> MapType;
+    const unsigned int nmembers;
     const std::string * names;
+    MapType map;
 
 public:
 
-    H5EnumData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, unsigned int * _data, const int _nmembers, const std::string * _names, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData<unsigned int>(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner), nmembers(_nmembers), names(_names)
+    H5EnumData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, T * _data, hid_t enumType, hid_t nativeType, const unsigned int _nmembers, const std::string * _names, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData<T>(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner), nmembers(_nmembers), names(_names)
     {
-
+        hid_t super = H5Tget_super(enumType);
+        for (unsigned long long i = 0; i < nmembers; ++i)
+        {
+            T value = 0;
+            H5Tget_member_value(enumType, i, &value);
+            H5Tconvert(super, nativeType, 1, &value, 0, H5P_DEFAULT);
+            map.insert(std::pair<T, std::string>(value, names[i]));
+        }
     }
 
     virtual ~H5EnumData()
@@ -38,6 +51,12 @@ public:
             delete[] names;
         }
     }
+
+    virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
+    {
+        typename MapType::const_iterator i = map.find(static_cast<T *>(H5BasicData<T>::getData())[pos]);
+        os << i->second;
+    }
 };
 }
 
diff --git a/scilab/modules/hdf5/tests/nonreg_tests/bug_13689.dia.ref b/scilab/modules/hdf5/tests/nonreg_tests/bug_13689.dia.ref
new file mode 100644 (file)
index 0000000..5c68126
--- /dev/null
@@ -0,0 +1,20 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 13689 -->
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13689
+//
+// <-- Short Description -->
+// 
+// There were errors in reading enum from hdf5 files
+h5 = h5open(SCI + "/modules/hdf5/tests/nonreg_tests/bug_13689.h5");
+assert_checkequal(h5.root.BooleanT.data, uint8(1));
+assert_checkequal(h5.root.BooleanF.data, uint8(0));
diff --git a/scilab/modules/hdf5/tests/nonreg_tests/bug_13689.h5 b/scilab/modules/hdf5/tests/nonreg_tests/bug_13689.h5
new file mode 100644 (file)
index 0000000..cdabcf3
Binary files /dev/null and b/scilab/modules/hdf5/tests/nonreg_tests/bug_13689.h5 differ
diff --git a/scilab/modules/hdf5/tests/nonreg_tests/bug_13689.tst b/scilab/modules/hdf5/tests/nonreg_tests/bug_13689.tst
new file mode 100644 (file)
index 0000000..11df6d2
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 13689 -->
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13689
+//
+// <-- Short Description -->
+//
+// There were errors in reading enum from hdf5 files
+
+h5 = h5open(SCI + "/modules/hdf5/tests/nonreg_tests/bug_13689.h5");
+assert_checkequal(h5.root.BooleanT.data, uint8(1));
+assert_checkequal(h5.root.BooleanF.data, uint8(0));
\ No newline at end of file