HDF5: handle bitfield and opaque datatyps 75/9275/1
Calixte DENIZET [Tue, 25 Sep 2012 17:14:27 +0000 (19:14 +0200)]
Change-Id: I72c4f63f23ec12266b1a0c2997208c8436a0c93e

scilab/modules/hdf5/src/cpp/H5BasicData.hxx
scilab/modules/hdf5/src/cpp/H5BitfieldData.hxx
scilab/modules/hdf5/src/cpp/H5DataFactory.cpp
scilab/modules/hdf5/src/cpp/H5Object.hxx
scilab/modules/hdf5/src/cpp/H5OpaqueData.hxx

index 57329c2..93201ce 100644 (file)
@@ -91,19 +91,32 @@ public:
         {
             if (stride == -1)
             {
-                memcpy(static_cast<void *>(dest), data, totalSize * sizeof(T));
+                memcpy(static_cast<void *>(dest), data, totalSize * dataSize);
             }
             else if (transformedData)
             {
-                memcpy(static_cast<void *>(dest), static_cast<void *>(transformedData), totalSize * sizeof(T));
+                memcpy(static_cast<void *>(dest), static_cast<void *>(transformedData), totalSize * dataSize);
             }
             else
             {
                 char * cdata = static_cast<char *>(data) + offset;
-                for (int i = 0; i < totalSize; i++)
+                if (sizeof(T) == dataSize)
                 {
-                    dest[i] = *((T *)cdata);
-                    cdata += stride;
+                    for (int i = 0; i < totalSize; i++)
+                    {
+                        dest[i] = *((T *)cdata);
+                        cdata += stride;
+                    }
+                }
+                else
+                {
+                    char * _dest = reinterpret_cast<char *>(dest);
+                    for (int i = 0; i < totalSize; i++)
+                    {
+                        memcpy(_dest, cdata, dataSize);
+                        cdata += stride;
+                        _dest += dataSize;
+                    }
                 }
             }
         }
@@ -123,9 +136,9 @@ public:
         {
             if (!transformedData)
             {
-                T * dest = new T[totalSize];
-                copyData(dest);
-                const_cast<H5BasicData *>(this)->transformedData = dest;
+                char * dest = new char[totalSize * dataSize];
+                copyData(reinterpret_cast<T *>(dest));
+                const_cast<H5BasicData *>(this)->transformedData = reinterpret_cast<T *>(dest);
             }
 
             return static_cast<void *>(transformedData);
index 699fbc2..152c704 100644 (file)
@@ -35,7 +35,7 @@ public:
 
     virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
     {
-        os << "0x" << std::hex << (int)static_cast<unsigned char * >(getData())[pos];
+        os << "0x" << std::hex << std::setfill('0') << std::setw(2) << (int)static_cast<unsigned char * >(getData())[pos];
     }
 };
 
@@ -57,7 +57,7 @@ public:
     virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
     {
         const unsigned short x = static_cast<unsigned short * >(getData())[pos];
-        os << std::hex << (x & 0xFF) << ":" << ((x >> 8) & 0xFF);
+        os << std::hex << std::setfill('0') << std::setw(2) << (x & 0xFF) << ":" << ((x >> 8) & 0xFF);
     }
 };
 
@@ -79,7 +79,7 @@ public:
     virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
     {
         const unsigned int x = static_cast<unsigned int * >(getData())[pos];
-        os << std::hex << (x & 0xFF) << ":" << ((x >> 8) & 0xFF) << ":" << ((x >> 16) & 0xFF) << ":" << ((x >> 24) & 0xFF);
+        os << std::hex << std::setfill('0') << std::setw(2) << (x & 0xFF) << ":" << ((x >> 8) & 0xFF) << ":" << ((x >> 16) & 0xFF) << ":" << ((x >> 24) & 0xFF);
     }
 };
 
