Mercurial > hg > octave-lyh
diff src/ls-hdf5.cc @ 11176:2271261f088a
Address precision issue in ranges saved to HDF5 files
author | David Bateman <dbateman@free.fr> |
---|---|
date | Tue, 02 Nov 2010 16:27:30 +0100 |
parents | 8b3cfc1288e2 |
children | 30bcd1aa9f09 |
line wrap: on
line diff
--- a/src/ls-hdf5.cc +++ b/src/ls-hdf5.cc @@ -156,7 +156,7 @@ if (attr_id >= 0) { // successful - retval = 1; + retval = true; H5Aclose (attr_id); } @@ -169,6 +169,55 @@ return retval; } +bool +hdf5_get_scalar_attr (hid_t loc_id, hid_t type_id, + const char *attr_name, void *buf) +{ + bool retval = false; + + // we have to pull some shenanigans here to make sure + // HDF5 doesn't print out all sorts of error messages if we + // call H5Aopen for a non-existing attribute + + H5E_auto_t err_func; + void *err_func_data; + + // turn off error reporting temporarily, but save the error + // reporting function: + +#if HAVE_HDF5_18 + H5Eget_auto (H5E_DEFAULT, &err_func, &err_func_data); + H5Eset_auto (H5E_DEFAULT, 0, 0); +#else + H5Eget_auto (&err_func, &err_func_data); + H5Eset_auto (0, 0); +#endif + + hid_t attr_id = H5Aopen_name (loc_id, attr_name); + + if (attr_id >= 0) + { + hid_t space_id = H5Aget_space (attr_id); + + hsize_t rank = H5Sget_simple_extent_ndims (space_id); + + if (rank == 0) + retval = H5Aread (attr_id, type_id, buf) >= 0; + H5Aclose (attr_id); + } + + // restore error reporting: +#if HAVE_HDF5_18 + H5Eset_auto (H5E_DEFAULT, err_func, err_func_data); +#else + H5Eset_auto (err_func, err_func_data); +#endif + return retval; +} + + + + // The following subroutines creates an HDF5 representations of the way // we will store Octave complex types (pairs of floating-point numbers). // NUM_TYPE is the HDF5 numeric type to use for storage (e.g. @@ -576,7 +625,7 @@ // Add an attribute named attr_name to loc_id (a simple scalar // attribute with value 1). Return value is >= 0 on success. -static herr_t +herr_t hdf5_add_attr (hid_t loc_id, const char *attr_name) { herr_t retval = 0; @@ -611,6 +660,46 @@ return retval; } +herr_t +hdf5_add_scalar_attr (hid_t loc_id, hid_t type_id, + const char *attr_name, void *buf) +{ + herr_t retval = 0; + + hid_t as_id = H5Screate (H5S_SCALAR); + + if (as_id >= 0) + { +#if HAVE_HDF5_18 + hid_t a_id = H5Acreate (loc_id, attr_name, H5T_NATIVE_UCHAR, + as_id, H5P_DEFAULT, H5P_DEFAULT); +#else + hid_t a_id = H5Acreate (loc_id, attr_name, + H5T_NATIVE_UCHAR, as_id, H5P_DEFAULT); +#endif + if (a_id >= 0) + { + retval = H5Awrite (a_id, type_id, buf); + + H5Aclose (a_id); + } + else + retval = a_id; + + H5Sclose (as_id); + } + else + retval = as_id; + + return retval; +} + + + + + + + // Save an empty matrix, if needed. Returns // > 0 Saved empty matrix // = 0 Not an empty matrix; did nothing