164 lines
3.2 KiB
C
164 lines
3.2 KiB
C
#include <string.h>
|
|
#include <hdf5.h>
|
|
#include "h5_core.h"
|
|
#include "h5_core_private.h"
|
|
|
|
/* OBSOLETE!!! */
|
|
|
|
struct _iter_op_data {
|
|
int stop_idx;
|
|
int count;
|
|
int type;
|
|
char *name;
|
|
size_t len;
|
|
char *pattern;
|
|
};
|
|
|
|
/*!
|
|
\ingroup h5part_kernel
|
|
|
|
Iterator for \c H5Giterate().
|
|
*/
|
|
static herr_t
|
|
_iteration_operator (
|
|
hid_t group_id, /*!< [in] group id */
|
|
const char *member_name,/*!< [in] group name */
|
|
void *operator_data /*!< [in,out] data passed to the iterator */
|
|
) {
|
|
|
|
struct _iter_op_data *data = (struct _iter_op_data*)operator_data;
|
|
herr_t herr;
|
|
H5G_stat_t objinfo;
|
|
|
|
if ( data->type != H5G_UNKNOWN ) {
|
|
herr = H5Gget_objinfo ( group_id, member_name, 1, &objinfo );
|
|
if ( herr < 0 )
|
|
return -1;
|
|
|
|
if ( objinfo.type != data->type )
|
|
return 0;/* don't count, continue iteration */
|
|
}
|
|
|
|
if ( data->name && (data->stop_idx == data->count) ) {
|
|
memset ( data->name, 0, data->len );
|
|
strncpy ( data->name, member_name, data->len-1 );
|
|
|
|
return 1; /* stop iteration */
|
|
}
|
|
/*
|
|
count only if pattern is NULL or member name matches
|
|
*/
|
|
if ( !data->pattern ||
|
|
(strncmp (member_name, data->pattern, strlen(data->pattern)) == 0)
|
|
) {
|
|
data->count++;
|
|
}
|
|
return 0; /* continue iteration */
|
|
}
|
|
|
|
/*!
|
|
\ingroup h5part_kernel
|
|
|
|
Get number of objects of type \c type matching ^pattern.
|
|
|
|
If pattern is NULL, count all objects of given type.
|
|
*/
|
|
h5_int64_t
|
|
hdf5_get_num_objects_matching_pattern (
|
|
hid_t group_id,
|
|
const char *group_name,
|
|
const hid_t type,
|
|
char * const pattern
|
|
) {
|
|
|
|
int idx = 0;
|
|
struct _iter_op_data data;
|
|
|
|
memset ( &data, 0, sizeof ( data ) );
|
|
data.type = type;
|
|
data.pattern = pattern;
|
|
|
|
/*
|
|
H5Giterate return a negative value, if no matching object
|
|
was found! How can we handle an error?
|
|
Anyway: H5Giterate is depricated in hdf5 >= 1.8!
|
|
*/
|
|
H5Giterate ( group_id, group_name, &idx,
|
|
_iteration_operator, &data );
|
|
|
|
return data.count;
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
\ingroup h5part_kernel
|
|
|
|
Get number of object of type \c type in HDF5 group \c group_id.
|
|
*/
|
|
h5_int64_t
|
|
hdf5_get_num_objects (
|
|
hid_t group_id,
|
|
const char *group_name,
|
|
const hid_t type
|
|
) {
|
|
|
|
return hdf5_get_num_objects_matching_pattern (
|
|
group_id,
|
|
group_name,
|
|
type,
|
|
NULL );
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
/*!
|
|
\ingroup h5part_kernel
|
|
|
|
Iterator for \c H5Giterate().
|
|
@@@ to be fixed: idx not found error handling
|
|
*/
|
|
h5_int64_t
|
|
hdf5_get_object_name (
|
|
hid_t group_id,
|
|
const char *group_name,
|
|
const hid_t type,
|
|
const h5_int64_t idx,
|
|
char *obj_name,
|
|
const h5_int64_t len_obj_name
|
|
) {
|
|
|
|
herr_t herr;
|
|
struct _iter_op_data data;
|
|
int iterator_idx = 0;
|
|
|
|
memset ( &data, 0, sizeof ( data ) );
|
|
data.stop_idx = (hid_t)idx;
|
|
data.type = type;
|
|
data.name = obj_name;
|
|
data.len = (size_t)len_obj_name;
|
|
|
|
herr = H5Giterate ( group_id, group_name, &iterator_idx,
|
|
_iteration_operator,
|
|
&data );
|
|
if ( herr < 0 ) return (h5_int64_t)herr;
|
|
|
|
return H5_SUCCESS;
|
|
}
|
|
|