Salome HOME
PAL6948 (Persistence in MED). Get byte order of dataset and store it in ASCII format
authoreap <eap@opencascade.com>
Mon, 7 Nov 2005 15:12:02 +0000 (15:12 +0000)
committereap <eap@opencascade.com>
Mon, 7 Nov 2005 15:12:02 +0000 (15:12 +0000)
src/HDFPersist/HDFascii.cc
src/HDFPersist/HDFdataset.cc
src/HDFPersist/HDFdataset.hxx
src/HDFPersist/HDFdatasetCreate.c
src/HDFPersist/HDFdatasetGetOrder.c [new file with mode: 0644]
src/HDFPersist/hdfi.h

index 54577e068aa526121294237f31a6b79e80be638a..3e5d386e5034c0797c196448deeaf6e0a6bb40ac 100644 (file)
@@ -220,7 +220,8 @@ void SaveDatasetInASCIIfile(HDFdataset *hdf_dataset, FILE* fp, int ident)
   long ndim = hdf_dataset->nDim(); //Get number of dimesions
   hdf_size *dim = new hdf_size[ndim];
   hdf_type type = hdf_dataset->GetType();
-  int nbAttr = hdf_dataset->nAttributes(), j; 
+  hdf_byte_order order = hdf_dataset->GetOrder();
+  int nbAttr = hdf_dataset->nAttributes(); 
 
   TCollection_AsciiString anIdent(ident, '\t');
   TCollection_AsciiString anIdentChild(ident+1, '\t');
@@ -247,7 +248,8 @@ void SaveDatasetInASCIIfile(HDFdataset *hdf_dataset, FILE* fp, int ident)
   delete dim;
 
   /*fprintf(fp, "%s%li:", anIdentChild.ToCString(), size);*/
-  fprintf(fp, "%li:", size);
+//   fprintf(fp, "%li:", size);
+  fprintf(fp, "%li %i:", size, order);
 
   if (type == HDF_STRING) {    
     char* val = new char[size];
@@ -507,6 +509,7 @@ bool CreateDatasetFromASCII(HDFcontainerObject *father, FILE *fp)
 {
   char name[HDF_NAME_MAX_LEN+1];
   hdf_type type;
+  hdf_byte_order order;
   int nbDim, nbAttr;
   long i, size;
 
@@ -522,15 +525,22 @@ bool CreateDatasetFromASCII(HDFcontainerObject *father, FILE *fp)
     sizeArray[i] = dim;
   }
  
-  HDFdataset* hdf_dataset = new HDFdataset(new_name, father,type, sizeArray, nbDim);
+  // order (2-d member) was not written in earlier versions
+  char tmp;
+  int nbRead = fscanf(fp, "%li %i%c", &size, &order, &tmp);
+  if ( nbRead < 2 ) { // fscanf stops before ":"
+    fscanf(fp, "%c", &tmp);
+    order = H5T_ORDER_NONE;
+  }
+  if ( type != HDF_FLOAT64 )  // use order only for FLOAT64
+    order = H5T_ORDER_NONE;
+
+  HDFdataset* hdf_dataset = new HDFdataset(new_name, father,type, sizeArray, nbDim, order);
   delete new_name;
   delete sizeArray;
 
   hdf_dataset->CreateOnDisk();
 
-  char tmp;
-  fscanf(fp, "%li%c", &size, &tmp);
-
   if (type == HDF_STRING) {    
     char *val = new char[size+1];
     fread(val, 1, size, fp);
index 84a2f5ae633eb0cf75e0f30a7570f6039a9812b9..789f6e1a6f4f053a7b8f6df82ceea9cee25a0347 100644 (file)
@@ -44,7 +44,7 @@ herr_t dataset_attr(hid_t loc_id, const char *attr_name, void *operator_data)
 }
 
 HDFdataset::HDFdataset(char *name, HDFcontainerObject *father,hdf_type type, 
-                      hdf_size dim[], int dimsize)
+                      hdf_size dim[], int dimsize, hdf_byte_order order)
   : HDFinternalObject(name)
 {
   int i;
@@ -55,6 +55,7 @@ HDFdataset::HDFdataset(char *name, HDFcontainerObject *father,hdf_type type,
   _type = type;
   _ndim = dimsize;
   _dim = new hdf_size[dimsize];
+  _byte_order = order;
   _size = 1;
   _attribute = NULL;
   for (i=0;i<dimsize;i++)
@@ -74,6 +75,7 @@ HDFdataset::HDFdataset(char *name,HDFcontainerObject *father)
   _type = HDF_NONE;
   _ndim = -1;
   _dim = 0;
+  _byte_order = H5T_ORDER_ERROR;
   _size = -1;
   _attribute = NULL;
 }
@@ -85,7 +87,7 @@ HDFdataset::~HDFdataset()
 
 void HDFdataset::CreateOnDisk()
 {
-  if ((_id = HDFdatasetCreate(_fid,_name,_type,_dim,_ndim)) < 0)
+  if ((_id = HDFdatasetCreate(_fid,_name,_type,_dim,_ndim,_byte_order)) < 0)
     throw HDFexception("Can't create dataset");
 }
 
@@ -198,6 +200,14 @@ int HDFdataset::GetSize()
   return _size;
 }
 
