diff --git a/.gitattributes b/.gitattributes index 72bfdcd..6be740d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -461,6 +461,7 @@ src/include/h5core/h5_attribs.h -text src/include/h5core/h5_core.h -text src/include/h5core/h5_errno.h -text src/include/h5core/h5_errorhandling.h -text +src/include/h5core/h5_hdf5.h -text src/include/h5core/h5_maps.h -text src/include/h5core/h5_openclose.h -text src/include/h5core/h5_readwrite.h -text diff --git a/src/h5core/Makefile.am b/src/h5core/Makefile.am index c7e6137..1718976 100644 --- a/src/h5core/Makefile.am +++ b/src/h5core/Makefile.am @@ -10,6 +10,7 @@ EXTRA_HEADERS = \ ../include/h5core/h5_attribs.h \ ../include/h5core/h5_core.h \ ../include/h5core/h5_errorhandling.h \ + ../include/h5core/h5_hdf5.h \ ../include/h5core/h5_maps.h \ ../include/h5core/h5_openclose.h \ ../include/h5core/h5_readwrite.h \ @@ -24,7 +25,6 @@ EXTRA_HEADERS = \ ../include/h5core/h5t_storemesh.h \ ../include/h5core/h5t_tags.h \ ../include/h5core/h5u_readwrite.h \ - ../include/h5core/hdf5_misc.h \ h5_errorhandling_private.h \ h5_fcmp_private.h \ h5_hdf5_private.h \ @@ -98,8 +98,7 @@ libH5Core_a_SOURCES = \ h5t_trim_adjacencies.c \ h5t_trim_retrieve.c \ h5t_trim_store.c \ - h5u_readwrite.c \ - hdf5_misc.c + h5u_readwrite.c libH5Core_a_DEPENDENCIES = $(EXTRA_HEADERS) diff --git a/src/h5core/h5_hdf5.c b/src/h5core/h5_hdf5.c index 52ed1a3..7591bed 100644 --- a/src/h5core/h5_hdf5.c +++ b/src/h5core/h5_hdf5.c @@ -1,3 +1,4 @@ +#include #include #include "h5core/h5_core.h" @@ -7,36 +8,36 @@ hid_t h5priv_open_hdf5_group ( - h5_file_t * f, + h5_file_t* const f, const hid_t loc_id, - const char * const group_name + const char* const group_name ) { - hid_t group_id = H5Gopen ( loc_id, group_name, H5P_DEFAULT ); - if ( group_id < 0 ) + hid_t group_id = H5Gopen (loc_id, group_name, H5P_DEFAULT); + if (group_id < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot open group \"%s/%s\".", - h5_get_objname ( loc_id ), - group_name ); + h5_get_objname (loc_id), + group_name); return group_id; } hid_t h5priv_create_hdf5_group ( - h5_file_t * f, + h5_file_t* const f, const hid_t loc_id, - const char * const group_name + const char* const group_name ) { hid_t group_id = H5Gcreate ( - loc_id, group_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); - if ( group_id < 0 ) + loc_id, group_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + if (group_id < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot create group \"%s/%s\".", - h5_get_objname ( loc_id ), - group_name ); + h5_get_objname (loc_id), + group_name); return group_id; } @@ -49,13 +50,12 @@ h5priv_create_hdf5_group ( */ hid_t h5priv_open_group ( - h5_file_t * f, + h5_file_t* const f, const hid_t loc_id, - const char * const group_name + const char* const group_name ) { hid_t group_id; - herr_t herr = H5Gget_objinfo( - loc_id, group_name, 1, NULL ); + herr_t herr = H5Gget_objinfo (loc_id, group_name, 1, NULL); /* check access modes: @@ -66,30 +66,30 @@ h5priv_open_group ( H5_O_APPEND x x (append datasets to an existing group) */ - if ( herr >= 0 ) { + if (herr >= 0) { h5_info ( f, "Opening group %s/%s.", - h5_get_objname ( loc_id ), - group_name ); - group_id = H5Gopen ( loc_id, group_name, H5P_DEFAULT ); + h5_get_objname (loc_id), + group_name); + group_id = H5Gopen (loc_id, group_name, H5P_DEFAULT); } else { - CHECK_WRITABLE_MODE( f ); + CHECK_WRITABLE_MODE (f); h5_info ( f, "Creating group %s/%s.", - h5_get_objname ( loc_id ), - group_name ); - group_id = H5Gcreate ( loc_id, group_name, 0, - H5P_DEFAULT, H5P_DEFAULT ); + h5_get_objname (loc_id), + group_name); + group_id = H5Gcreate (loc_id, group_name, 0, + H5P_DEFAULT, H5P_DEFAULT); } - if ( group_id < 0 ) + if (group_id < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot open group \"%s/%s\".", - h5_get_objname ( loc_id ), - group_name ); + h5_get_objname (loc_id), + group_name); return group_id; } @@ -102,62 +102,73 @@ h5priv_open_group ( */ h5_err_t h5priv_close_hdf5_group ( - h5_file_t * const f, + h5_file_t* const f, const hid_t group_id ) { - if ( group_id <= 0 ) return H5_SUCCESS; - if ( H5Gclose ( group_id ) < 0 ) { + if (group_id <= 0) return H5_SUCCESS; + if (H5Gclose (group_id) < 0 ) { return h5_error ( f, H5_ERR_HDF5, "Cannot terminate access to group \"%s\".", - h5_get_objname( group_id ) ); + h5_get_objname (group_id)); } return H5_SUCCESS; } hsize_t h5priv_get_num_objs_in_hdf5_group ( - h5_file_t * const f, + h5_file_t* const f, const hid_t group_id ) { H5G_info_t group_info; - if ( H5Gget_info( group_id, &group_info ) < 0 ) { + if (H5Gget_info (group_id, &group_info) < 0) { return h5_error ( f, H5_ERR_HDF5, "Cannot get number of objects in group %s.", - h5_get_objname( group_id ) ); + h5_get_objname(group_id)); } return group_info.nlinks; } -h5_err_t -h5priv_get_objname_by_idx_in_hdf5_group ( - h5_file_t * const f, + +/* + Get name of object given by index \c idx in grouop \c loc_id. If name is \c NULL, + return size of name. +*/ +ssize_t +h5priv_get_hdf5_objname_by_idx ( + h5_file_t* const f, hid_t loc_id, hsize_t idx, - char **name ) { - size_t size; - - size = H5Gget_objname_by_idx ( loc_id, idx, NULL, 0 ) + 1; - if ( size < 0 ) goto error; - - *name = h5priv_calloc ( f, 1, size ); - if ( *name == NULL ) goto error; - - size = H5Gget_objname_by_idx ( loc_id, idx, *name, size ); - if ( size < 0 ) goto error; - - return H5_SUCCESS; - + char *name, + size_t size + ) { + ssize_t ssize; + if (name == NULL) { + ssize = H5Lget_name_by_idx (loc_id, ".", + H5_INDEX_NAME, H5_ITER_INC, + idx, + NULL, 0, + H5P_DEFAULT); + if (ssize < 0) goto error; + } else { + ssize = H5Lget_name_by_idx (loc_id, ".", + H5_INDEX_NAME, H5_ITER_INC, + idx, + name, size, + H5P_DEFAULT); + if (ssize < 0) goto error; + } + return size; error: return h5_error ( f, H5_ERR_HDF5, "Cannot get name of object %ld in group %s.", (long)idx, - h5_get_objname( loc_id ) ); + h5_get_objname (loc_id)); } /****** D a t a s e t ********************************************************/ @@ -170,21 +181,21 @@ error: */ hid_t h5priv_open_hdf5_dataset ( - h5_file_t * const f, + h5_file_t* const f, const hid_t loc_id, - const char * const dataset_name + const char* const dataset_name ) { hid_t dataset_id; dataset_id = H5Dopen ( loc_id, dataset_name, - H5P_DEFAULT ); - if ( dataset_id < 0 ) + H5P_DEFAULT); + if (dataset_id < 0) return h5_error ( f, H5_ERR_HDF5, - "Cannot open dataset \"%s\".", dataset_name ); + "Cannot open dataset \"%s\".", dataset_name); return dataset_id; } @@ -202,9 +213,9 @@ h5priv_open_hdf5_dataset ( */ hid_t h5priv_create_hdf5_dataset ( - h5_file_t * const f, + h5_file_t* const f, hid_t loc_id, - const char * dataset_name, + const char* dataset_name, const hid_t type_id, const hid_t dataspace_id, const hid_t create_proplist @@ -216,14 +227,14 @@ h5priv_create_hdf5_dataset ( dataspace_id, H5P_DEFAULT, create_proplist, - H5P_DEFAULT ); - if ( dataset_id < 0 ) + H5P_DEFAULT); + if (dataset_id < 0) return h5_error( f, H5_ERR_HDF5, "Cannot create dataset %s/%s", - h5_get_objname ( loc_id ), - dataset_name ); + h5_get_objname (loc_id), + dataset_name); return dataset_id; } @@ -235,17 +246,17 @@ h5priv_create_hdf5_dataset ( */ herr_t h5priv_close_hdf5_dataset ( - h5_file_t * const f, + h5_file_t* const f, const hid_t dset_id ) { - if ( dset_id == 0 || dset_id == -1 ) return H5_SUCCESS; - const char *dset_name = h5_get_objname( dset_id ); + if (dset_id == 0 || dset_id == -1) return H5_SUCCESS; - if ( H5Dclose ( dset_id ) < 0 ) { + if (H5Dclose (dset_id) < 0) { return h5_error( f, H5_ERR_HDF5, - "Close of dataset \"%s\" failed.", dset_name ); + "Close of dataset \"%s\" failed.", + h5_get_objname (dset_id) ); } return H5_SUCCESS; } @@ -259,16 +270,16 @@ h5priv_close_hdf5_dataset ( */ hid_t h5priv_get_hdf5_dataset_space ( - h5_file_t * const f, + h5_file_t* const f, const hid_t dataset_id ) { - hid_t dataspace_id = H5Dget_space ( dataset_id ); - if ( dataspace_id < 0 ) + hid_t dataspace_id = H5Dget_space (dataset_id); + if (dataspace_id < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot get dataspace for dataset \"%s\".", - h5_get_objname ( dataset_id ) ); + h5_get_objname (dataset_id) ); return dataspace_id; } @@ -287,13 +298,13 @@ h5priv_get_hdf5_dataset_space ( */ herr_t h5priv_write_hdf5_dataset ( - h5_file_t * const f, + h5_file_t* const f, const hid_t dataset_id, const hid_t type_id, const hid_t memspace_id, const hid_t diskspace_id, const hid_t xfer_prop, - const void * buf + const void* buf ) { herr_t herr = H5Dwrite ( dataset_id, @@ -301,13 +312,13 @@ h5priv_write_hdf5_dataset ( memspace_id, diskspace_id, xfer_prop, - buf ); - if ( herr < 0 ) + buf); + if (herr < 0) return h5_error ( f, H5_ERR_HDF5, "Write to dataset \"%s\" failed.", \ - h5_get_objname(dataset_id) ); + h5_get_objname (dataset_id)); return H5_SUCCESS; } @@ -317,13 +328,13 @@ h5priv_write_hdf5_dataset ( */ h5_err_t h5priv_read_hdf5_dataset ( - h5_file_t * const f, + h5_file_t* const f, const hid_t dataset_id, const hid_t type_id, const hid_t memspace_id, const hid_t diskspace_id, const hid_t xfer_prop, - void * const buf ) { + void* const buf ) { herr_t herr = H5Dread ( dataset_id, @@ -331,24 +342,24 @@ h5priv_read_hdf5_dataset ( memspace_id, diskspace_id, xfer_prop, - buf ); - if ( herr < 0 ) + buf); + if (herr < 0) return h5_error( f, H5_ERR_HDF5, - "Error reading dataset \"%s\".", \ - h5_get_objname ( dataset_id ) ); + "Error reading dataset \"%s\".", + h5_get_objname (dataset_id) ); return H5_SUCCESS; } hid_t h5priv_get_hdf5_dataset_type ( - h5_file_t * const f, + h5_file_t* const f, const hid_t dataset_id ) { - hid_t datatype_id = H5Dget_type ( dataset_id ); - if ( datatype_id < 0 ) + hid_t datatype_id = H5Dget_type (dataset_id); + if (datatype_id < 0) return h5_error( f, H5_ERR_HDF5, @@ -360,46 +371,44 @@ h5priv_get_hdf5_dataset_type ( herr_t h5priv_set_hdf5_dataset_extent ( - h5_file_t * const f, + h5_file_t* const f, hid_t dset_id, - const hsize_t *size + const hsize_t* size ) { - const char *dset_name = h5_get_objname( dset_id ); - - if ( H5Dset_extent( dset_id, size ) < 0 ) { + if (H5Dset_extent(dset_id, size) < 0) { return h5_error( f, H5_ERR_HDF5, "Changing size of dataset \"%s\" dimensions failed.", - dset_name ); + h5_get_objname (dset_id)); } return H5_SUCCESS; } hssize_t h5priv_get_npoints_of_hdf5_dataset ( - h5_file_t * const f, + h5_file_t* const f, hid_t dset_id ) { hid_t dspace_id; hsize_t size; - TRY ( dspace_id = h5priv_get_hdf5_dataset_space ( f, dset_id ) ); - TRY ( size = h5priv_get_npoints_of_hdf5_dataspace ( f, dspace_id ) ); - TRY ( h5priv_close_hdf5_dataspace( f, dspace_id ) ); + TRY( dspace_id = h5priv_get_hdf5_dataset_space (f, dset_id) ); + TRY( size = h5priv_get_npoints_of_hdf5_dataspace (f, dspace_id) ); + TRY( h5priv_close_hdf5_dataspace (f, dspace_id) ); return size; } hssize_t h5priv_get_npoints_of_hdf5_dataset_by_name ( - h5_file_t * const f, + h5_file_t* const f, hid_t loc_id, - char * name + char* name ) { hid_t dset_id; hsize_t size; - TRY ( dset_id = h5priv_open_hdf5_dataset ( f, loc_id, name ) ); - TRY ( size = h5priv_get_npoints_of_hdf5_dataset ( f, dset_id ) ); - TRY ( h5priv_close_hdf5_dataset ( f, dset_id ) ); + TRY( dset_id = h5priv_open_hdf5_dataset (f, loc_id, name) ); + TRY( size = h5priv_get_npoints_of_hdf5_dataset (f, dset_id) ); + TRY( h5priv_close_hdf5_dataset (f, dset_id) ); return size; } @@ -416,30 +425,30 @@ h5priv_get_npoints_of_hdf5_dataset_by_name ( */ hid_t h5priv_create_hdf5_dataspace ( - h5_file_t * const f, + h5_file_t* const f, const int rank, - const hsize_t * dims, - const hsize_t * maxdims + const hsize_t* dims, + const hsize_t* maxdims ) { - hid_t dataspace_id = H5Screate_simple ( rank, dims, maxdims ); - if ( dataspace_id < 0 ) + hid_t dataspace_id = H5Screate_simple (rank, dims, maxdims); + if (dataspace_id < 0) h5_error ( f, H5_ERR_HDF5, "Cannot create dataspace with rank %d.", - rank ); + rank); return dataspace_id; } herr_t h5priv_select_hyperslab_of_hdf5_dataspace ( - h5_file_t * const f, + h5_file_t* const f, hid_t space_id, H5S_seloper_t op, - const hsize_t *start, - const hsize_t *stride, - const hsize_t *count, - const hsize_t *block + const hsize_t* start, + const hsize_t* stride, + const hsize_t* count, + const hsize_t* block ) { herr_t herr = H5Sselect_hyperslab ( space_id, @@ -447,57 +456,57 @@ h5priv_select_hyperslab_of_hdf5_dataspace ( start, stride, count, - block ); - if ( herr < 0 ) + block); + if (herr < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot set select hyperslap region or add the " - "specified region" ); + "specified region"); return H5_SUCCESS; } hssize_t h5priv_get_selected_npoints_of_hdf5_dataspace ( - h5_file_t * const f, + h5_file_t* const f, hid_t space_id ) { - hssize_t size = H5Sget_select_npoints ( space_id ); - if ( size < 0 ) + hssize_t size = H5Sget_select_npoints (space_id); + if (size < 0) h5_error( f, H5_ERR_HDF5, - "Cannot determine number of selected elements in dataspace." ); + "Cannot determine number of selected elements in dataspace."); return size; } hssize_t h5priv_get_npoints_of_hdf5_dataspace ( - h5_file_t * const f, + h5_file_t* const f, hid_t space_id ) { - hssize_t size = H5Sget_simple_extent_npoints ( space_id ); - if ( size < 0 ) + hssize_t size = H5Sget_simple_extent_npoints (space_id); + if (size < 0) h5_error( f, H5_ERR_HDF5, - "Cannot determine number of elements in dataspace." ); + "Cannot determine number of elements in dataspace."); return size; } int h5priv_get_dims_of_hdf5_dataspace ( - h5_file_t * const f, + h5_file_t* const f, hid_t space_id, - hsize_t *dims, - hsize_t *maxdims + hsize_t* dims, + hsize_t* maxdims ) { - int rank = H5Sget_simple_extent_dims ( space_id, dims, maxdims ); - if ( rank < 0 ) + int rank = H5Sget_simple_extent_dims (space_id, dims, maxdims); + if (rank < 0) return h5_error ( f, H5_ERR_HDF5, - "Cannot determine rank of dataspace." ); + "Cannot determine rank of dataspace."); return rank; } @@ -510,19 +519,19 @@ h5priv_get_dims_of_hdf5_dataspace ( */ herr_t h5priv_close_hdf5_dataspace ( - h5_file_t * const f, + h5_file_t* const f, const hid_t dataspace_id ) { - if ( dataspace_id == 0 || dataspace_id == -1 || dataspace_id == H5S_ALL ) + if (dataspace_id == 0 || dataspace_id == -1 || dataspace_id == H5S_ALL) return H5_SUCCESS; - herr_t herr = H5Sclose ( dataspace_id ); - if ( herr < 0 ) + herr_t herr = H5Sclose (dataspace_id); + if (herr < 0) return h5_error( f, H5_ERR_HDF5, "Cannot terminate access to dataspace \"%s\".", - h5_get_objname( dataspace_id ) ); + h5_get_objname (dataspace_id)); return H5_SUCCESS; } @@ -531,23 +540,23 @@ h5priv_close_hdf5_dataspace ( static const char* get_base_type_name ( - h5_file_t * const f, + h5_file_t* const f, hid_t base_type_id ) { - if ( base_type_id == H5_INT32_T ) return "H5_INT32_T"; - if ( base_type_id == H5_INT64_T ) return "H5_INT64_T"; - if ( base_type_id == H5_FLOAT32_T ) return "H5_FLOAT32_T"; - if ( base_type_id == H5_FLOAT64_T ) return "H5_FLOAT64_T"; + if (base_type_id == H5_INT32_T) return "H5_INT32_T"; + if (base_type_id == H5_INT64_T) return "H5_INT64_T"; + if (base_type_id == H5_FLOAT32_T) return "H5_FLOAT32_T"; + if (base_type_id == H5_FLOAT64_T) return "H5_FLOAT64_T"; return "[unknown]"; } static const char* get_class_type_name ( - h5_file_t * const f, + h5_file_t* const f, hid_t base_type_id ) { - if ( base_type_id == H5_COMPOUND_T ) return "H5_COMPOUND_T"; + if (base_type_id == H5_COMPOUND_T) return "H5_COMPOUND_T"; return "[unknown]"; } @@ -562,37 +571,37 @@ get_class_type_name ( */ hid_t h5priv_create_hdf5_array_type ( - h5_file_t * const f, + h5_file_t* const f, hid_t base_type_id, int rank, - const hsize_t *dims + const hsize_t* dims ) { - hid_t type_id = H5Tarray_create( base_type_id, rank, dims ); - if ( type_id < 0 ) { - return h5_error( + hid_t type_id = H5Tarray_create (base_type_id, rank, dims); + if (type_id < 0) { + return h5_error ( f, H5_ERR_HDF5, "Can't create array datatype object with base " "type %s and rank %d", - get_base_type_name ( f, base_type_id ), - rank ); + get_base_type_name (f, base_type_id), + rank); } return type_id; } hid_t h5priv_create_hdf5_type ( - h5_file_t * const f, + h5_file_t* const f, H5T_class_t class, const size_t size ) { - hid_t type_id = H5Tcreate( class, size ); - if ( type_id < 0 ) { - return h5_error( + hid_t type_id = H5Tcreate (class, size); + if (type_id < 0) { + return h5_error ( f, H5_ERR_HDF5, "Can't create datatype object of class %s.", - get_class_type_name ( f, class ) + get_class_type_name (f, class) ); } return type_id; @@ -600,33 +609,33 @@ h5priv_create_hdf5_type ( herr_t h5priv_insert_hdf5_type ( - h5_file_t * const f, + h5_file_t* const f, hid_t dtype_id, - const char * name, + const char* name, size_t offset, hid_t field_id ) { - herr_t herr = H5Tinsert ( dtype_id, name, offset, field_id ); - if ( herr < 0 ) + herr_t herr = H5Tinsert (dtype_id, name, offset, field_id); + if (herr < 0) return h5_error( f, H5_ERR_HDF5, "Can't insert field %s to compound datatype.", - name ); + name); return H5_SUCCESS; } herr_t h5priv_close_hdf5_type ( - h5_file_t * const f, + h5_file_t* const f, hid_t dtype_id ) { - herr_t herr = H5Tclose ( dtype_id ); - if ( herr < 0 ) - return h5_error( + herr_t herr = H5Tclose (dtype_id); + if (herr < 0) + return h5_error ( f, H5_ERR_HDF5, - "Cannot release datatype." ); + "Cannot release datatype."); return H5_SUCCESS; } @@ -634,30 +643,30 @@ h5priv_close_hdf5_type ( hid_t h5priv_create_hdf5_property ( - h5_file_t * const f, + h5_file_t* const f, hid_t cls_id ) { - hid_t prop_id = H5Pcreate( cls_id ); - if ( prop_id < 0 ) + hid_t prop_id = H5Pcreate (cls_id); + if (prop_id < 0) return h5_error ( f, H5_ERR_HDF5, - "Cannot create property list." ); + "Cannot create property list."); return prop_id; } herr_t h5priv_set_hdf5_chunk_property ( - h5_file_t * const f, + h5_file_t* const f, hid_t plist, int rank, - const hsize_t * dims + const hsize_t* dims ) { - if ( H5Pset_chunk ( plist, rank, dims ) < 0 ) + if (H5Pset_chunk (plist, rank, dims) < 0) return h5_error ( f, H5_ERR_HDF5, - "Cannot add chunking property to list." ); + "Cannot add chunking property to list."); return H5_SUCCESS; } @@ -665,14 +674,14 @@ h5priv_set_hdf5_chunk_property ( #ifdef PARALLEL_IO h5_err_t h5priv_set_hdf5_fapl_mpio_property ( - h5_file_t * const f, + h5_file_t* const f, hid_t fapl_id, MPI_Comm comm, MPI_Info info ) { - herr_t herr = H5Pset_fapl_mpio ( fapl_id, comm, info ); - if ( herr < 0 ) - h5_error( + herr_t herr = H5Pset_fapl_mpio (fapl_id, comm, info); + if (herr < 0) + h5_error ( f, H5_ERR_HDF5, "Cannot store IO communicator information to the " @@ -683,15 +692,15 @@ h5priv_set_hdf5_fapl_mpio_property ( h5_err_t h5priv_close_hdf5_property ( - h5_file_t * const f, + h5_file_t* const f, hid_t prop ) { - herr_t herr = H5Pclose ( prop ); - if ( herr < 0 ) + herr_t herr = H5Pclose (prop); + if (herr < 0) return h5_error ( f, H5_ERR_HDF5, - "Cannot close property." ); + "Cannot close property."); return H5_SUCCESS; } @@ -699,15 +708,15 @@ h5priv_close_hdf5_property ( herr_t h5priv_close_hdf5_file ( - h5_file_t * const f, + h5_file_t* const f, hid_t fileid ) { - herr_t herr = H5Fclose ( fileid ); - if ( herr < 0 ) + herr_t herr = H5Fclose (fileid); + if (herr < 0) return h5_error ( f, H5_ERR_HDF5, - "Cannot close file." ); + "Cannot close file."); return H5_SUCCESS; } @@ -715,83 +724,83 @@ h5priv_close_hdf5_file ( herr_t h5priv_set_hdf5_errorhandler ( - h5_file_t * const f, + h5_file_t* const f, hid_t estack_id, H5E_auto_t func, - void *client_data + void* client_data ) { - herr_t herr = H5Eset_auto ( estack_id, func, client_data ); - if ( herr < 0 ) - return h5_error( + herr_t herr = H5Eset_auto (estack_id, func, client_data); + if (herr < 0) + return h5_error ( f, H5_ERR_INIT, - "Cannot initialize H5." ); + "Cannot initialize H5."); return H5_SUCCESS; } /****** A t t r i b u t e ****************************************************/ hid_t h5priv_open_hdf5_attribute ( - h5_file_t * const f, + h5_file_t* const f, hid_t loc_id, - const char *attr_name + const char* attr_name ) { - hid_t attr_id = H5Aopen ( loc_id, attr_name, H5P_DEFAULT ); - if ( attr_id < 0 ) + hid_t attr_id = H5Aopen (loc_id, attr_name, H5P_DEFAULT); + if (attr_id < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot open attribute \"%s\" of \"%s\".", attr_name, - h5_get_objname( loc_id ) ); + h5_get_objname (loc_id)); return attr_id; } hid_t h5priv_open_hdf5_attribute_idx ( - h5_file_t * const f, + h5_file_t* const f, hid_t loc_id, unsigned int idx ) { - hid_t attr_id = H5Aopen_idx ( loc_id, idx ); - if ( attr_id < 0 ) + hid_t attr_id = H5Aopen_idx (loc_id, idx); + if (attr_id < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot open attribute \"%u\" of \"%s\".", idx, - h5_get_objname( loc_id ) ); + h5_get_objname (loc_id)); return attr_id; } hid_t h5priv_open_hdf5_attribute_by_name ( - h5_file_t * const f, + h5_file_t* const f, hid_t loc_id, - const char *obj_name, - const char *attr_name + const char* obj_name, + const char* attr_name ) { hid_t attr_id = H5Aopen_by_name ( loc_id, obj_name, attr_name, H5P_DEFAULT, - H5P_DEFAULT ); - if ( attr_id < 0 ) + H5P_DEFAULT); + if (attr_id < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot open attribute \"%s\" of \"%s\".", attr_name, - obj_name ); + obj_name); return attr_id; } hid_t h5priv_create_hdf5_attribute ( - h5_file_t * const f, + h5_file_t* const f, hid_t loc_id, - const char *attr_name, + const char* attr_name, hid_t type_id, hid_t space_id, hid_t acpl_id, @@ -803,31 +812,31 @@ h5priv_create_hdf5_attribute ( type_id, space_id, acpl_id, - aapl_id ); - if ( attr_id < 0 ) + aapl_id); + if (attr_id < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot create attribute \"%s\" for \"%s\".", attr_name, - h5_get_objname( loc_id ) ); + h5_get_objname (loc_id)); return attr_id; } herr_t h5priv_read_hdf5_attribute ( - h5_file_t * const f, + h5_file_t* const f, hid_t attr_id, hid_t mem_type_id, - void *buf + void* buf ) { - herr_t herr = H5Aread ( attr_id, mem_type_id, buf ); - if ( herr < 0 ) + herr_t herr = H5Aread (attr_id, mem_type_id, buf); + if (herr < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot read attribute \"%s\".", - h5_get_objname( attr_id ) ); + h5_get_objname (attr_id)); return H5_SUCCESS; } @@ -837,18 +846,18 @@ h5priv_read_hdf5_attribute ( */ herr_t h5priv_write_hdf5_attribute ( - h5_file_t * const f, + h5_file_t* const f, hid_t attr_id, hid_t mem_type_id, - const void *buf + const void* buf ) { - herr_t herr = H5Awrite ( attr_id, mem_type_id, buf ); - if ( herr < 0 ) + herr_t herr = H5Awrite (attr_id, mem_type_id, buf); + if (herr < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot write attribute \"%s\".", - h5_get_objname( attr_id ) ); + h5_get_objname (attr_id)); return H5_SUCCESS; } @@ -871,81 +880,293 @@ h5priv_get_hdf5_attribute_name ( hid_t h5priv_get_hdf5_attribute_type ( - h5_file_t * const f, + h5_file_t* const f, hid_t attr_id ) { - hid_t datatype_id = H5Aget_type ( attr_id ); - if ( datatype_id < 0 ) + hid_t datatype_id = H5Aget_type (attr_id); + if (datatype_id < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot get type of attribute \"%s\".", - h5_get_objname( attr_id ) ); + h5_get_objname (attr_id)); return datatype_id; } hid_t h5priv_get_hdf5_attribute_dataspace ( - h5_file_t * const f, + h5_file_t* const f, hid_t attr_id ) { - hid_t space_id = H5Aget_space ( attr_id ); - if ( space_id < 0 ) + hid_t space_id = H5Aget_space (attr_id); + if (space_id < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot get dataspace of attribute \"%s\".", - h5_get_objname( attr_id ) ); + h5_get_objname (attr_id)); return space_id; } int h5priv_get_num_hdf5_attribute ( - h5_file_t * const f, + h5_file_t* const f, hid_t loc_id ) { - int num = H5Aget_num_attrs ( loc_id ); - if ( num < 0 ) + int num = H5Aget_num_attrs (loc_id); + if (num < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot get number of attributes of \"%s\".", - h5_get_objname( loc_id ) ); + h5_get_objname (loc_id)); return num; } herr_t h5priv_close_hdf5_attribute ( - h5_file_t * const f, + h5_file_t* const f, hid_t attr_id ) { - herr_t herr = H5Aclose ( attr_id ); - if ( herr < 0 ) + herr_t herr = H5Aclose (attr_id); + if (herr < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot close attribute \"%s\".", - h5_get_objname( attr_id ) ); + h5_get_objname (attr_id)); return H5_SUCCESS; } - +/****** L i n k **************************************************************/ herr_t h5priv_delete_hdf5_link ( - h5_file_t * const f, + h5_file_t* const f, hid_t loc_id, - const char *name, + const char* name, hid_t lapl_id ) { - herr_t herr = H5Ldelete ( loc_id, name, lapl_id ); - if ( herr < 0 ) + herr_t herr = H5Ldelete (loc_id, name, lapl_id); + if (herr < 0) return h5_error ( f, H5_ERR_HDF5, "Cannot remove link %s/%s.", - h5_get_objname( loc_id ), name ); + h5_get_objname (loc_id), name); return H5_SUCCESS; } + +typedef struct op_data { + int queried_idx; + int cnt; + H5L_type_t type; + char *name; + size_t len; + char *prefix; +} op_data_t; + +static herr_t +iter_op_count ( + hid_t g_id, + const char* name, + const H5L_info_t* info, + void* _op_data + ) { + op_data_t* op_data = (op_data_t*)_op_data; + + if (info->type != op_data->type) { + return 0; + } + op_data->cnt++; + return 0; +} + +static herr_t +iter_op_idx ( + hid_t g_id, + const char* name, + const H5L_info_t* info, + void* _op_data + ) { + op_data_t* op_data = (op_data_t*)_op_data; + if (info->type != op_data->type) { + return 0; + } + op_data->cnt++; + /* stop iterating if index is equal cnt */ + if (op_data->queried_idx == op_data->cnt) { + memset (op_data->name, 0, op_data->len); + strncpy (op_data->name, name, op_data->len-1); + return 1; + } + return 0; +} + +static herr_t +iter_op_count_match ( + hid_t g_id, + const char* name, + const H5L_info_t* info, + void* _op_data + ) { + op_data_t* op_data = (op_data_t*)_op_data; + if (info->type != op_data->type) { + return 0; + } + /* count if prefix matches */ + if (strncmp (name, op_data->prefix, strlen(op_data->prefix)) == 0) { + op_data->cnt++; + } + + return 0; +} + +ssize_t +h5_get_num_hdf5_groups ( + h5_file_t* const f, + const hid_t loc_id + ) { + op_data_t op_data; + memset (&op_data, 0, sizeof (op_data)); + op_data.type = H5G_GROUP; + hsize_t start_idx = 0; + herr_t herr = H5Literate (loc_id, H5_INDEX_NAME, H5_ITER_INC, + &start_idx, + iter_op_count, &op_data); + if (herr < 0) { + return h5_error ( + f, + H5_ERR_HDF5, + "Cannot get number of groups in \"%s\".", + h5_get_objname (loc_id)); + } + return op_data.cnt; +} + +ssize_t +h5_get_num_hdf5_groups_matching_prefix ( + h5_file_t* const f, + const hid_t loc_id, + char* prefix + ) { + op_data_t op_data; + memset (&op_data, 0, sizeof (op_data)); + op_data.type = H5G_GROUP; + op_data.prefix = prefix; + hsize_t start_idx = 0; + herr_t herr = H5Literate (loc_id, H5_INDEX_NAME, H5_ITER_INC, + &start_idx, + iter_op_count_match, &op_data); + if (herr < 0) { + return h5_error ( + f, + H5_ERR_HDF5, + "Cannot get number of groups with prefix \"%s\" in \"%s\".", + prefix, h5_get_objname (loc_id)); + } + return op_data.cnt; +} + +h5_err_t +h5_get_hdf5_groupname_by_idx ( + h5_file_t* const f, + hid_t loc_id, + hsize_t idx, + char *name, + size_t size + ) { + op_data_t op_data; + memset (&op_data, 0, sizeof (op_data)); + op_data.type = H5G_GROUP; + op_data.cnt = -1; + op_data.queried_idx = idx; + hsize_t start_idx = 0; + herr_t herr = H5Literate (loc_id, H5_INDEX_NAME, H5_ITER_INC, + &start_idx, + iter_op_idx, &op_data); + if (herr < 0) { + return h5_error ( + f, + H5_ERR_HDF5, + "Cannot get name of group with index \"%lu\" in \"%s\".", + (long unsigned int)idx, h5_get_objname (loc_id)); + } + strncpy (name, op_data.name, size); + return H5_SUCCESS; +} + +ssize_t +h5_get_num_hdf5_datasets ( + h5_file_t* const f, + const hid_t loc_id + ) { + op_data_t op_data; + memset (&op_data, 0, sizeof (op_data)); + op_data.type = H5G_DATASET; + hsize_t start_idx = 0; + herr_t herr = H5Literate (loc_id, H5_INDEX_NAME, H5_ITER_INC, + &start_idx, + iter_op_count, &op_data); + if (herr < 0) { + return h5_error ( + f, + H5_ERR_HDF5, + "Cannot get number of datasets in \"%s\".", + h5_get_objname (loc_id)); + } + return op_data.cnt; +} + +/* + Get name of the \c idx th dataset in group \c loc_id. + */ +h5_err_t +h5_get_hdf5_datasetname_by_idx ( + h5_file_t* const f, + hid_t loc_id, + hsize_t idx, + char *name, + size_t size + ) { + return H5_SUCCESS; + op_data_t op_data; + memset (&op_data, 0, sizeof (op_data)); + op_data.type = H5G_DATASET; + op_data.cnt = -1; + op_data.queried_idx = idx; + hsize_t start_idx = 0; + herr_t herr = H5Literate (loc_id, H5_INDEX_NAME, H5_ITER_INC, + &start_idx, + iter_op_idx, &op_data); + if (herr < 0) { + return h5_error ( + f, + H5_ERR_HDF5, + "Cannot get name of dataset with index \"%lu\" in \"%s\".", + (long unsigned int)idx, h5_get_objname (loc_id)); + } + strncpy (name, op_data.name, size); + return H5_SUCCESS; +} + +/****** I d e n t i f i e r **************************************************/ + +const char * +h5_get_objname ( + hid_t id + ) { + static char objname[256]; + + memset ( objname, 0, sizeof(objname) ); + ssize_t size = H5Iget_name ( id, objname, sizeof(objname) ); + if ( size < 0 ) { + strcpy ( objname, "[error getting object name]" ); + } else if ( size == 0 ) { + strcpy ( objname, "[no name associated with identifier]" ); + } + + return objname; +} diff --git a/src/h5core/h5_hdf5_private.h b/src/h5core/h5_hdf5_private.h index ad8fb50..6574d15 100644 --- a/src/h5core/h5_hdf5_private.h +++ b/src/h5core/h5_hdf5_private.h @@ -1,5 +1,5 @@ -#ifndef __H5_HDF5_H -#define __H5_HDF5_H +#ifndef __H5_HDF5_PRIVATE_H +#define __H5_HDF5_PRIVATE_H /*** group ***/ hid_t @@ -35,12 +35,14 @@ h5priv_get_num_objs_in_hdf5_group ( const hid_t group_id ); -h5_err_t -h5priv_get_objname_by_idx_in_hdf5_group ( - h5_file_t * const f, +ssize_t +h5priv_get_hdf5_objname_by_idx ( + h5_file_t* const f, hid_t loc_id, hsize_t idx, - char **name ); + char *name, + size_t size + ); /*** dataset ***/ hid_t @@ -334,4 +336,5 @@ h5priv_delete_hdf5_link ( const char *name, hid_t lapl_id ); + #endif diff --git a/src/h5core/h5t_inquiry.c b/src/h5core/h5t_inquiry.c index d89256c..967fe81 100644 --- a/src/h5core/h5t_inquiry.c +++ b/src/h5core/h5t_inquiry.c @@ -11,21 +11,18 @@ */ h5_size_t h5t_get_num_meshes ( - h5_file_t * const f, + h5_file_t* const f, const enum h5_oid type_id ) { - struct h5t_fdata *t = f->t; + h5t_fdata_t* t = f->t; - if ( t->num_meshes >= 0 ) { + if (t->num_meshes >= 0) { return t->num_meshes; } - if ( t->topo_gid < 0 ) { - TRY( h5tpriv_open_topo_group ( f ) ); + if (t->topo_gid < 0) { + TRY( h5tpriv_open_topo_group (f) ); } - TRY( t->num_meshes = (h5_size_t)hdf5_get_num_objects ( - t->topo_gid, - h5tpriv_meshes_grpnames[type_id], - H5G_GROUP ) ); + TRY( t->num_meshes = h5_get_num_hdf5_groups (f, t->meshes_gid) ); return t->num_meshes; } @@ -39,12 +36,12 @@ h5t_get_num_meshes ( */ h5_size_t h5t_get_num_levels ( - h5_file_t * const f + h5_file_t* const f ) { - h5t_fdata_t *t = f->t; + h5t_fdata_t* t = f->t; - if ( t->cur_mesh < 0 ) { - return h5tpriv_error_undef_mesh ( f ); + if (t->cur_mesh < 0) { + return h5tpriv_error_undef_mesh (f); } return t->num_levels; } @@ -58,7 +55,7 @@ h5t_get_num_levels ( */ h5_id_t h5t_get_level ( - h5_file_t * f + h5_file_t* const f ) { return f->t->cur_level; } @@ -78,16 +75,16 @@ h5t_get_level ( */ h5_size_t h5t_get_num_elems ( - h5_file_t * const f, + h5_file_t* const f, const h5_id_t cnode ) { - h5t_fdata_t *t = f->t; + h5t_fdata_t* t = f->t; - if ( t->cur_mesh < 0 ) { - return h5tpriv_error_undef_mesh ( f ); + if (t->cur_mesh < 0) { + return h5tpriv_error_undef_mesh (f); } - if ( t->cur_level < 0 ) { - return h5tpriv_error_undef_level ( f ); + if (t->cur_level < 0) { + return h5tpriv_error_undef_level (f); } return t->num_elems_on_level[t->cur_level]; } @@ -107,16 +104,16 @@ h5t_get_num_elems ( */ h5_size_t h5t_get_num_vertices ( - h5_file_t * f, + h5_file_t* const f, h5_id_t cnode ) { - h5t_fdata_t *t = f->t; + h5t_fdata_t* t = f->t; - if ( t->cur_mesh < 0 ) { - return h5tpriv_error_undef_mesh ( f ); + if (t->cur_mesh < 0) { + return h5tpriv_error_undef_mesh (f); } - if ( t->cur_level < 0 ) { - return h5tpriv_error_undef_level ( f ); + if (t->cur_level < 0) { + return h5tpriv_error_undef_level (f); } return t->num_vertices[t->cur_level]; } diff --git a/src/h5core/h5u_readwrite.c b/src/h5core/h5u_readwrite.c index 983481b..f3aabf9 100644 --- a/src/h5core/h5u_readwrite.c +++ b/src/h5core/h5u_readwrite.c @@ -90,12 +90,11 @@ h5u_get_num_elems ( "%s#%0*lld", f->prefix_step_name, f->width_step_idx, (long long) f->step_idx ); - TRY( hdf5_get_object_name ( - f->file, - step_name, - H5G_DATASET, - 0, - dataset_name, sizeof (dataset_name) ) ); + TRY( h5_get_hdf5_datasetname_by_idx ( + f, + f->step_gid, + 0, + dataset_name, sizeof (dataset_name)) ); TRY( dataset_id = h5priv_open_hdf5_dataset ( f, f->step_gid, dataset_name ) ); TRY( space_id = _get_diskshape_for_reading ( f, dataset_id ) ); @@ -456,14 +455,11 @@ h5u_get_dataset_info ( h5_int64_t *nelem /*!< [out] Number of elements. */ ) { - h5_int64_t herr = hdf5_get_object_name ( - f->file, - f->step_name, - H5G_DATASET, - idx, - dataset_name, - len_dataset_name ); - if ( herr < 0 ) return herr; + TRY( h5_get_hdf5_datasetname_by_idx ( + f, + f->step_gid, + idx, + dataset_name, len_dataset_name) ); if ( nelem ) { *nelem = h5u_get_num_elems ( f ); diff --git a/src/include/h5core/h5_core.h b/src/include/h5core/h5_core.h index 075cb83..1c4dcb0 100644 --- a/src/include/h5core/h5_core.h +++ b/src/include/h5core/h5_core.h @@ -6,11 +6,11 @@ #include "h5_attribs.h" #include "h5_errorhandling.h" +#include "h5_hdf5.h" #include "h5_maps.h" #include "h5_openclose.h" #include "h5_readwrite.h" #include "h5u_readwrite.h" -#include "hdf5_misc.h" #include "h5t_core.h" diff --git a/src/include/h5core/h5_hdf5.h b/src/include/h5core/h5_hdf5.h new file mode 100644 index 0000000..3551179 --- /dev/null +++ b/src/include/h5core/h5_hdf5.h @@ -0,0 +1,46 @@ +#ifndef __H5_HDF5_H +#define __H5_HDF5_H + +ssize_t +h5_get_num_hdf5_groups ( + h5_file_t* const f, + const hid_t loc_id + ); + +ssize_t +h5_get_num_hdf5_groups_matching_prefix ( + h5_file_t* const f, + const hid_t loc_id, + char* prefix + ); + +h5_err_t +h5_get_hdf5_groupname_by_idx ( + h5_file_t* const f, + hid_t loc_id, + hsize_t idx, + char *name, + size_t size + ); + +ssize_t +h5_get_num_hdf5_datasets ( + h5_file_t* const f, + const hid_t loc_id + ); + +h5_err_t +h5_get_hdf5_datasetname_by_idx ( + h5_file_t* const f, + hid_t loc_id, + hsize_t idx, + char *name, + size_t size + ); + +const char * +h5_get_objname ( + hid_t id + ); + +#endif