@@ -103,7 +103,7 @@ public:
     virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
     {
         const unsigned long long x = static_cast<unsigned long long * >(getData())[pos];
-        os << std::hex << (x & 0xFF) << ":" << ((x >> 8) & 0xFF) << ":" << ((x >> 16) & 0xFF) << ":" << ((x >> 24) & 0xFF) << ":" << ((x >> 32) & 0xFF) << ":" << ((x >> 40) & 0xFF) << ":" << ((x >> 48) & 0xFF) << ":" << ((x >> 56) & 0xFF);
+        os << std::hex << std::setfill('0') << std::setw(2) << (x & 0xFF) << ":" << ((x >> 8) & 0xFF) << ":" << ((x >> 16) & 0xFF) << ":" << ((x >> 24) & 0xFF) << ":" << ((x >> 32) & 0xFF) << ":" << ((x >> 40) & 0xFF) << ":" << ((x >> 48) & 0xFF) << ":" << ((x >> 56) & 0xFF);
     }
 };
 
index 55c547a..053a77b 100644 (file)
@@ -183,7 +183,7 @@ H5Data & H5DataFactory::getData(H5Object & parent, const hsize_t totalSize, cons
 
             //return *new H5BitfieldData(parent, totalSize, dataSize, ndims, dims, (char *)data, stride, offset, false);
         case H5T_OPAQUE:
-            return *new H5OpaqueData(parent, totalSize, dataSize, ndims, dims, (char *)data, stride, offset, false);
+            return *new H5OpaqueData(parent, totalSize, dataSize, ndims, dims, (unsigned char *)data, stride, offset, false);
         case H5T_COMPOUND:
         {
             const unsigned int nmembers = (unsigned int)H5Tget_nmembers(type);
@@ -406,7 +406,7 @@ H5OpaqueData & H5DataFactory::getOpaqueData(H5Object & parent, const hid_t obj,
 
     getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
 
-    return *new H5OpaqueData(parent, totalSize, dataSize, ndims, dims, static_cast<char *>(data));
+    return *new H5OpaqueData(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned char *>(data));
 }
 
 H5Data & H5DataFactory::getCompoundData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
index 25f9fb2..cb8b638 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <algorithm>
 #include <iostream>
+#include <iomanip>
 #include <string>
 #include <set>
 #include <map>
index d45af6c..6c5fa71 100644 (file)
 namespace org_modules_hdf5
 {
 
-class H5OpaqueData : public H5BasicData<char>
+class H5OpaqueData : public H5BasicData<unsigned char>
 {
 
 public:
 
-    H5OpaqueData(H5Object & _parent, 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)
+    H5OpaqueData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, unsigned 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)
     {
-        //dims[ndims - 1] = dataSize;
+
     }
 
     virtual ~H5OpaqueData()
     {
 
     }
+
+    virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
+    {
+        const unsigned char * x = &static_cast<unsigned char * >(getData())[pos * dataSize];
+        for (unsigned int i = 0; i < dataSize - 1; i++)
+        {
+            os << std::hex << std::setfill('0') << std::setw(2) << (int)x[i] << ":";
+        }
+        os << std::hex << std::setfill('0') << std::setw(2) << (int)x[dataSize - 1];
+    }
+
+    virtual void toScilab(void * pvApiCtx, const int lhsPosition, int * parentList = 0, const int listPosition = 0) const
+    {
+        SciErr err;
+        unsigned char * newData = 0;
+
+        if (ndims == 0)
+        {
+            alloc(pvApiCtx, lhsPosition, 1, dataSize, parentList, listPosition, &newData);
+            copyData(newData);
+        }
+        else if (ndims == 1)
+        {
+            alloc(pvApiCtx, lhsPosition, *dims, dataSize, parentList, listPosition, &newData);
+            copyData(newData);
+        }
+        else
+        {
+            int * list = getHypermatrix(pvApiCtx, lhsPosition, parentList, listPosition);
+            hsize_t * _dims = new hsize_t[ndims + 1];
+            memcpy(_dims, dims, ndims * sizeof(hsize_t));
+            _dims[ndims] = (hsize_t)dataSize;
+
+            try
+            {
+                alloc(pvApiCtx, lhsPosition, 1, totalSize * dataSize, list, 3, &newData);
+                H5DataConverter::C2FHypermatrix(ndims + 1, _dims, totalSize * dataSize, static_cast<unsigned char *>(getData()), newData);
+            }
+            catch (const H5Exception & e)
+            {
+                delete[] _dims;
+                throw;
+            }
+
+            delete[] _dims;
+        }
+    }
 };
 }