summaryrefslogtreecommitdiff
path: root/openEMS/matlab/h5readatt_octave.cc
diff options
context:
space:
mode:
authorRuben Undheim <ruben.undheim@gmail.com>2016-07-05 18:02:38 +0200
committerRuben Undheim <ruben.undheim@gmail.com>2016-07-05 18:02:38 +0200
commitef962f6008f25ab7cbd4ca21bcc72b97a1e2d76f (patch)
tree8149bee93d1a3f91d4503bfb3853adac4af0a85e /openEMS/matlab/h5readatt_octave.cc
Imported Upstream version 0.0.34
Diffstat (limited to 'openEMS/matlab/h5readatt_octave.cc')
-rwxr-xr-xopenEMS/matlab/h5readatt_octave.cc135
1 files changed, 135 insertions, 0 deletions
diff --git a/openEMS/matlab/h5readatt_octave.cc b/openEMS/matlab/h5readatt_octave.cc
new file mode 100755
index 0000000..8bd58d0
--- /dev/null
+++ b/openEMS/matlab/h5readatt_octave.cc
@@ -0,0 +1,135 @@
+#include <octave/oct.h>
+#include <octave/ov-struct.h>
+#include "hdf5.h"
+
+// this special treatment is necessary because Win32-Octave ships with a very old hdf5 version (1.6.10)
+void CloseH5Object(hid_t obj)
+{
+#if ((H5_VERS_MAJOR == 1) && (H5_VERS_MINOR == 6))
+ // try group close, than Dataset close
+ if (H5Gclose(obj)<0)
+ H5Dclose(obj);
+#else
+ H5Oclose(obj);
+#endif
+}
+
+DEFUN_DLD (h5readatt_octave, args, nargout, "h5readatt_octave(<File_Name>,<DataSet_Name>,<Attribute_Name>)")
+{
+ octave_value retval;
+ int nargin = args.length();
+ if (nargin != 3)
+ {
+ print_usage();
+ return retval;
+ }
+ if ((args(0).is_string()==false) || (args(1).is_string()==false) || (args(2).is_string()==false))
+ {
+ print_usage();
+ return retval;
+ }
+
+ //suppress hdf5 error output
+ H5Eset_auto1(NULL, NULL);
+
+ hid_t file = H5Fopen( args(0).string_value().c_str(), H5F_ACC_RDONLY, H5P_DEFAULT );
+ if (file==-1)
+ {
+ error("h5readatt_octave: opening the given File failed");
+ return retval;
+ }
+
+#if ((H5_VERS_MAJOR == 1) && (H5_VERS_MINOR == 6))
+ // this special treatment is necessary because Win32-Octave ships with a very old hdf5 version (1.6.10)
+ hid_t obj = -1;
+ //try opening the group
+ obj = H5Gopen(file, args(1).string_value().c_str());
+ //try opening the dataset if group failed
+ if (obj==-1)
+ obj = H5Dopen(file, args(1).string_value().c_str());
+#else
+ hid_t obj = H5Oopen(file, args(1).string_value().c_str(), H5P_DEFAULT);
+#endif
+
+ if (obj==-1)
+ {
+ CloseH5Object(obj);
+ H5Fclose(file);
+ error("h5readatt_octave: opening the given Object failed");
+ return retval;
+ }
+
+ hid_t attr = H5Aopen_name(obj, args(2).string_value().c_str());
+ if (attr==-1)
+ {
+ CloseH5Object(obj);
+ H5Fclose(file);
+ error("h5readatt_octave: opening the given Attribute failed");
+ return retval;
+ }
+
+ hid_t type = H5Aget_type(attr);
+ if (type<0)
+ {
+ H5Aclose(attr);
+ CloseH5Object(obj);
+ H5Fclose(file);
+ error("h5readatt_octave: dataset type error");
+ return retval;
+ }
+
+ if (H5Tget_class(type)!=H5T_FLOAT)
+ {
+ H5Aclose(attr);
+ CloseH5Object(obj);
+ H5Fclose(file);
+ error("h5readatt_octave: attribute type not supported");
+ return retval;
+ }
+
+ size_t numVal = H5Aget_storage_size(attr)/H5Tget_size(type);
+ double value[numVal];
+ if (H5Tget_size(type)==sizeof(float))
+ {
+ float f_value[numVal];
+ if (H5Aread(attr, H5T_NATIVE_FLOAT, f_value)<0)
+ {
+ H5Aclose(attr);
+ CloseH5Object(obj);
+ H5Fclose(file);
+ error("h5readatt_octave: reading the given Attribute failed");
+ return retval;
+ }
+ for (size_t n=0;n<numVal;++n)
+ value[n] = f_value[n];
+ }
+ else if (H5Tget_size(type)==sizeof(double))
+ {
+ if (H5Aread(attr, H5T_NATIVE_DOUBLE, value)<0)
+ {
+ H5Aclose(attr);
+ CloseH5Object(obj);
+ H5Fclose(file);
+ error("h5readatt_octave: reading the given Attribute failed");
+ return retval;
+ }
+ }
+ else
+ {
+ H5Aclose(attr);
+ CloseH5Object(obj);
+ H5Fclose(file);
+ error("h5readatt_octave: reading the given Attribute failed: unknown type");
+ return retval;
+ }
+
+ H5Aclose(attr);
+ CloseH5Object(obj);
+ H5Fclose(file);
+ Matrix mat(numVal,1);
+ for (size_t n=0;n<numVal;++n)
+ mat(n)=value[n];
+ retval = octave_value(mat);
+ return retval;
+}
+