diff options
-rwxr-xr-x | src/H5lite.c | 541 | ||||
-rwxr-xr-x | src/H5lite.h | 62 |
2 files changed, 603 insertions, 0 deletions
diff --git a/src/H5lite.c b/src/H5lite.c new file mode 100755 index 0000000..70df470 --- /dev/null +++ b/src/H5lite.c @@ -0,0 +1,541 @@ +/**************************************************************************** + * NCSA HDF * + * Scientific Data Technologies * + * National Center for Supercomputing Applications * + * University of Illinois at Urbana-Champaign * + * 605 E. Springfield, Champaign IL 61820 * + * * + * For conditions of distribution and use, see the accompanying * + * hdf/COPYING file. * + * * + ****************************************************************************/ + + + +#include "H5Lite.h" + +/*local operator functions */ + +static herr_t count_groups( hid_t loc_id, const char *name, void *op_data); +static herr_t get_name_group( hid_t loc_id, const char *name, void *op_data); + + + +/*------------------------------------------------------------------------- + * Function: H5Lmake_dataset + * + * Purpose: + * + * Return: Success: 0, Failure: -1 + * + * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu + * + * Date: March 19, 2001 + * + * List of arguments: + * + * hid_t loc_id + * IN: Identifier of the file or group to create the dataset within. + * + * const char *dset_name + * IN: The name of the dataset to create. + * + * int rank + * IN: Number of dimensions of dataspace. + * + * const hsize_t * dims + * IN: An array of the size of each dimension. + * + * hid_t file_type_id + * IN: Identifier of the datatype to use when creating the dataset. + * + * hid_t mem_space_id + * IN: Identifier of the memory dataspace. + * + * const void * buffer + * IN: Buffer with data to be written to the datsset. + * + * Comments: + * + * The specified datatype and dataspace are the datatype and dataspace of the dataset + * as it will exist in the file, which may be different than in application memory + * + * Modifications: + * + * + *------------------------------------------------------------------------- + */ + +herr_t H5Lmake_dataset( hid_t loc_id, + const char *dset_name, + int rank, + const hsize_t *dims, + hid_t file_type_id, + hid_t mem_type_id, + const void *buffer ) +{ + + hid_t dataset_id, space_id; /* identifiers */ + herr_t status; + + /* Create the data space for the dataset. */ + space_id = H5Screate_simple( rank, dims, NULL ); + + /* Create the dataset. */ + dataset_id = H5Dcreate( loc_id, dset_name, file_type_id, space_id, H5P_DEFAULT ); + + /* Write the dataset only if there is data to write */ + + if ( buffer ) + + status = H5Dwrite( dataset_id, mem_type_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buffer ); + + /* End access to the dataset and release resources used by it. */ + status = H5Dclose( dataset_id ); + + /* Terminate access to the data space. */ + status = H5Sclose( space_id ); + + return status; +} + + + +/*------------------------------------------------------------------------- + * Function: H5Lattach_attribute + * + * Purpose: This function attaches a string attribute to an existing object + * + * Return: Success: 0, Failure: -1 + * + * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu + * + * Date: April 18, 2001 + * + * Comments: + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + + +herr_t H5Lattach_attribute( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const char *attr_data ) +{ + + /* identifiers */ + hid_t attr_type; + hid_t attr_size; + hid_t attr_space_id; + hid_t attr_id; + hid_t obj_id; + herr_t status; + H5I_type_t type; + + type = H5Iget_type( loc_id ); + + switch ( type ) + { + case H5I_DATASET: + case H5I_FILE: + + /* Open the dataset. */ + obj_id = H5Dopen( loc_id, obj_name ); + break; + + case H5I_GROUP: + + /* Open the group. */ + obj_id = H5Gopen( loc_id, obj_name ); + break; + + default: + return FAIL; + + } + + /* Create the attribute */ + + attr_type = H5Tcopy( H5T_C_S1 ); + + attr_size = strlen( attr_data ); + + status = H5Tset_size( attr_type, (size_t)attr_size); + + status = H5Tset_strpad( attr_type, H5T_STR_SPACEPAD ); + + attr_space_id = H5Screate( H5S_SCALAR ); + + attr_id = H5Acreate( obj_id, attr_name, attr_type, attr_space_id, H5P_DEFAULT ); + + status = H5Awrite( attr_id, attr_type, attr_data ); + + status = H5Sclose( attr_space_id ); + + status = H5Aclose( attr_id ); + + + switch ( type ) + { + case H5I_DATASET: + case H5I_FILE: + + /* Close the dataset. */ + status = H5Dclose( obj_id ); + break; + + case H5I_GROUP: + + /* Close the group. */ + status = H5Gclose( obj_id ); + break; + + } + + return status; +} + + + +/*------------------------------------------------------------------------- + * Function: H5Lattach_attribute_numerical + * + * Purpose: This function attaches a numerical 1D attribute to an existing object (dataset or group) + * + * Return: Success: 0, Failure: -1 + * + * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu + * + * Date: March 19, 2001 + * + * Comments: + * + * The attribute is one dimensional + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + + +herr_t H5Lattach_attribute_numerical( hid_t loc_id, + const char *obj_name, + const char *attr_name, + hsize_t size, + hid_t type_id, + void *buffer ) +{ + + hid_t obj_id, space_id, attr_id; + herr_t status; + H5I_type_t type; + + type = H5Iget_type( loc_id ); + + switch ( type ) + { + case H5I_DATASET: + case H5I_FILE: + + /* Open the dataset. */ + obj_id = H5Dopen( loc_id, obj_name ); + break; + + case H5I_GROUP: + + /* Open the group. */ + obj_id = H5Gopen( loc_id, obj_name ); + break; + + default: + return -1; + + } + + /* Create the data space for the attribute. */ + space_id = H5Screate_simple( 1, &size, NULL ); + + /* Create the attribute. */ + attr_id = H5Acreate( obj_id, attr_name, type_id, space_id, H5P_DEFAULT ); + + /* Write the attribute data. */ + status = H5Awrite( attr_id, type_id, buffer ); + + /* Close the attribute. */ + status = H5Aclose( attr_id ); + + /* Close the dataspace. */ + status = H5Sclose( space_id ); + + switch ( type ) + { + case H5I_DATASET: + case H5I_FILE: + + /* Close the dataset. */ + status = H5Dclose( obj_id ); + break; + + case H5I_GROUP: + + /* Close the group. */ + status = H5Gclose( obj_id ); + break; + + } + + return status; +} + + + + +/*------------------------------------------------------------------------- + * Function: H5Lmake_groups + * + * Purpose: + * + * Return: Success: 0, Failure: -1 + * + * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu + * + * Date: May 24, 2001 + * + * Comments: + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + + +herr_t H5Lmake_groups( hid_t loc_id, + int ngroups, + const char *names[] ) +{ + + herr_t status; + hid_t group_id; + int i; + + for ( i = 0; i < ngroups; i++) + { + + /* Create the group */ + group_id = H5Gcreate( loc_id, names[i], 0); + + /* Close the group. */ + status = H5Gclose( group_id ); + + } + + return status; +} + + + +/*------------------------------------------------------------------------- + * Function: H5Lget_groups + * + * Purpose: + * + * Return: Success: 0, Failure: -1 + * + * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu + * + * Date: May 24, 2001 + * + * Comments: + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +herr_t H5Lget_groups( hid_t loc_id, + const char *group_name ) +{ + + herr_t status; + char name[255]; + int i, j; + int ngroups; + + ngroups = 0; + + /* Get the number of groups */ + status = H5Giterate( loc_id, group_name, 0, count_groups, (void *)&ngroups ); + + for ( i = 0; i < ngroups; i++) + { + + j = i; + + /* Get name */ + status = H5Giterate( loc_id, group_name, &j, get_name_group, (void *)name ); + + printf("Name : %s\n", name); + + } + + return status; +} + + +/*------------------------------------------------------------------------- + * Function: count_groups + * + * Purpose: operator function used by H5Lget_groups + * + * Return: + * + * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu + * + * Date: May 28, 2001 + * + * Comments: + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static herr_t count_groups( hid_t loc_id, const char *name, void *op_data) +{ + + /* Define a default zero value for return. This will cause the iterator to continue */ + + int ret = 0; + + /* Get information about object */ + + H5G_stat_t statbuf; + herr_t status; + + status = H5Gget_objinfo( loc_id, name, 0, &statbuf ); + if ( status < 0) + { + return 1; /* iterator will stop */ + } + + if ( statbuf.type == H5G_GROUP ) + { + (*(int *)op_data)++; + } + + return ret; + +} + +/*------------------------------------------------------------------------- + * Function: get_name_group + * + * Purpose: operator function used by H5Lget_groups + * + * Return: + * + * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu + * + * Date: May 28, 2001 + * + * Comments: + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static herr_t get_name_group( hid_t loc_id, const char *name, void *op_data) +{ + + /* Define a default 1 value for return. This will cause the iterator to break */ + + int ret = 1; + + /* Get information about object */ + + H5G_stat_t statbuf; + herr_t status; + + status = H5Gget_objinfo( loc_id, name, 0, &statbuf ); + + if ( statbuf.type == H5G_GROUP ) + { + strcpy( (char *)op_data, name ); + } + + return ret; +} + + + + + +/*------------------------------------------------------------------------- + * Function: H5L_get_attributes + * + * Purpose: + * + * Return: + * + * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu + * + * Date: May 28, 2001 + * + * Comments: + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +herr_t H5Lget_attributes( hid_t loc_id ) +{ + + hid_t attr_id; + hid_t type_id; + H5T_class_t class_type; + char name[255]; + int status; + int n, i; + + n = H5Aget_num_attrs( loc_id ); + + for ( i = 0; i < n; i++) + { + + /*open id */ + attr_id = H5Aopen_idx( loc_id, i ); + + /*get name */ + H5Aget_name( attr_id, 255, name ); + + /*open type id */ + type_id = H5Aget_type( attr_id ); + + /*get class */ + class_type = H5Tget_class( type_id ); + + printf("%s\n", name ); + + + /*close type id */ + status = H5Tclose( type_id ); + + /*close attr id */ + status = H5Aclose( attr_id ); + + } + + + return n; + +} + + + + + diff --git a/src/H5lite.h b/src/H5lite.h new file mode 100755 index 0000000..84d3f02 --- /dev/null +++ b/src/H5lite.h @@ -0,0 +1,62 @@ + +/**************************************************************************** + * NCSA HDF * + * Scientific Data Technologies * + * National Center for Supercomputing Applications * + * University of Illinois at Urbana-Champaign * + * 605 E. Springfield, Champaign IL 61820 * + * * + * For conditions of distribution and use, see the accompanying * + * hdf/COPYING file. * + * * + ****************************************************************************/ + + +#ifndef _H5lite_H +#define _H5lite_H + +#include "H5private.h" +#include "H5Ipublic.h" +#include "H5Fpublic.h" +#include "H5Tpublic.h" +#include "H5Ppublic.h" +#include "H5Spublic.h" +#include "H5Gpublic.h" +#include "H5Apublic.h" + + +herr_t H5Lmake_dataset( hid_t loc_id, + const char *dset_name, + int rank, + const hsize_t *dims, + hid_t file_type_id, + hid_t mem_type_id, + const void *buffer ); + +herr_t H5Lattach_attribute( hid_t loc_id, + const char *dset_name, + const char *attr_name, + const char *attr_data ); + + +herr_t H5Lattach_attribute_numerical( hid_t loc_id, + const char *dset_name, + const char *attr_name, + hsize_t dim, + hid_t file_type_id, + void *buffer ); + +herr_t H5Lmake_groups( hid_t loc_id, + int ngroups, + const char *names[] ); + +herr_t H5Lget_groups( hid_t loc_id, + const char *group_name ); + +herr_t H5Lget_attributes( hid_t loc_id ); + + + + + +#endif |