+hdf_byte_order HDFdataset::GetOrder()
+{
+  if (_byte_order < 0 )
+    if ((_byte_order = HDFdatasetGetOrder( _id )) < 0)
+      throw HDFexception("Can't determine the byte order of the dataset");
+  return _byte_order;
+}
+
 hdf_object_type HDFdataset::GetObjectType()
 {
   return HDF_DATASET;
index b1e076903688c9ea8c3707be497b8d8a41e779b7..e417da9e0e5c64c4b0bfc434d027af3c21e3fec6 100644 (file)
@@ -42,13 +42,14 @@ private :
   hdf_idt _fid;
   hdf_type _type;
   hdf_size *_dim;
+  hdf_byte_order _byte_order;
   int _size;
   int _ndim;
   char* _attribute;
 
 public:
   HDFdataset(char *name, HDFcontainerObject *father,hdf_type type, 
-            hdf_size dim[],int dimsize);
+            hdf_size dim[],int dimsize, hdf_byte_order order = H5T_ORDER_NONE);
 
   HDFdataset(char *name,HDFcontainerObject *father);
   virtual ~HDFdataset();
@@ -66,6 +67,7 @@ public:
   void GetDim(hdf_size dim[]);
   int GetSize();
   hdf_object_type GetObjectType();
+  hdf_byte_order GetOrder();
 
   int nAttributes();
   char* GetAttributeName(unsigned idx);
index 70e8ddd503597d89e043f4c5a8d5effd14dc07c8..095c400c47d7ffd4e3ab43efedda90e4503a0ada 100644 (file)
@@ -36,17 +36,18 @@ Module : SALOME
  *     - name (IN)     : dataset name
  *     - type (IN)     : dataset type (HDF_STRING,HDF_INT32,HDF_INT64,HDF_FLOAT64)
  *     - dimd (IN)     : dataset size
