#include #include #include "hdf5.h" DEFUN_DLD (h5readatt_octave, args, nargout, "h5readatt_octave(,,)") { 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_auto(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; } #ifdef WIN32 // 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) { H5Oclose(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) { H5Oclose(obj); H5Fclose(file); error("h5readatt_octave: opening the given Attribute failed"); return retval; } hid_t type = H5Aget_type(attr); if (type<0) { H5Aclose(attr); H5Oclose(obj); H5Fclose(file); error("h5readatt_octave: dataset type error"); return retval; } if (H5Tget_class(type)!=H5T_FLOAT) { H5Aclose(attr); H5Oclose(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); H5Oclose(obj); H5Fclose(file); error("h5readatt_octave: reading the given Attribute failed"); return retval; } for (size_t n=0;n