+ *     - order(IN)     : byte order (H5T_ORDER_NONE, H5T_ORDER_LE, H5T_ORDER_BE)
  * - Result : 
  *     - if success : returns dataset ID
  *     - if failure : -1
  */ 
 
 hdf_idt HDFdatasetCreate(hdf_idt pid,char *name,hdf_type type,
-                        hdf_size *dimd, int ndim)
+                        hdf_size *dimd, int ndim, hdf_byte_order order)
 {
   hdf_idt dataset, dataspace = 0;
   hdf_err ret;
-  int type_hdf;
+  hdf_idt type_hdf, new_type_hdf = -1;
 
   switch(type)
     {
@@ -71,9 +72,9 @@ hdf_idt HDFdatasetCreate(hdf_idt pid,char *name,hdf_type type,
       break;
 
     case HDF_STRING :           
-      if((type_hdf = H5Tcopy(H5T_C_S1)) < 0)
+      if((new_type_hdf = H5Tcopy(H5T_C_S1)) < 0)
        return -1;
-      if((ret = H5Tset_size(type_hdf,1)) < 0)
+      if((ret = H5Tset_size(new_type_hdf,1)) < 0)
        return -1;
       break;
 
@@ -81,18 +82,33 @@ hdf_idt HDFdatasetCreate(hdf_idt pid,char *name,hdf_type type,
       return -1;
     }
 
+  /* set order */
+  if ( order != H5T_ORDER_ERROR && 
+       order != H5T_ORDER_NONE && 
+       type  != HDF_STRING )
+    {
+      if (( new_type_hdf = H5Tcopy( type_hdf )) < 0 )
+        return -1;
+      if (( ret = H5Tset_order (new_type_hdf, order )) < 0 )
+        return -1;
+    }
+
   if ((dataset = H5Dopen(pid,name)) < 0)
     {
       if ((dataspace = H5Screate_simple(ndim, dimd, NULL)) < 0)                                                                
        return -1;
-      if ((dataset = H5Dcreate(pid,name,type_hdf,dataspace, H5P_DEFAULT)) < 0)
+      if ((dataset = H5Dcreate(pid,name,
+                               new_type_hdf < 0 ? type_hdf : new_type_hdf,
+                               dataspace, H5P_DEFAULT)) < 0)
        return -1;
     }
   else
     return -1;
 
+  if ( ! (new_type_hdf < 0) && (ret = H5Tclose(new_type_hdf)) < 0)
+    return -1;
   if ((ret = H5Sclose(dataspace)) < 0)
-    return -1;           
+    return -1;
 
   return dataset;
 }
diff --git a/src/HDFPersist/HDFdatasetGetOrder.c b/src/HDFPersist/HDFdatasetGetOrder.c
new file mode 100644 (file)
index 0000000..38b0658
--- /dev/null
@@ -0,0 +1,46 @@
+/*----------------------------------------------------------------------------
+SALOME HDFPersist : implementation of HDF persitent ( save/ restore )
+
+ Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+ CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+
+ This library is free software; you can redistribute it and/or 
+ modify it under the terms of the GNU Lesser General Public 
+ License as published by the Free Software Foundation; either 
+ version 2.1 of the License. 
+
+ This library is distributed in the hope that it will be useful, 
+ but WITHOUT ANY WARRANTY; without even the implied warranty of 
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+ Lesser General Public License for more details. 
+
+ You should have received a copy of the GNU Lesser General Public 
+ License along with this library; if not, write to the Free Software 
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+
+ See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+
+
+
+  File   : HDFdatasetGetOrder.c
+Module : SALOME
+----------------------------------------------------------------------------*/
+
+#include "hdfi.h"
+#include <hdf5.h>
+
+hdf_byte_order
+HDFdatasetGetOrder(hdf_idt dataset_id)
+{
+  hdf_idt type_id;
+  hdf_byte_order order;
+
+  if ((type_id = H5Dget_type(dataset_id)) < 0)
+    return -1;
+
+  order = H5Tget_order(type_id);
+
+  H5Tclose(type_id);
+
+  return order;
+}
index e1810953d99bf6baf87b964b20852e73525f1911..dec0560dfc542238b7a698bca173fa967a366b18 100644 (file)
@@ -67,7 +67,7 @@ hdf_err HDFdatasetClose(hdf_idt id);
 
 extern
 hdf_idt HDFdatasetCreate(hdf_idt pid,char *name,hdf_type type,
-                        hdf_size *dimd, int ndim);
+                        hdf_size *dimd, int ndim, hdf_byte_order order);
 
 extern
 hdf_err HDFdatasetWrite(hdf_idt id, void *val);
@@ -87,6 +87,9 @@ hdf_err HDFdatasetGetDim(hdf_idt id,hdf_size dim[]);
 extern
 int HDFdatasetGetSize(hdf_idt id);
 
+extern 
+hdf_byte_order HDFdatasetGetOrder(hdf_idt id);
+
 /* Attribute interface */
 extern
 hdf_idt HDFattrOpen(hdf_idt pid,char *name);