diff options
-rw-r--r-- | MANIFEST | 3 | ||||
-rw-r--r-- | src/H5D.c | 41 | ||||
-rw-r--r-- | src/H5T.c | 2877 | ||||
-rw-r--r-- | src/H5Tconv.c | 224 | ||||
-rw-r--r-- | src/H5Tpkg.h | 20 | ||||
-rw-r--r-- | src/H5Tprivate.h | 2 | ||||
-rw-r--r-- | src/H5Tpublic.h | 10 | ||||
-rw-r--r-- | test/Makefile.in | 10 |
8 files changed, 1684 insertions, 1503 deletions
@@ -104,6 +104,7 @@ ./src/Makefile.in ./src/Naming-Conventions ./test/Makefile.in +./test/cmpd_dset.c ./test/dsets.c ./test/dtypes.c ./test/hyperslab.c @@ -119,3 +120,5 @@ ./tgif/APIGrammar.obj ./tgif/FileGrammar.obj ./tgif/UserView.obj +./tgif/IOPipe.obj +./tgif/RobbPipe.obj
\ No newline at end of file @@ -832,10 +832,12 @@ H5D_read(H5D_t *dataset, const H5T_t *mem_type, const H5P_t *mem_space, { size_t nelmts ; /*number of elements */ uint8 *tconv_buf = NULL; /*data type conv buffer */ + uint8 *bkg_buf = NULL; /*background buffer */ H5T_conv_t tconv_func = NULL; /*conversion function */ hid_t src_id = -1, dst_id = -1;/*temporary type atoms */ const H5P_conv_t *sconv_func = NULL; /*space conversion funcs*/ H5P_number_t numbering; /*element numbering info*/ + void *cdata = NULL; /*type conversion data */ herr_t ret_value = FAIL; FUNC_ENTER(H5D_read, FAIL); @@ -863,7 +865,7 @@ H5D_read(H5D_t *dataset, const H5T_t *mem_type, const H5P_t *mem_space, * Locate the type conversion function and data space conversion * functions, and set up the element numbering information. */ - if (NULL == (tconv_func = H5T_find(dataset->type, mem_type))) { + if (NULL == (tconv_func = H5T_find(dataset->type, mem_type, &cdata))) { HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest data types"); } @@ -893,23 +895,31 @@ H5D_read(H5D_t *dataset, const H5T_t *mem_type, const H5P_t *mem_space, size_t src_size = nelmts * H5T_get_size(dataset->type); size_t dst_size = nelmts * H5T_get_size(mem_type); tconv_buf = H5MM_xmalloc(MAX(src_size, dst_size)); + bkg_buf = H5MM_xmalloc (dst_size); } #endif /* - * Gather the data from disk into the data type conversion buffer. + * Gather the data from disk into the data type conversion buffer. Also + * gather data from application to background buffer (this step is not + * needed for most conversions, but we leave that as an exercise for + * later ;-) */ if ((sconv_func->fgath)(dataset->ent.file, &(dataset->layout), H5T_get_size (dataset->type), file_space, &numbering, 0, nelmts, tconv_buf/*out*/)!=nelmts) { - HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "gather failed"); + HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file gather failed"); + } + if ((sconv_func->mgath)(buf, H5T_get_size (mem_type), mem_space, + &numbering, 0, nelmts, bkg_buf/*out*/)!=nelmts) { + HGOTO_ERROR (H5E_IO, H5E_READERROR, FAIL, "mem gather failed"); } /* * Perform data type conversion. */ - if ((tconv_func) (src_id, dst_id, nelmts, tconv_buf, NULL) < 0) { + if ((tconv_func) (src_id, dst_id, &cdata, nelmts, tconv_buf, bkg_buf)<0) { HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "data type conversion failed"); } @@ -919,7 +929,7 @@ H5D_read(H5D_t *dataset, const H5T_t *mem_type, const H5P_t *mem_space, */ if ((sconv_func->mscat)(tconv_buf, H5T_get_size (mem_type), mem_space, &numbering, 0, nelmts, buf/*out*/)<0) { - HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "scatter failed"); + HGOTO_ERROR (H5E_IO, H5E_READERROR, FAIL, "scatter failed"); } ret_value = SUCCEED; @@ -927,6 +937,7 @@ H5D_read(H5D_t *dataset, const H5T_t *mem_type, const H5P_t *mem_space, if (src_id >= 0) H5A_dec_ref(src_id); if (dst_id >= 0) H5A_dec_ref(dst_id); tconv_buf = H5MM_xfree(tconv_buf); + bkg_buf = H5MM_xfree (bkg_buf); FUNC_LEAVE(ret_value); } @@ -954,10 +965,12 @@ H5D_write(H5D_t *dataset, const H5T_t *mem_type, const H5P_t *mem_space, { size_t nelmts; uint8 *tconv_buf = NULL; /*data type conv buffer */ + uint8 *bkg_buf = NULL; /*background buffer */ H5T_conv_t tconv_func = NULL; /*conversion function */ hid_t src_id = -1, dst_id = -1;/*temporary type atoms */ const H5P_conv_t *sconv_func = NULL; /*space conversion funcs*/ H5P_number_t numbering; /*element numbering info*/ + void *cdata = NULL; /*type conversion data */ herr_t ret_value = FAIL; FUNC_ENTER(H5D_write, FAIL); @@ -985,7 +998,7 @@ H5D_write(H5D_t *dataset, const H5T_t *mem_type, const H5P_t *mem_space, * Locate the type conversion function and data space conversion * functions, and set up the element numbering information. */ - if (NULL == (tconv_func = H5T_find(mem_type, dataset->type))) { + if (NULL == (tconv_func = H5T_find(mem_type, dataset->type, &cdata))) { HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest data types"); } @@ -1015,22 +1028,31 @@ H5D_write(H5D_t *dataset, const H5T_t *mem_type, const H5P_t *mem_space, size_t src_size = nelmts * H5T_get_size(mem_type); size_t dst_size = nelmts * H5T_get_size(dataset->type); tconv_buf = H5MM_xmalloc(MAX(src_size, dst_size)); + bkg_buf = H5MM_xmalloc (dst_size); } #endif /* - * Gather data into the data type conversion buffer. + * Gather data from application buffer into the data type conversion + * buffer. Also gather data from the file into the background buffer + * (this step is not needed for most conversions, but we leave that as an + * exercise for later ;-) */ if ((sconv_func->mgath)(buf, H5T_get_size (mem_type), mem_space, &numbering, 0, nelmts, tconv_buf/*out*/)!=nelmts) { - HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "gather failed"); + HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "mem gather failed"); + } + if ((sconv_func->fgath)(dataset->ent.file, &(dataset->layout), + H5T_get_size (dataset->type), file_space, + &numbering, 0, nelmts, bkg_buf/*out*/)!=nelmts) { + HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "file gather failed"); } /* * Perform data type conversion. */ - if ((tconv_func) (src_id, dst_id, nelmts, tconv_buf, NULL) < 0) { + if ((tconv_func) (src_id, dst_id, &cdata, nelmts, tconv_buf, bkg_buf)<0) { HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "data type conversion failed"); } @@ -1049,5 +1071,6 @@ H5D_write(H5D_t *dataset, const H5T_t *mem_type, const H5P_t *mem_space, if (src_id >= 0) H5A_dec_ref(src_id); if (dst_id >= 0) H5A_dec_ref(dst_id); tconv_buf = H5MM_xfree(tconv_buf); + bkg_buf = H5MM_xfree (bkg_buf); FUNC_LEAVE(ret_value); } @@ -1,75 +1,75 @@ /**************************************************************************** -* NCSA HDF * -* Software Development Group * -* 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. * -* * +* NCSA HDF * +* Software Development Group * +* 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. * +* * ****************************************************************************/ #ifdef RCSID -static char RcsId[] = "@(#)$Revision$"; +static char RcsId[] = "@(#)$Revision$"; #endif -#define H5T_PACKAGE /*suppress error about including H5Tpkg */ +#define H5T_PACKAGE /*suppress error about including H5Tpkg */ -#include <H5private.h> /*generic functions */ -#include <H5Aprivate.h> /*atom functions */ -#include <H5Eprivate.h> /*error handling */ -#include <H5Mprivate.h> /*meta data */ -#include <H5MMprivate.h> /*memory management */ -#include <H5Pprivate.h> /*data space */ -#include <H5Tpkg.h> /*data-type functions */ +#include <H5private.h> /*generic functions */ +#include <H5Aprivate.h> /*atom functions */ +#include <H5Eprivate.h> /*error handling */ +#include <H5Mprivate.h> /*meta data */ +#include <H5MMprivate.h> /*memory management */ +#include <H5Pprivate.h> /*data space */ +#include <H5Tpkg.h> /*data-type functions */ -#define PABLO_MASK H5T_mask +#define PABLO_MASK H5T_mask -#define H5T_COMPND_INC 64 /*typical max numb of members per struct */ +#define H5T_COMPND_INC 64 /*typical max numb of members per struct */ /* Interface initialization */ -static intn interface_initialize_g = FALSE; +static intn interface_initialize_g = FALSE; #define INTERFACE_INIT H5T_init_interface -static void H5T_term_interface(void); +static void H5T_term_interface(void); /* Predefined types */ -hid_t H5T_NATIVE_CHAR_g = FAIL; -hid_t H5T_NATIVE_UCHAR_g = FAIL; -hid_t H5T_NATIVE_SHORT_g = FAIL; -hid_t H5T_NATIVE_USHORT_g = FAIL; -hid_t H5T_NATIVE_INT_g = FAIL; -hid_t H5T_NATIVE_UINT_g = FAIL; -hid_t H5T_NATIVE_LONG_g = FAIL; -hid_t H5T_NATIVE_LLONG_g = FAIL; -hid_t H5T_NATIVE_ULLONG_g = FAIL; -hid_t H5T_NATIVE_HYPER_g = FAIL; -hid_t H5T_NATIVE_UHYPER_g = FAIL; -hid_t H5T_NATIVE_INT8_g = FAIL; -hid_t H5T_NATIVE_UINT8_g = FAIL; -hid_t H5T_NATIVE_INT16_g = FAIL; -hid_t H5T_NATIVE_UINT16_g = FAIL; -hid_t H5T_NATIVE_INT32_g = FAIL; -hid_t H5T_NATIVE_UINT32_g = FAIL; -hid_t H5T_NATIVE_INT64_g = FAIL; -hid_t H5T_NATIVE_UINT64_g = FAIL; -hid_t H5T_NATIVE_ULONG_g = FAIL; -hid_t H5T_NATIVE_FLOAT_g = FAIL; -hid_t H5T_NATIVE_DOUBLE_g = FAIL; -hid_t H5T_NATIVE_TIME_g = FAIL; -hid_t H5T_NATIVE_STRING_g = FAIL; -hid_t H5T_NATIVE_BITFIELD_g = FAIL; -hid_t H5T_NATIVE_OPAQUE_g = FAIL; +hid_t H5T_NATIVE_CHAR_g = FAIL; +hid_t H5T_NATIVE_UCHAR_g = FAIL; +hid_t H5T_NATIVE_SHORT_g = FAIL; +hid_t H5T_NATIVE_USHORT_g = FAIL; +hid_t H5T_NATIVE_INT_g = FAIL; +hid_t H5T_NATIVE_UINT_g = FAIL; +hid_t H5T_NATIVE_LONG_g = FAIL; +hid_t H5T_NATIVE_LLONG_g = FAIL; +hid_t H5T_NATIVE_ULLONG_g = FAIL; +hid_t H5T_NATIVE_HYPER_g = FAIL; +hid_t H5T_NATIVE_UHYPER_g = FAIL; +hid_t H5T_NATIVE_INT8_g = FAIL; +hid_t H5T_NATIVE_UINT8_g = FAIL; +hid_t H5T_NATIVE_INT16_g = FAIL; +hid_t H5T_NATIVE_UINT16_g = FAIL; +hid_t H5T_NATIVE_INT32_g = FAIL; +hid_t H5T_NATIVE_UINT32_g = FAIL; +hid_t H5T_NATIVE_INT64_g = FAIL; +hid_t H5T_NATIVE_UINT64_g = FAIL; +hid_t H5T_NATIVE_ULONG_g = FAIL; +hid_t H5T_NATIVE_FLOAT_g = FAIL; +hid_t H5T_NATIVE_DOUBLE_g = FAIL; +hid_t H5T_NATIVE_TIME_g = FAIL; +hid_t H5T_NATIVE_STRING_g = FAIL; +hid_t H5T_NATIVE_BITFIELD_g = FAIL; +hid_t H5T_NATIVE_OPAQUE_g = FAIL; /* The path database */ -static intn H5T_npath_g = 0; /*num paths defined */ -static intn H5T_apath_g = 0; /*num slots allocated */ -static H5T_path_t *H5T_path_g = NULL; /*path array */ +static intn H5T_npath_g = 0; /*num paths defined */ +static intn H5T_apath_g = 0; /*num slots allocated */ +static H5T_path_t *H5T_path_g = NULL; /*path array */ /* The soft conversion function master list */ -static intn H5T_nsoft_g = 0; /*num soft funcs defined */ -static intn H5T_asoft_g = 0; /*num slots allocated */ -static H5T_soft_t *H5T_soft_g = NULL; /*master soft list */ +static intn H5T_nsoft_g = 0; /*num soft funcs defined */ +static intn H5T_asoft_g = 0; /*num slots allocated */ +static H5T_soft_t *H5T_soft_g = NULL; /*master soft list */ /*-------------------------------------------------------------------------- NAME @@ -86,8 +86,8 @@ DESCRIPTION herr_t H5T_init_interface(void) { - H5T_t *dt = NULL; - herr_t ret_value = SUCCEED; + H5T_t *dt = NULL; + herr_t ret_value = SUCCEED; interface_initialize_g = TRUE; FUNC_ENTER(H5T_init_interface, FAIL); @@ -96,7 +96,7 @@ H5T_init_interface(void) if ((ret_value = H5A_init_group(H5_DATATYPE, H5A_DATATYPEID_HASHSIZE, H5T_RESERVED_ATOMS, (herr_t (*)(void *)) H5T_close)) != FAIL) { - ret_value = H5_add_exit(&H5T_term_interface); + ret_value = H5_add_exit(&H5T_term_interface); } /* * Initialize pre-defined data types that depend on the architecture. @@ -171,8 +171,8 @@ H5T_init_interface(void) dt->u.atomic.lsb_pad = H5T_PAD_ZERO; dt->u.atomic.msb_pad = H5T_PAD_ZERO; if ((H5T_NATIVE_TIME_g = H5A_register(H5_DATATYPE, dt)) < 0) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, - "can't initialize H5T layer"); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, + "can't initialize H5T layer"); } /* STRING */ @@ -188,8 +188,8 @@ H5T_init_interface(void) dt->u.atomic.u.s.cset = H5T_CSET_ASCII; dt->u.atomic.u.s.pad = H5T_STR_NULL; if ((H5T_NATIVE_STRING_g = H5A_register(H5_DATATYPE, dt)) < 0) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, - "can't initialize H5T layer"); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, + "can't initialize H5T layer"); } /* BITFIELD */ @@ -203,8 +203,8 @@ H5T_init_interface(void) dt->u.atomic.lsb_pad = H5T_PAD_ZERO; dt->u.atomic.msb_pad = H5T_PAD_ZERO; if ((H5T_NATIVE_BITFIELD_g = H5A_register(H5_DATATYPE, dt)) < 0) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, - "unable to initialize H5T layer"); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, + "unable to initialize H5T layer"); } /* OPAQUE */ @@ -218,8 +218,8 @@ H5T_init_interface(void) dt->u.atomic.lsb_pad = H5T_PAD_ZERO; dt->u.atomic.msb_pad = H5T_PAD_ZERO; if ((H5T_NATIVE_OPAQUE_g = H5A_register(H5_DATATYPE, dt)) < 0) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, - "unable to initialize H5T layer"); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, + "unable to initialize H5T layer"); } /* @@ -236,12 +236,12 @@ H5T_init_interface(void) * ending with the most specific. */ if (H5Tregister_soft(H5T_INTEGER, H5T_INTEGER, H5T_conv_order) < 0) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, - "unable to register conversion function"); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, + "unable to register conversion function"); } if (H5Tregister_soft(H5T_FLOAT, H5T_FLOAT, H5T_conv_order) < 0) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, - "unable to register conversion function"); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, + "unable to register conversion function"); } if (H5Tregister_soft (H5T_COMPOUND, H5T_COMPOUND, H5T_conv_struct)<0) { HRETURN_ERROR (H5E_DATATYPE, H5E_CANTINIT, FAIL, @@ -276,22 +276,22 @@ H5T_term_interface(void) } /*------------------------------------------------------------------------- - * Function: H5Tcreate + * Function: H5Tcreate * - * Purpose: Create a new type and initialize it to reasonable values. - * The type is a member of type class TYPE and is SIZE bytes. + * Purpose: Create a new type and initialize it to reasonable values. + * The type is a member of type class TYPE and is SIZE bytes. * - * Return: Success: A new type identifier. + * Return: Success: A new type identifier. * - * Failure: FAIL + * Failure: FAIL * * Errors: - * ARGS BADVALUE Invalid size. - * DATATYPE CANTINIT Can't create type. - * DATATYPE CANTREGISTER Can't register data type atom. + * ARGS BADVALUE Invalid size. + * DATATYPE CANTINIT Can't create type. + * DATATYPE CANTREGISTER Can't register data type atom. * - * Programmer: Robb Matzke - * Friday, December 5, 1997 + * Programmer: Robb Matzke + * Friday, December 5, 1997 * * Modifications: * @@ -300,40 +300,40 @@ H5T_term_interface(void) hid_t H5Tcreate(H5T_class_t type, size_t size) { - H5T_t *dt = NULL; - hid_t ret_value = FAIL; + H5T_t *dt = NULL; + hid_t ret_value = FAIL; FUNC_ENTER(H5Tcreate, FAIL); /* check args */ if (size <= 0) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid size"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid size"); } /* create the type */ if (NULL == (dt = H5T_create(type, size))) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "can't create type"); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "can't create type"); } /* Make it an atom */ if ((ret_value = H5A_register(H5_DATATYPE, dt)) < 0) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, - "can't register data type atom"); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, + "can't register data type atom"); } FUNC_LEAVE(ret_value); } /*------------------------------------------------------------------------- - * Function: H5Tcopy + * Function: H5Tcopy * - * Purpose: Copies a data type. The resulting data type is not locked. - * The data type should be closed when no longer needed by - * calling H5Tclose(). + * Purpose: Copies a data type. The resulting data type is not locked. + * The data type should be closed when no longer needed by + * calling H5Tclose(). * - * Return: Success: The ID of a new data type. + * Return: Success: The ID of a new data type. * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Tuesday, December 9, 1997 + * Programmer: Robb Matzke + * Tuesday, December 9, 1997 * * Modifications: * @@ -342,42 +342,42 @@ H5Tcreate(H5T_class_t type, size_t size) hid_t H5Tcopy(hid_t type_id) { - H5T_t *dt = NULL; - H5T_t *new_dt = NULL; - hid_t ret_value = FAIL; + H5T_t *dt = NULL; + H5T_t *new_dt = NULL; + hid_t ret_value = FAIL; FUNC_ENTER(H5Tcopy, FAIL); H5ECLEAR; /* check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); + NULL == (dt = H5A_object(type_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); } /* copy */ if (NULL == (new_dt = H5T_copy(dt))) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "can't copy"); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "can't copy"); } /* atomize result */ if ((ret_value = H5A_register(H5_DATATYPE, new_dt)) < 0) { - H5T_close(new_dt); - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, - "can't register data type atom"); + H5T_close(new_dt); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, + "can't register data type atom"); } FUNC_LEAVE(ret_value); } /*------------------------------------------------------------------------- - * Function: H5Tclose + * Function: H5Tclose * - * Purpose: Frees a data type and all associated memory. + * Purpose: Frees a data type and all associated memory. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Tuesday, December 9, 1997 + * Programmer: Robb Matzke + * Tuesday, December 9, 1997 * * Modifications: * @@ -386,39 +386,39 @@ H5Tcopy(hid_t type_id) herr_t H5Tclose(hid_t type_id) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tclose, FAIL); H5ECLEAR; /* check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); + NULL == (dt = H5A_object(type_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); } if (dt->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "predefined data type"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "predefined data type"); } /* When the reference count reaches zero the resources are freed */ if (H5A_dec_ref(type_id) < 0) { - HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "problem freeing id"); + HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "problem freeing id"); } FUNC_LEAVE(SUCCEED); } /*------------------------------------------------------------------------- - * Function: H5Tequal + * Function: H5Tequal * - * Purpose: Determines if two data types are equal. + * Purpose: Determines if two data types are equal. * - * Return: Success: TRUE if equal, FALSE if unequal + * Return: Success: TRUE if equal, FALSE if unequal * - * Failure: FAIL + * Failure: FAIL * * Errors: * - * Programmer: Robb Matzke - * Wednesday, December 10, 1997 + * Programmer: Robb Matzke + * Wednesday, December 10, 1997 * * Modifications: * @@ -427,18 +427,18 @@ H5Tclose(hid_t type_id) hbool_t H5Tequal(hid_t type1_id, hid_t type2_id) { - const H5T_t *dt1 = NULL; - const H5T_t *dt2 = NULL; - hbool_t ret_value = FAIL; + const H5T_t *dt1 = NULL; + const H5T_t *dt2 = NULL; + hbool_t ret_value = FAIL; FUNC_ENTER(H5Tequal, FAIL); /* check args */ if (H5_DATATYPE != H5A_group(type1_id) || - NULL == (dt1 = H5A_object(type1_id)) || - H5_DATATYPE != H5A_group(type2_id) || - NULL == (dt2 = H5A_object(type2_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); + NULL == (dt1 = H5A_object(type1_id)) || + H5_DATATYPE != H5A_group(type2_id) || + NULL == (dt2 = H5A_object(type2_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); } ret_value = (0 == H5T_cmp(dt1, dt2)); @@ -446,21 +446,21 @@ H5Tequal(hid_t type1_id, hid_t type2_id) } /*------------------------------------------------------------------------- - * Function: H5Tlock + * Function: H5Tlock * - * Purpose: Locks a type, making it read only and non-destructable. This - * is normally done by the library for predefined data types so - * the application doesn't inadvertently change or delete a - * predefined type. + * Purpose: Locks a type, making it read only and non-destructable. This + * is normally done by the library for predefined data types so + * the application doesn't inadvertently change or delete a + * predefined type. * - * Once a data type is locked it can never be unlocked. + * Once a data type is locked it can never be unlocked. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Friday, January 9, 1998 + * Programmer: Robb Matzke + * Friday, January 9, 1998 * * Modifications: * @@ -469,31 +469,31 @@ H5Tequal(hid_t type1_id, hid_t type2_id) herr_t H5Tlock(hid_t type_id) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tlock, FAIL); /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); + NULL == (dt = H5A_object(type_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); } dt->locked = TRUE; FUNC_LEAVE(SUCCEED); } /*------------------------------------------------------------------------- - * Function: H5Tget_class + * Function: H5Tget_class * - * Purpose: Returns the data type class identifier for data type TYPE_ID. + * Purpose: Returns the data type class identifier for data type TYPE_ID. * - * Return: Success: One of the non-negative data type class - * constants. + * Return: Success: One of the non-negative data type class + * constants. * - * Failure: H5T_NO_CLASS (-1, same as FAIL) + * Failure: H5T_NO_CLASS (-1, same as FAIL) * - * Programmer: Robb Matzke - * Monday, December 8, 1997 + * Programmer: Robb Matzke + * Monday, December 8, 1997 * * Modifications: * @@ -502,32 +502,32 @@ H5Tlock(hid_t type_id) H5T_class_t H5Tget_class(hid_t type_id) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tget_class, H5T_NO_CLASS); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_NO_CLASS, "not a data type"); + NULL == (dt = H5A_object(type_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_NO_CLASS, "not a data type"); } FUNC_LEAVE(dt->type); } /*------------------------------------------------------------------------- - * Function: H5Tget_size + * Function: H5Tget_size * - * Purpose: Determines the total size of a data type in bytes. + * Purpose: Determines the total size of a data type in bytes. * - * Return: Success: Size of the data type in bytes. The size of - * data type is the size of an instance of that - * data type. + * Return: Success: Size of the data type in bytes. The size of + * data type is the size of an instance of that + * data type. * - * Failure: 0 (valid data types are never zero size) + * Failure: 0 (valid data types are never zero size) * - * Programmer: Robb Matzke - * Monday, December 8, 1997 + * Programmer: Robb Matzke + * Monday, December 8, 1997 * * Modifications: * @@ -536,16 +536,16 @@ H5Tget_class(hid_t type_id) size_t H5Tget_size(hid_t type_id) { - H5T_t *dt = NULL; - size_t size; + H5T_t *dt = NULL; + size_t size; FUNC_ENTER(H5Tget_size, 0); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a data type"); + NULL == (dt = H5A_object(type_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a data type"); } /* size */ size = H5T_get_size(dt); @@ -554,28 +554,28 @@ H5Tget_size(hid_t type_id) } /*------------------------------------------------------------------------- - * Function: H5Tset_size + * Function: H5Tset_size * - * Purpose: Sets the total size in bytes for an atomic data type (this - * operation is not permitted on compound data types). If the - * size is decreased so that the significant bits of the data - * type extend beyond the edge of the new size, then the - * `offset' property is decreased toward zero. If the `offset' - * becomes zero and the significant bits of the data type still - * hang over the edge of the new size, then the number of - * significant bits is decreased. + * Purpose: Sets the total size in bytes for an atomic data type (this + * operation is not permitted on compound data types). If the + * size is decreased so that the significant bits of the data + * type extend beyond the edge of the new size, then the + * `offset' property is decreased toward zero. If the `offset' + * becomes zero and the significant bits of the data type still + * hang over the edge of the new size, then the number of + * significant bits is decreased. * - * Adjusting the size of an H5T_STRING automatically sets the - * precision to 8*size. + * Adjusting the size of an H5T_STRING automatically sets the + * precision to 8*size. * - * All data types have a positive size. + * All data types have a positive size. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -584,74 +584,74 @@ H5Tget_size(hid_t type_id) herr_t H5Tset_size(hid_t type_id, size_t size) { - H5T_t *dt = NULL; - size_t prec, offset; + H5T_t *dt = NULL; + size_t prec, offset; FUNC_ENTER(H5Tset_size, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - !H5T_is_atomic(dt)) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type"); + NULL == (dt = H5A_object(type_id)) || + !H5T_is_atomic(dt)) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type"); } if (dt->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); + HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); } if (size <= 0) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "size must be positive"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "size must be positive"); } offset = dt->u.atomic.offset; prec = dt->u.atomic.prec; /* Decrement the offset and precision if necessary */ if (prec > 8 * size) - offset = 0; + offset = 0; else if (offset + prec > 8 * size) - offset = 8 * size - prec; + offset = 8 * size - prec; if (prec > 8 * size) - prec = 8 * size; + prec = 8 * size; /* Make sure that other values are still okay */ switch (dt->type) { case H5T_INTEGER: case H5T_TIME: case H5T_BITFIELD: - /* nothing to check */ - break; + /* nothing to check */ + break; case H5T_STRING: - prec = 8 * size; - offset = 0; - break; + prec = 8 * size; + offset = 0; + break; case H5T_FLOAT: - /* - * The sign, mantissa, and exponent fields should be adjusted first - * when decreasing the size of a floating point type. - */ - if (dt->u.atomic.u.f.sign >= prec || - dt->u.atomic.u.f.epos + dt->u.atomic.u.f.esize > prec || - dt->u.atomic.u.f.mpos + dt->u.atomic.u.f.msize > prec) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "adjust sign, mantissa, and exponent fields first"); - } - break; + /* + * The sign, mantissa, and exponent fields should be adjusted first + * when decreasing the size of a floating point type. + */ + if (dt->u.atomic.u.f.sign >= prec || + dt->u.atomic.u.f.epos + dt->u.atomic.u.f.esize > prec || + dt->u.atomic.u.f.mpos + dt->u.atomic.u.f.msize > prec) { + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "adjust sign, mantissa, and exponent fields first"); + } + break; case H5T_OPAQUE: - /* - * The significant bits of an opaque type are not allowed to change - * implicitly. - */ - if (prec != dt->u.atomic.prec) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "unable to change precision of an opaque type"); - } - break; + /* + * The significant bits of an opaque type are not allowed to change + * implicitly. + */ + if (prec != dt->u.atomic.prec) { + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "unable to change precision of an opaque type"); + } + break; default: - assert("not implemented yet" && 0); + assert("not implemented yet" && 0); } /* Commit */ @@ -663,16 +663,16 @@ H5Tset_size(hid_t type_id, size_t size) } /*------------------------------------------------------------------------- - * Function: H5Tget_order + * Function: H5Tget_order * - * Purpose: Returns the byte order of an atomic data type. + * Purpose: Returns the byte order of an atomic data type. * - * Return: Success: A byte order constant + * Return: Success: A byte order constant * - * Failure: H5T_ORDER_ERROR (-1, same as FAIL) + * Failure: H5T_ORDER_ERROR (-1, same as FAIL) * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -681,18 +681,18 @@ H5Tset_size(hid_t type_id, size_t size) H5T_order_t H5Tget_order(hid_t type_id) { - H5T_t *dt = NULL; - H5T_order_t order; + H5T_t *dt = NULL; + H5T_order_t order; FUNC_ENTER(H5Tget_order, H5T_ORDER_ERROR); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - !H5T_is_atomic(dt)) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_ORDER_ERROR, - "not an atomic data type"); + NULL == (dt = H5A_object(type_id)) || + !H5T_is_atomic(dt)) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_ORDER_ERROR, + "not an atomic data type"); } /* order */ order = dt->u.atomic.order; @@ -701,16 +701,16 @@ H5Tget_order(hid_t type_id) } /*------------------------------------------------------------------------- - * Function: H5Tset_order + * Function: H5Tset_order * - * Purpose: Sets the byte order for an atomic data type. + * Purpose: Sets the byte order for an atomic data type. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -719,22 +719,22 @@ H5Tget_order(hid_t type_id) herr_t H5Tset_order(hid_t type_id, H5T_order_t order) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tset_order, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - !H5T_is_atomic(dt)) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type"); + NULL == (dt = H5A_object(type_id)) || + !H5T_is_atomic(dt)) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type"); } if (dt->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); + HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); } if (order < 0 || order > H5T_ORDER_NONE) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal byte order"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal byte order"); } /* order */ dt->u.atomic.order = order; @@ -742,20 +742,20 @@ H5Tset_order(hid_t type_id, H5T_order_t order) } /*------------------------------------------------------------------------- - * Function: H5Tget_precision + * Function: H5Tget_precision * - * Purpose: Gets the precision of an atomic data type. The precision is - * the number of significant bits which, unless padding is - * present, is 8 times larger than the value returned by - * H5Tget_size(). + * Purpose: Gets the precision of an atomic data type. The precision is + * the number of significant bits which, unless padding is + * present, is 8 times larger than the value returned by + * H5Tget_size(). * - * Return: Success: Number of significant bits + * Return: Success: Number of significant bits * - * Failure: 0 (all atomic types have at least one - * significant bit) + * Failure: 0 (all atomic types have at least one + * significant bit) * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -764,17 +764,17 @@ H5Tset_order(hid_t type_id, H5T_order_t order) size_t H5Tget_precision(hid_t type_id) { - H5T_t *dt = NULL; - size_t prec; + H5T_t *dt = NULL; + size_t prec; FUNC_ENTER(H5Tget_precision, 0); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - !H5T_is_atomic(dt)) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not an atomic data type"); + NULL == (dt = H5A_object(type_id)) || + !H5T_is_atomic(dt)) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not an atomic data type"); } /* precision */ prec = dt->u.atomic.prec; @@ -783,30 +783,30 @@ H5Tget_precision(hid_t type_id) } /*------------------------------------------------------------------------- - * Function: H5Tset_precision + * Function: H5Tset_precision * - * Purpose: Sets the precision of an atomic data type. The precision is - * the number of significant bits which, unless padding is - * present, is 8 times larger than the value returned by - * H5Tget_size(). + * Purpose: Sets the precision of an atomic data type. The precision is + * the number of significant bits which, unless padding is + * present, is 8 times larger than the value returned by + * H5Tget_size(). * - * If the precision is increased then the offset is decreased - * and then the size is increased to insure that significant - * bits do not "hang over" the edge of the data type. + * If the precision is increased then the offset is decreased + * and then the size is increased to insure that significant + * bits do not "hang over" the edge of the data type. * - * Changing the precision of an H5T_STRING automatically changes - * the size as well. The precision must be a multiple of 8. + * Changing the precision of an H5T_STRING automatically changes + * the size as well. The precision must be a multiple of 8. * - * When decreasing the precision of a floating point type, set - * the locations and sizes of the sign, mantissa, and exponent - * fields first. + * When decreasing the precision of a floating point type, set + * the locations and sizes of the sign, mantissa, and exponent + * fields first. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -815,34 +815,34 @@ H5Tget_precision(hid_t type_id) herr_t H5Tset_precision(hid_t type_id, size_t prec) { - H5T_t *dt = NULL; - size_t offset, size; + H5T_t *dt = NULL; + size_t offset, size; FUNC_ENTER(H5Tset_prec, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - !H5T_is_atomic(dt)) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type"); + NULL == (dt = H5A_object(type_id)) || + !H5T_is_atomic(dt)) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type"); } if (dt->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); + HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); } if (prec <= 0) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "precision must be positive"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "precision must be positive"); } /* Adjust the offset and size */ offset = dt->u.atomic.offset; size = dt->size; if (prec > 8 * size) - offset = 0; + offset = 0; else if (offset + prec > 8 * size) - offset = 8 * size - prec; + offset = 8 * size - prec; if (prec > 8 * size) - size = (prec + 7) / 8; + size = (prec + 7) / 8; /* Check that things are still kosher */ switch (dt->type) { @@ -850,33 +850,33 @@ H5Tset_precision(hid_t type_id, size_t prec) case H5T_TIME: case H5T_BITFIELD: case H5T_OPAQUE: - /* nothing to check */ - break; + /* nothing to check */ + break; case H5T_STRING: - if (prec % 8) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "precision for this type must be a multiple of 8"); - } - offset = 0; - size = prec / 8; - break; + if (prec % 8) { + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "precision for this type must be a multiple of 8"); + } + offset = 0; + size = prec / 8; + break; case H5T_FLOAT: - /* - * The sign, mantissa, and exponent fields should be adjusted first - * when decreasing the precision of a floating point type. - */ - if (dt->u.atomic.u.f.sign >= prec || - dt->u.atomic.u.f.epos + dt->u.atomic.u.f.esize > prec || - dt->u.atomic.u.f.mpos + dt->u.atomic.u.f.msize > prec) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "adjust sign, mantissa, and exponent fields first"); - } - break; + /* + * The sign, mantissa, and exponent fields should be adjusted first + * when decreasing the precision of a floating point type. + */ + if (dt->u.atomic.u.f.sign >= prec || + dt->u.atomic.u.f.epos + dt->u.atomic.u.f.esize > prec || + dt->u.atomic.u.f.mpos + dt->u.atomic.u.f.msize > prec) { + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "adjust sign, mantissa, and exponent fields first"); + } + break; default: - assert("not implemented yet" && 0); + assert("not implemented yet" && 0); } /* Commit */ @@ -888,32 +888,32 @@ H5Tset_precision(hid_t type_id, size_t prec) } /*------------------------------------------------------------------------- - * Function: H5Tget_offset + * Function: H5Tget_offset * - * Purpose: Retrieves the bit offset of the first significant bit. The - * signficant bits of an atomic datum can be offset from the - * beginning of the memory for that datum by an amount of - * padding. The `offset' property specifies the number of bits - * of padding that appear to the "right of" the value. That is, - * if we have a 32-bit datum with 16-bits of precision having - * the value 0x1122 then it will be layed out in memory as (from - * small byte address toward larger byte addresses): + * Purpose: Retrieves the bit offset of the first significant bit. The + * signficant bits of an atomic datum can be offset from the + * beginning of the memory for that datum by an amount of + * padding. The `offset' property specifies the number of bits + * of padding that appear to the "right of" the value. That is, + * if we have a 32-bit datum with 16-bits of precision having + * the value 0x1122 then it will be layed out in memory as (from + * small byte address toward larger byte addresses): * - * Big Big Little Little - * Endian Endian Endian Endian - * offset=0 offset=16 offset=0 offset=16 + * Big Big Little Little + * Endian Endian Endian Endian + * offset=0 offset=16 offset=0 offset=16 * - * 0: [ pad] [0x11] [0x22] [ pad] - * 1: [ pad] [0x22] [0x11] [ pad] - * 2: [0x11] [ pad] [ pad] [0x22] - * 3: [0x22] [ pad] [ pad] [0x11] + * 0: [ pad] [0x11] [0x22] [ pad] + * 1: [ pad] [0x22] [0x11] [ pad] + * 2: [0x11] [ pad] [ pad] [0x22] + * 3: [0x22] [ pad] [ pad] [0x11] * - * Return: Success: The offset + * Return: Success: The offset * - * Failure: 0 + * Failure: 0 * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -922,17 +922,17 @@ H5Tset_precision(hid_t type_id, size_t prec) size_t H5Tget_offset(hid_t type_id) { - H5T_t *dt = NULL; - size_t offset; + H5T_t *dt = NULL; + size_t offset; FUNC_ENTER(H5Tget_offset, 0); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - !H5T_is_atomic(dt)) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not an atomic data type"); + NULL == (dt = H5A_object(type_id)) || + !H5T_is_atomic(dt)) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not an atomic data type"); } /* offset */ offset = dt->u.atomic.offset; @@ -941,39 +941,39 @@ H5Tget_offset(hid_t type_id) } /*------------------------------------------------------------------------- - * Function: H5Tset_offset + * Function: H5Tset_offset * - * Purpose: Sets the bit offset of the first significant bit. The - * signficant bits of an atomic datum can be offset from the - * beginning of the memory for that datum by an amount of - * padding. The `offset' property specifies the number of bits - * of padding that appear to the "right of" the value. That is, - * if we have a 32-bit datum with 16-bits of precision having - * the value 0x1122 then it will be layed out in memory as (from - * small byte address toward larger byte addresses): + * Purpose: Sets the bit offset of the first significant bit. The + * signficant bits of an atomic datum can be offset from the + * beginning of the memory for that datum by an amount of + * padding. The `offset' property specifies the number of bits + * of padding that appear to the "right of" the value. That is, + * if we have a 32-bit datum with 16-bits of precision having + * the value 0x1122 then it will be layed out in memory as (from + * small byte address toward larger byte addresses): * - * Big Big Little Little - * Endian Endian Endian Endian - * offset=0 offset=16 offset=0 offset=16 + * Big Big Little Little + * Endian Endian Endian Endian + * offset=0 offset=16 offset=0 offset=16 * - * 0: [ pad] [0x11] [0x22] [ pad] - * 1: [ pad] [0x22] [0x11] [ pad] - * 2: [0x11] [ pad] [ pad] [0x22] - * 3: [0x22] [ pad] [ pad] [0x11] + * 0: [ pad] [0x11] [0x22] [ pad] + * 1: [ pad] [0x22] [0x11] [ pad] + * 2: [0x11] [ pad] [ pad] [0x22] + * 3: [0x22] [ pad] [ pad] [0x11] * - * If the offset is incremented then the total size is - * incremented also if necessary to prevent significant bits of - * the value from hanging over the edge of the data type. + * If the offset is incremented then the total size is + * incremented also if necessary to prevent significant bits of + * the value from hanging over the edge of the data type. * - * The offset of an H5T_STRING cannot be set to anything but - * zero. + * The offset of an H5T_STRING cannot be set to anything but + * zero. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -982,27 +982,27 @@ H5Tget_offset(hid_t type_id) herr_t H5Tset_offset(hid_t type_id, size_t offset) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tset_offset, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - !H5T_is_atomic(dt)) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type"); + NULL == (dt = H5A_object(type_id)) || + !H5T_is_atomic(dt)) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type"); } if (dt->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); + HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); } if (H5T_STRING == dt->type && offset != 0) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "offset must be zero for this type"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "offset must be zero for this type"); } /* Adjust the size */ if (offset + dt->u.atomic.prec > 8 * dt->size) { - dt->size = (offset + dt->u.atomic.prec + 7) / 8; + dt->size = (offset + dt->u.atomic.prec + 7) / 8; } /* Commit */ dt->u.atomic.offset = offset; @@ -1011,18 +1011,18 @@ H5Tset_offset(hid_t type_id, size_t offset) } /*------------------------------------------------------------------------- - * Function: H5Tget_pad + * Function: H5Tget_pad * - * Purpose: Gets the least significant pad type and the most significant - * pad type and returns their values through the LSB and MSB - * arguments, either of which may be the null pointer. + * Purpose: Gets the least significant pad type and the most significant + * pad type and returns their values through the LSB and MSB + * arguments, either of which may be the null pointer. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Friday, January 9, 1998 + * Programmer: Robb Matzke + * Friday, January 9, 1998 * * Modifications: * @@ -1031,37 +1031,37 @@ H5Tset_offset(hid_t type_id, size_t offset) herr_t H5Tget_pad(hid_t type_id, H5T_pad_t *lsb /*out */ , H5T_pad_t *msb /*out */ ) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tget_pad, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - !H5T_is_atomic(dt)) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type"); + NULL == (dt = H5A_object(type_id)) || + !H5T_is_atomic(dt)) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type"); } /* Get values */ if (lsb) - *lsb = dt->u.atomic.lsb_pad; + *lsb = dt->u.atomic.lsb_pad; if (msb) - *msb = dt->u.atomic.msb_pad; + *msb = dt->u.atomic.msb_pad; FUNC_LEAVE(SUCCEED); } /*------------------------------------------------------------------------- - * Function: H5Tset_pad + * Function: H5Tset_pad * - * Purpose: Sets the LSB and MSB pad types. + * Purpose: Sets the LSB and MSB pad types. * - * Return: Success: + * Return: Success: * - * Failure: + * Failure: * - * Programmer: Robb Matzke - * Friday, January 9, 1998 + * Programmer: Robb Matzke + * Friday, January 9, 1998 * * Modifications: * @@ -1070,22 +1070,22 @@ H5Tget_pad(hid_t type_id, H5T_pad_t *lsb /*out */ , H5T_pad_t *msb /*out */ ) herr_t H5Tset_pad(hid_t type_id, H5T_pad_t lsb, H5T_pad_t msb) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tset_pad, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - !H5T_is_atomic(dt)) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type"); + NULL == (dt = H5A_object(type_id)) || + !H5T_is_atomic(dt)) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type"); } if (dt->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); + HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); } if (lsb < 0 || lsb >= H5T_NPAD || msb < 0 || msb >= H5T_NPAD) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid pad type"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid pad type"); } dt->u.atomic.lsb_pad = lsb; dt->u.atomic.msb_pad = msb; @@ -1094,16 +1094,16 @@ H5Tset_pad(hid_t type_id, H5T_pad_t lsb, H5T_pad_t msb) } /*------------------------------------------------------------------------- - * Function: H5Tget_sign + * Function: H5Tget_sign * - * Purpose: Retrieves the sign type for an integer type. + * Purpose: Retrieves the sign type for an integer type. * - * Return: Success: The sign type. + * Return: Success: The sign type. * - * Failure: H5T_SGN_ERROR (-1, same as FAIL) + * Failure: H5T_SGN_ERROR (-1, same as FAIL) * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -1112,18 +1112,18 @@ H5Tset_pad(hid_t type_id, H5T_pad_t lsb, H5T_pad_t msb) H5T_sign_t H5Tget_sign(hid_t type_id) { - H5T_t *dt = NULL; - H5T_sign_t sign; + H5T_t *dt = NULL; + H5T_sign_t sign; FUNC_ENTER(H5Tget_sign, H5T_SGN_ERROR); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_INTEGER != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_SGN_ERROR, - "not an integer data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_INTEGER != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_SGN_ERROR, + "not an integer data type"); } /* sign */ sign = dt->u.atomic.u.i.sign; @@ -1132,16 +1132,16 @@ H5Tget_sign(hid_t type_id) } /*------------------------------------------------------------------------- - * Function: H5Tset_sign + * Function: H5Tset_sign * - * Purpose: Sets the sign property for an integer. + * Purpose: Sets the sign property for an integer. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -1150,22 +1150,22 @@ H5Tget_sign(hid_t type_id) herr_t H5Tset_sign(hid_t type_id, H5T_sign_t sign) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tset_sign, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_INTEGER != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an integer data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_INTEGER != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an integer data type"); } if (dt->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); + HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); } if (sign < 0 || sign >= H5T_NSGN) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal sign type"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal sign type"); } /* sign */ dt->u.atomic.u.i.sign = sign; @@ -1173,22 +1173,22 @@ H5Tset_sign(hid_t type_id, H5T_sign_t sign) } /*------------------------------------------------------------------------- - * Function: H5Tget_fields + * Function: H5Tget_fields * - * Purpose: Returns information about the locations of the various bit - * fields of a floating point data type. The field positions - * are bit positions in the significant region of the data type. - * Bits are numbered with the least significant bit number zero. + * Purpose: Returns information about the locations of the various bit + * fields of a floating point data type. The field positions + * are bit positions in the significant region of the data type. + * Bits are numbered with the least significant bit number zero. * - * Any (or even all) of the arguments can be null pointers. + * Any (or even all) of the arguments can be null pointers. * - * Return: Success: SUCCEED, field locations and sizes are - * returned through the arguments. + * Return: Success: SUCCEED, field locations and sizes are + * returned through the arguments. * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -1196,53 +1196,53 @@ H5Tset_sign(hid_t type_id, H5T_sign_t sign) */ herr_t H5Tget_fields(hid_t type_id, size_t *spos /*out */ , - size_t *epos /*out */ , size_t *esize /*out */ , - size_t *mpos /*out */ , size_t *msize /*out */ ) + size_t *epos /*out */ , size_t *esize /*out */ , + size_t *mpos /*out */ , size_t *msize /*out */ ) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tget_fields, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_FLOAT != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, - "not a floating-point data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_FLOAT != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, + "not a floating-point data type"); } /* Get values */ if (spos) - *spos = dt->u.atomic.u.f.sign; + *spos = dt->u.atomic.u.f.sign; if (epos) - *epos = dt->u.atomic.u.f.epos; + *epos = dt->u.atomic.u.f.epos; if (esize) - *esize = dt->u.atomic.u.f.esize; + *esize = dt->u.atomic.u.f.esize; if (mpos) - *mpos = dt->u.atomic.u.f.mpos; + *mpos = dt->u.atomic.u.f.mpos; if (msize) - *msize = dt->u.atomic.u.f.msize; + *msize = dt->u.atomic.u.f.msize; FUNC_LEAVE(SUCCEED); } /*------------------------------------------------------------------------- - * Function: H5Tset_fields + * Function: H5Tset_fields * - * Purpose: Sets the locations and sizes of the various floating point - * bit fields. The field positions are bit positions in the - * significant region of the data type. Bits are numbered with - * the least significant bit number zero. + * Purpose: Sets the locations and sizes of the various floating point + * bit fields. The field positions are bit positions in the + * significant region of the data type. Bits are numbered with + * the least significant bit number zero. * - * Fields are not allowed to extend beyond the number of bits of - * precision, nor are they allowed to overlap with one another. - * - * Return: Success: SUCCEED + * Fields are not allowed to extend beyond the number of bits of + * precision, nor are they allowed to overlap with one another. + * + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -1250,48 +1250,48 @@ H5Tget_fields(hid_t type_id, size_t *spos /*out */ , */ herr_t H5Tset_fields(hid_t type_id, size_t spos, size_t epos, size_t esize, - size_t mpos, size_t msize) + size_t mpos, size_t msize) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tset_fields, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_FLOAT != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, - "not a floating-point data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_FLOAT != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, + "not a floating-point data type"); } if (dt->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); + HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); } if (epos < 0 || epos + esize > dt->u.atomic.prec) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "exponent bit field size/location is invalid"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "exponent bit field size/location is invalid"); } if (mpos < 0 || mpos + msize > dt->u.atomic.prec) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "mantissa bit field size/location is invalid"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "mantissa bit field size/location is invalid"); } if (spos < 0 || spos >= dt->u.atomic.prec) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "sign location is not valid"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "sign location is not valid"); } /* Check for overlap */ if (spos >= epos && spos < epos + esize) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "sign bit appears within exponent field"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "sign bit appears within exponent field"); } if (spos >= mpos && spos < mpos + msize) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "sign bit appears within mantissa field"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "sign bit appears within mantissa field"); } if ((mpos < epos && mpos + msize > epos) || - (epos < mpos && epos + esize > mpos)) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "exponent and mantissa fields overlap"); + (epos < mpos && epos + esize > mpos)) { + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "exponent and mantissa fields overlap"); } /* Commit */ dt->u.atomic.u.f.sign = spos; @@ -1304,16 +1304,16 @@ H5Tset_fields(hid_t type_id, size_t spos, size_t epos, size_t esize, } /*------------------------------------------------------------------------- - * Function: H5Tget_ebias + * Function: H5Tget_ebias * - * Purpose: Retrieves the exponent bias of a floating-point type. + * Purpose: Retrieves the exponent bias of a floating-point type. * - * Return: Success: The bias + * Return: Success: The bias * - * Failure: 0 + * Failure: 0 * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -1322,18 +1322,18 @@ H5Tset_fields(hid_t type_id, size_t spos, size_t epos, size_t esize, size_t H5Tget_ebias(hid_t type_id) { - H5T_t *dt = NULL; - size_t ebias; + H5T_t *dt = NULL; + size_t ebias; FUNC_ENTER(H5Tget_ebias, 0); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_FLOAT != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, 0, - "not a floating-point data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_FLOAT != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, 0, + "not a floating-point data type"); } /* bias */ ebias = dt->u.atomic.u.f.ebias; @@ -1342,16 +1342,16 @@ H5Tget_ebias(hid_t type_id) } /*------------------------------------------------------------------------- - * Function: H5Tset_ebias + * Function: H5Tset_ebias * - * Purpose: Sets the exponent bias of a floating-point type. + * Purpose: Sets the exponent bias of a floating-point type. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -1360,20 +1360,20 @@ H5Tget_ebias(hid_t type_id) herr_t H5Tset_ebias(hid_t type_id, size_t ebias) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tset_ebias, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_FLOAT != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, - "not a floating-point data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_FLOAT != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, + "not a floating-point data type"); } if (dt->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); + HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); } dt->u.atomic.u.f.ebias = ebias; @@ -1381,17 +1381,17 @@ H5Tset_ebias(hid_t type_id, size_t ebias) } /*------------------------------------------------------------------------- - * Function: H5Tget_norm + * Function: H5Tget_norm * - * Purpose: Returns the mantisssa normalization of a floating-point data - * type. + * Purpose: Returns the mantisssa normalization of a floating-point data + * type. * - * Return: Success: Normalization ID + * Return: Success: Normalization ID * - * Failure: H5T_NORM_ERROR (-1, same as FAIL) + * Failure: H5T_NORM_ERROR (-1, same as FAIL) * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -1400,18 +1400,18 @@ H5Tset_ebias(hid_t type_id, size_t ebias) H5T_norm_t H5Tget_norm(hid_t type_id) { - H5T_t *dt = NULL; - H5T_norm_t norm; + H5T_t *dt = NULL; + H5T_norm_t norm; FUNC_ENTER(H5Tget_norm, H5T_NORM_ERROR); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_FLOAT != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_NORM_ERROR, - "not a floating-point data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_FLOAT != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_NORM_ERROR, + "not a floating-point data type"); } /* norm */ norm = dt->u.atomic.u.f.norm; @@ -1420,17 +1420,17 @@ H5Tget_norm(hid_t type_id) } /*------------------------------------------------------------------------- - * Function: H5Tset_norm + * Function: H5Tset_norm * - * Purpose: Sets the mantissa normalization method for a floating point - * data type. + * Purpose: Sets the mantissa normalization method for a floating point + * data type. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -1439,23 +1439,23 @@ H5Tget_norm(hid_t type_id) herr_t H5Tset_norm(hid_t type_id, H5T_norm_t norm) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tset_norm, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_FLOAT != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, - "not a floating-point data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_FLOAT != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, + "not a floating-point data type"); } if (dt->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); + HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); } if (norm < 0 || norm > H5T_NORM_NONE) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal normalization"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal normalization"); } /* norm */ dt->u.atomic.u.f.norm = norm; @@ -1463,19 +1463,19 @@ H5Tset_norm(hid_t type_id, H5T_norm_t norm) } /*------------------------------------------------------------------------- - * Function: H5Tget_inpad + * Function: H5Tget_inpad * - * Purpose: If any internal bits of a floating point type are unused - * (that is, those significant bits which are not part of the - * sign, exponent, or mantissa) then they will be filled - * according to the value of this property. + * Purpose: If any internal bits of a floating point type are unused + * (that is, those significant bits which are not part of the + * sign, exponent, or mantissa) then they will be filled + * according to the value of this property. * - * Return: Success: The internal padding type. + * Return: Success: The internal padding type. * - * Failure: H5T_PAD_ERROR (-1, same as FAIL) + * Failure: H5T_PAD_ERROR (-1, same as FAIL) * - * Programmer: Robb Matzke - * Friday, January 9, 1998 + * Programmer: Robb Matzke + * Friday, January 9, 1998 * * Modifications: * @@ -1484,18 +1484,18 @@ H5Tset_norm(hid_t type_id, H5T_norm_t norm) H5T_pad_t H5Tget_inpad(hid_t type_id) { - H5T_t *dt = NULL; - H5T_pad_t pad; + H5T_t *dt = NULL; + H5T_pad_t pad; FUNC_ENTER(H5Tget_inpad, H5T_PAD_ERROR); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_FLOAT != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_PAD_ERROR, - "not a floating-point data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_FLOAT != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_PAD_ERROR, + "not a floating-point data type"); } /* pad */ pad = dt->u.atomic.u.f.pad; @@ -1504,19 +1504,19 @@ H5Tget_inpad(hid_t type_id) } /*------------------------------------------------------------------------- - * Function: H5Tset_inpad + * Function: H5Tset_inpad * - * Purpose: If any internal bits of a floating point type are unused - * (that is, those significant bits which are not part of the - * sign, exponent, or mantissa) then they will be filled - * according to the value of this property. + * Purpose: If any internal bits of a floating point type are unused + * (that is, those significant bits which are not part of the + * sign, exponent, or mantissa) then they will be filled + * according to the value of this property. * - * Return: Success: + * Return: Success: * - * Failure: + * Failure: * - * Programmer: Robb Matzke - * Friday, January 9, 1998 + * Programmer: Robb Matzke + * Friday, January 9, 1998 * * Modifications: * @@ -1525,24 +1525,24 @@ H5Tget_inpad(hid_t type_id) herr_t H5Tset_inpad(hid_t type_id, H5T_pad_t pad) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tset_inpad, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_FLOAT != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, - "not a floating-point data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_FLOAT != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, + "not a floating-point data type"); } if (dt->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); + HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); } if (pad < 0 || pad >= H5T_NPAD) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "illegal internal pad type"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "illegal internal pad type"); } /* pad */ dt->u.atomic.u.f.pad = pad; @@ -1550,18 +1550,18 @@ H5Tset_inpad(hid_t type_id, H5T_pad_t pad) } /*------------------------------------------------------------------------- - * Function: H5Tget_cset + * Function: H5Tget_cset * - * Purpose: HDF5 is able to distinguish between character sets of - * different nationalities and to convert between them to the - * extent possible. - * - * Return: Success: The character set of an H5T_STRING type. + * Purpose: HDF5 is able to distinguish between character sets of + * different nationalities and to convert between them to the + * extent possible. + * + * Return: Success: The character set of an H5T_STRING type. * - * Failure: H5T_CSET_ERROR (-1, same as FAIL) + * Failure: H5T_CSET_ERROR (-1, same as FAIL) * - * Programmer: Robb Matzke - * Friday, January 9, 1998 + * Programmer: Robb Matzke + * Friday, January 9, 1998 * * Modifications: * @@ -1570,18 +1570,18 @@ H5Tset_inpad(hid_t type_id, H5T_pad_t pad) H5T_cset_t H5Tget_cset(hid_t type_id) { - H5T_t *dt = NULL; - H5T_cset_t cset; + H5T_t *dt = NULL; + H5T_cset_t cset; FUNC_ENTER(H5Tget_cset, H5T_CSET_ERROR); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_STRING != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_CSET_ERROR, - "not a string data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_STRING != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_CSET_ERROR, + "not a string data type"); } /* result */ cset = dt->u.atomic.u.s.cset; @@ -1590,18 +1590,18 @@ H5Tget_cset(hid_t type_id) } /*------------------------------------------------------------------------- - * Function: H5Tset_cset + * Function: H5Tset_cset * - * Purpose: HDF5 is able to distinguish between character sets of - * different nationalities and to convert between them to the - * extent possible. + * Purpose: HDF5 is able to distinguish between character sets of + * different nationalities and to convert between them to the + * extent possible. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Friday, January 9, 1998 + * Programmer: Robb Matzke + * Friday, January 9, 1998 * * Modifications: * @@ -1610,23 +1610,23 @@ H5Tget_cset(hid_t type_id) herr_t H5Tset_cset(hid_t type_id, H5T_cset_t cset) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tset_cset, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_STRING != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a string data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_STRING != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a string data type"); } if (dt->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); + HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); } if (cset < 0 || cset >= H5T_NCSET) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "illegal character set type"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "illegal character set type"); } /* set */ dt->u.atomic.u.s.cset = cset; @@ -1634,19 +1634,19 @@ H5Tset_cset(hid_t type_id, H5T_cset_t cset) } /*------------------------------------------------------------------------- - * Function: H5Tget_strpad + * Function: H5Tget_strpad * - * Purpose: The method used to store character strings differs with the - * programming language: C usually null terminates strings while - * Fortran left-justifies and space-pads strings. This property - * defines the storage mechanism for the string. - * - * Return: Success: The character set of an H5T_STRING type. + * Purpose: The method used to store character strings differs with the + * programming language: C usually null terminates strings while + * Fortran left-justifies and space-pads strings. This property + * defines the storage mechanism for the string. + * + * Return: Success: The character set of an H5T_STRING type. * - * Failure: H5T_STR_ERROR (-1, same as FAIL) + * Failure: H5T_STR_ERROR (-1, same as FAIL) * - * Programmer: Robb Matzke - * Friday, January 9, 1998 + * Programmer: Robb Matzke + * Friday, January 9, 1998 * * Modifications: * @@ -1655,18 +1655,18 @@ H5Tset_cset(hid_t type_id, H5T_cset_t cset) H5T_str_t H5Tget_strpad(hid_t type_id) { - H5T_t *dt = NULL; - H5T_str_t strpad; + H5T_t *dt = NULL; + H5T_str_t strpad; FUNC_ENTER(H5Tget_strpad, H5T_STR_ERROR); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_STRING != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_STR_ERROR, - "not a string data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_STRING != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_STR_ERROR, + "not a string data type"); } /* result */ strpad = dt->u.atomic.u.s.pad; @@ -1675,19 +1675,19 @@ H5Tget_strpad(hid_t type_id) } /*------------------------------------------------------------------------- - * Function: H5Tset_strpad + * Function: H5Tset_strpad * - * Purpose: The method used to store character strings differs with the - * programming language: C usually null terminates strings while - * Fortran left-justifies and space-pads strings. This property - * defines the storage mechanism for the string. + * Purpose: The method used to store character strings differs with the + * programming language: C usually null terminates strings while + * Fortran left-justifies and space-pads strings. This property + * defines the storage mechanism for the string. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Friday, January 9, 1998 + * Programmer: Robb Matzke + * Friday, January 9, 1998 * * Modifications: * @@ -1696,22 +1696,22 @@ H5Tget_strpad(hid_t type_id) herr_t H5Tset_strpad(hid_t type_id, H5T_str_t strpad) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tset_strpad, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_STRING != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a string data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_STRING != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a string data type"); } if (dt->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); + HRETURN_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); } if (strpad < 0 || strpad >= H5T_NSTR) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal string pad type"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal string pad type"); } /* set */ dt->u.atomic.u.s.pad = strpad; @@ -1719,19 +1719,19 @@ H5Tset_strpad(hid_t type_id, H5T_str_t strpad) } /*------------------------------------------------------------------------- - * Function: H5Tget_nmembers + * Function: H5Tget_nmembers * - * Purpose: Determines how many members compound data type TYPE_ID has. + * Purpose: Determines how many members compound data type TYPE_ID has. * - * Return: Success: Number of members defined in a compound data - * type. + * Return: Success: Number of members defined in a compound data + * type. * - * Failure: FAIL + * Failure: FAIL * * Errors: * - * Programmer: Robb Matzke - * Monday, December 8, 1997 + * Programmer: Robb Matzke + * Monday, December 8, 1997 * * Modifications: * @@ -1741,77 +1741,77 @@ intn H5Tget_nmembers(hid_t type_id) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tget_num_members, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_COMPOUND != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_COMPOUND != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound data type"); } FUNC_LEAVE(dt->u.compnd.nmembs); } /*------------------------------------------------------------------------- - * Function: H5Tget_member_name + * Function: H5Tget_member_name * - * Purpose: Returns the name of a member of a compound data type. - * Members are stored in no particular order with numbers 0 - * through N-1 where N is the value returned by - * H5Tget_nmembers(). + * Purpose: Returns the name of a member of a compound data type. + * Members are stored in no particular order with numbers 0 + * through N-1 where N is the value returned by + * H5Tget_nmembers(). * - * Return: Success: Ptr to a string allocated with malloc(). The - * caller is responsible for freeing the string. + * Return: Success: Ptr to a string allocated with malloc(). The + * caller is responsible for freeing the string. * - * Failure: NULL + * Failure: NULL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * *------------------------------------------------------------------------- */ -char * +char * H5Tget_member_name(hid_t type_id, int membno) { - H5T_t *dt = NULL; - char *s = NULL; + H5T_t *dt = NULL; + char *s = NULL; FUNC_ENTER(H5Tget_member_name, NULL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_COMPOUND != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a compound data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_COMPOUND != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a compound data type"); } if (membno < 0 || membno >= dt->u.compnd.nmembs) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid member number"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid member number"); } s = H5MM_xstrdup(dt->u.compnd.memb[membno].name); FUNC_LEAVE(s); } /*------------------------------------------------------------------------- - * Function: H5Tget_member_offset + * Function: H5Tget_member_offset * - * Purpose: Returns the byte offset of the beginning of a member with - * respect to the beginning of the compound data type datum. + * Purpose: Returns the byte offset of the beginning of a member with + * respect to the beginning of the compound data type datum. * - * Return: Success: Byte offset. + * Return: Success: Byte offset. * - * Failure: Zero. Zero is a valid offset, but this - * function will fail only if a call to - * H5Tget_member_dims() fails with the same - * arguments. + * Failure: Zero. Zero is a valid offset, but this + * function will fail only if a call to + * H5Tget_member_dims() fails with the same + * arguments. * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -1820,39 +1820,39 @@ H5Tget_member_name(hid_t type_id, int membno) size_t H5Tget_member_offset(hid_t type_id, int membno) { - H5T_t *dt = NULL; - size_t offset = 0; + H5T_t *dt = NULL; + size_t offset = 0; FUNC_ENTER(H5Tget_member_offset, 0); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_COMPOUND != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a compound data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_COMPOUND != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a compound data type"); } if (membno < 0 || membno >= dt->u.compnd.nmembs) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "invalid member number"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "invalid member number"); } offset = dt->u.compnd.memb[membno].offset; FUNC_LEAVE(offset); } /*------------------------------------------------------------------------- - * Function: H5Tget_member_dims + * Function: H5Tget_member_dims * - * Purpose: Returns the dimensionality of the member. The dimensions and - * permuation vector are returned through arguments DIMS and - * PERM, both arrays of at least four elements. Either (or even - * both) may be null pointers. + * Purpose: Returns the dimensionality of the member. The dimensions and + * permuation vector are returned through arguments DIMS and + * PERM, both arrays of at least four elements. Either (or even + * both) may be null pointers. * - * Return: Success: A value between zero and four, inclusive. + * Return: Success: A value between zero and four, inclusive. * - * Failure: -1 + * Failure: -1 * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -1860,49 +1860,49 @@ H5Tget_member_offset(hid_t type_id, int membno) */ int H5Tget_member_dims(hid_t type_id, int membno, - int dims[] /*out */ , int perm[] /*out */ ) + int dims[] /*out */ , int perm[] /*out */ ) { - H5T_t *dt = NULL; - intn ndims, i; + H5T_t *dt = NULL; + intn ndims, i; FUNC_ENTER(H5Tget_member_dims, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_COMPOUND != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_COMPOUND != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound data type"); } if (membno < 0 || membno >= dt->u.compnd.nmembs) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid member number"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid member number"); } ndims = dt->u.compnd.memb[membno].ndims; for (i = 0; i < ndims; i++) { - if (dims[i]) - dims[i] = dt->u.compnd.memb[membno].dim[i]; - if (perm[i]) - perm[i] = dt->u.compnd.memb[membno].perm[i]; + if (dims[i]) + dims[i] = dt->u.compnd.memb[membno].dim[i]; + if (perm[i]) + perm[i] = dt->u.compnd.memb[membno].perm[i]; } FUNC_LEAVE(ndims); } /*------------------------------------------------------------------------- - * Function: H5Tget_member_type + * Function: H5Tget_member_type * - * Purpose: Returns the data type of the specified member. The caller - * should invoke H5Tclose() to release resources associated with - * the type. + * Purpose: Returns the data type of the specified member. The caller + * should invoke H5Tclose() to release resources associated with + * the type. * - * Return: Success: An OID of a copy of the member data type; - * modifying the returned data type does not - * modify the member type. + * Return: Success: An OID of a copy of the member data type; + * modifying the returned data type does not + * modify the member type. * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -1911,57 +1911,57 @@ H5Tget_member_dims(hid_t type_id, int membno, hid_t H5Tget_member_type(hid_t type_id, int membno) { - H5T_t *dt = NULL, *memb_dt = NULL; - hid_t memb_type_id; + H5T_t *dt = NULL, *memb_dt = NULL; + hid_t memb_type_id; FUNC_ENTER(H5Tget_member_type, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_COMPOUND != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_COMPOUND != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound data type"); } if (membno < 0 || membno >= dt->u.compnd.nmembs) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid member number"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid member number"); } /* Copy data type into an atom */ if (NULL == (memb_dt = H5T_copy(&(dt->u.compnd.memb[membno].type)))) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, - "unable to copy member data type"); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, + "unable to copy member data type"); } if ((memb_type_id = H5A_register(H5_DATATYPE, memb_dt)) < 0) { - H5T_close(memb_dt); - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, - "can't register data type atom"); + H5T_close(memb_dt); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, + "can't register data type atom"); } FUNC_LEAVE(memb_type_id); } /*------------------------------------------------------------------------- - * Function: H5Tinsert + * Function: H5Tinsert * - * Purpose: Adds another member to the compound data type PARENT_ID. The - * new member has a NAME which must be unique within the - * compound data type. The OFFSET argument defines the start of - * the member in an instance of the compound data type, and - * MEMBER_ID is the type of the new member. + * Purpose: Adds another member to the compound data type PARENT_ID. The + * new member has a NAME which must be unique within the + * compound data type. The OFFSET argument defines the start of + * the member in an instance of the compound data type, and + * MEMBER_ID is the type of the new member. * - * Note: All members of a compound data type must be atomic; a - * compound data type cannot have a member which is a compound - * data type. + * Note: All members of a compound data type must be atomic; a + * compound data type cannot have a member which is a compound + * data type. * - * Return: Success: SUCCEED, the PARENT_ID compound data type is - * modified to include a copy of the member type - * MEMBER_ID. + * Return: Success: SUCCEED, the PARENT_ID compound data type is + * modified to include a copy of the member type + * MEMBER_ID. * - * Failure: FAIL + * Failure: FAIL * * Errors: * - * Programmer: Robb Matzke - * Monday, December 8, 1997 + * Programmer: Robb Matzke + * Monday, December 8, 1997 * * Modifications: * @@ -1970,47 +1970,47 @@ H5Tget_member_type(hid_t type_id, int membno) herr_t H5Tinsert(hid_t parent_id, const char *name, off_t offset, hid_t member_id) { - H5T_t *parent = NULL; /*the compound parent data type */ - H5T_t *member = NULL; /*the atomic member type */ + H5T_t *parent = NULL; /*the compound parent data type */ + H5T_t *member = NULL; /*the atomic member type */ FUNC_ENTER(H5Tinsert, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(parent_id) || - NULL == (parent = H5A_object(parent_id)) || - H5T_COMPOUND != parent->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound data type"); + NULL == (parent = H5A_object(parent_id)) || + H5T_COMPOUND != parent->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound data type"); } if (parent->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "parent type read-only"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "parent type read-only"); } if (!name || !*name) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no member name"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no member name"); } if (H5_DATATYPE != H5A_group(member_id) || - NULL == (member = H5A_object(member_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); + NULL == (member = H5A_object(member_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); } if (H5T_insert(parent, name, offset, member) < 0) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, - "can't insert member"); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, + "can't insert member"); } FUNC_LEAVE(SUCCEED); } /*------------------------------------------------------------------------- - * Function: H5Tpack + * Function: H5Tpack * - * Purpose: Recursively removes padding from within a compound data type - * to make it more efficient (space-wise) to store that data. + * Purpose: Recursively removes padding from within a compound data type + * to make it more efficient (space-wise) to store that data. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -2019,47 +2019,47 @@ H5Tinsert(hid_t parent_id, const char *name, off_t offset, hid_t member_id) herr_t H5Tpack(hid_t type_id) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5Tpack, FAIL); H5ECLEAR; /* Check args */ if (H5_DATATYPE != H5A_group(type_id) || - NULL == (dt = H5A_object(type_id)) || - H5T_COMPOUND != dt->type) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound data type"); + NULL == (dt = H5A_object(type_id)) || + H5T_COMPOUND != dt->type) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound data type"); } if (dt->locked) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "data type is read-only"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "data type is read-only"); } if (H5T_pack(dt) < 0) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, - "unable to pack compound data type"); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, + "unable to pack compound data type"); } FUNC_LEAVE(SUCCEED); } /*------------------------------------------------------------------------- - * Function: H5Tregister_hard + * Function: H5Tregister_hard * - * Purpose: Register a hard conversion function for a data type - * conversion path. The path is specified by the source and - * destination data types SRC_ID and DST_ID. A conversion path - * can only have one hard function, so FUNC replaces any - * previous hard function. + * Purpose: Register a hard conversion function for a data type + * conversion path. The path is specified by the source and + * destination data types SRC_ID and DST_ID. A conversion path + * can only have one hard function, so FUNC replaces any + * previous hard function. * - * If FUNC is the null pointer then any hard function registered - * for this path is removed from this path. The soft functions - * are then used when determining which conversion function is - * appropriate for this path. + * If FUNC is the null pointer then any hard function registered + * for this path is removed from this path. The soft functions + * are then used when determining which conversion function is + * appropriate for this path. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Friday, January 9, 1998 + * Programmer: Robb Matzke + * Friday, January 9, 1998 * * Modifications: * @@ -2068,23 +2068,23 @@ H5Tpack(hid_t type_id) herr_t H5Tregister_hard(hid_t src_id, hid_t dst_id, H5T_conv_t func) { - H5T_t *src = NULL; - H5T_t *dst = NULL; - H5T_path_t *path = NULL; + H5T_t *src = NULL; + H5T_t *dst = NULL; + H5T_path_t *path = NULL; FUNC_ENTER(H5Tregister_hard, FAIL); /* Check args */ if (H5_DATATYPE != H5A_group(src_id) || - NULL == (src = H5A_object(src_id)) || - H5_DATATYPE != H5A_group(dst_id) || - NULL == (dst = H5A_object(dst_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); + NULL == (src = H5A_object(src_id)) || + H5_DATATYPE != H5A_group(dst_id) || + NULL == (dst = H5A_object(dst_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); } /* Locate or create a new conversion path */ if (NULL == (path = H5T_path_find(src, dst, TRUE))) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, - "unable to locate/allocate conversion path"); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, + "unable to locate/allocate conversion path"); } /* Initialize the hard function */ path->hard = func; @@ -2092,18 +2092,18 @@ H5Tregister_hard(hid_t src_id, hid_t dst_id, H5T_conv_t func) } /*------------------------------------------------------------------------- - * Function: H5Tregister_soft + * Function: H5Tregister_soft * - * Purpose: Registers a soft conversion function by adding it to the end - * of the master soft list and replacing the soft function in - * all applicable existing conversion paths. + * Purpose: Registers a soft conversion function by adding it to the end + * of the master soft list and replacing the soft function in + * all applicable existing conversion paths. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Tuesday, January 13, 1998 + * Programmer: Robb Matzke + * Tuesday, January 13, 1998 * * Modifications: * @@ -2112,25 +2112,26 @@ H5Tregister_hard(hid_t src_id, hid_t dst_id, H5T_conv_t func) herr_t H5Tregister_soft(H5T_class_t src_cls, H5T_class_t dst_cls, H5T_conv_t func) { - intn i; - hid_t src_id, dst_id; + intn i; + hid_t src_id, dst_id; FUNC_ENTER(H5Tregister_soft, FAIL); /* Check args */ if (src_cls < 0 || src_cls >= H5T_NCLASSES || - dst_cls < 0 || dst_cls >= H5T_NCLASSES) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "illegal source or destination data type class"); + dst_cls < 0 || dst_cls >= H5T_NCLASSES) { + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "illegal source or destination data type class"); } if (!func) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "no soft conversion function specified"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "no soft conversion function specified"); } /* Add function to end of master list */ if (H5T_nsoft_g >= H5T_asoft_g) { - H5T_asoft_g = MAX(32, 2 * H5T_asoft_g); - H5T_soft_g = H5MM_xrealloc(H5T_soft_g, H5T_asoft_g * sizeof(H5T_soft_t)); + H5T_asoft_g = MAX(32, 2 * H5T_asoft_g); + H5T_soft_g = H5MM_xrealloc(H5T_soft_g, + H5T_asoft_g * sizeof(H5T_soft_t)); } H5T_soft_g[H5T_nsoft_g].src = src_cls; H5T_soft_g[H5T_nsoft_g].dst = dst_cls; @@ -2139,45 +2140,49 @@ H5Tregister_soft(H5T_class_t src_cls, H5T_class_t dst_cls, H5T_conv_t func) /* Replace soft functions of all appropriate paths */ for (i = 0; i < H5T_npath_g; i++) { - H5T_path_t *path = H5T_path_g + i; - - /* - * Type conversion functions are app-level, so we need to convert the - * data type temporarily to an object id before we query the functions - * capabilities. - */ - if (path->src->type != src_cls || path->dst->type != dst_cls) - continue; - if ((src_id = H5A_register(H5_DATATYPE, H5T_copy(path->src))) < 0 || - (dst_id = H5A_register(H5_DATATYPE, H5T_copy(path->dst))) < 0) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, - "unable to register data types for conv query"); - } - if ((func) (src_id, dst_id, 0, NULL, NULL) >= 0) { - path->soft = func; - } - H5A_dec_ref(src_id); - H5A_dec_ref(dst_id); - H5ECLEAR; + H5T_path_t *path = H5T_path_g + i; + void *cdata = NULL; + + /* + * Type conversion functions are app-level, so we need to convert the + * data type temporarily to an object id before we query the functions + * capabilities. + */ + if (path->src->type != src_cls || path->dst->type != dst_cls) { + continue; + } + if ((src_id = H5A_register(H5_DATATYPE, H5T_copy(path->src))) < 0 || + (dst_id = H5A_register(H5_DATATYPE, H5T_copy(path->dst))) < 0) { + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, + "unable to register data types for conv query"); + } + if ((func) (src_id, dst_id, &cdata, 0, NULL, NULL) >= 0) { + path->soft = func; + H5MM_xfree (path->cdata); + path->cdata = cdata; + } + H5A_dec_ref(src_id); + H5A_dec_ref(dst_id); + H5ECLEAR; } FUNC_LEAVE(SUCCEED); } /*------------------------------------------------------------------------- - * Function: H5Tunregister + * Function: H5Tunregister * - * Purpose: Removes FUNC from all conversion paths. If FUNC is - * registered as the soft conversion function of a path then it - * is replaced with some other soft conversion function from the - * master soft list if one applies. + * Purpose: Removes FUNC from all conversion paths. If FUNC is + * registered as the soft conversion function of a path then it + * is replaced with some other soft conversion function from the + * master soft list if one applies. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Tuesday, January 13, 1998 + * Programmer: Robb Matzke + * Tuesday, January 13, 1998 * * Modifications: * @@ -2186,101 +2191,117 @@ H5Tregister_soft(H5T_class_t src_cls, H5T_class_t dst_cls, H5T_conv_t func) herr_t H5Tunregister(H5T_conv_t func) { - intn i, j; - H5T_path_t *path = NULL; - hid_t src_id, dst_id; + intn i, j; + H5T_path_t *path = NULL; + hid_t src_id, dst_id; FUNC_ENTER(H5Tunregister, FAIL); /* Check args */ if (!func) { - HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no conversion function"); + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no conversion function"); } /* Remove function from master soft list */ - for (i = H5T_nsoft_g - 1; i >= 0; --i) { - if (H5T_soft_g[i].func == func) { - HDmemmove(H5T_soft_g + i, H5T_soft_g + i + 1, - (H5T_nsoft_g - (i + 1)) * sizeof(H5T_soft_t)); - --H5T_nsoft_g; - } + for (i=H5T_nsoft_g-1; i>=0; --i) { + if (H5T_soft_g[i].func == func) { + HDmemmove(H5T_soft_g+i, H5T_soft_g+i+1, + (H5T_nsoft_g - (i+1)) * sizeof(H5T_soft_t)); + --H5T_nsoft_g; + } } /* Remove function from all conversion paths */ - for (i = 0; i < H5T_npath_g; i++) { - path = H5T_path_g + i; - - /* Reset hard function */ - if (path->hard == func) { - path->hard = NULL; - } - /* Reset soft function */ - if (path->soft == func) { - path->soft = NULL; - for (j = H5T_nsoft_g - 1; j >= 0 && !path->soft; --j) { - if (path->src->type != H5T_soft_g[j].src || - path->dst->type != H5T_soft_g[j].dst) { - continue; - } - /* - * Conversion functions are app-level, so temporarily create - * object id's for the data types. - */ - if ((src_id = H5A_register(H5_DATATYPE, + for (i=0; i<H5T_npath_g; i++) { + path = H5T_path_g + i; + + /* Reset hard function */ + if (path->hard == func) { + path->hard = NULL; + } + + /* Reset soft function */ + if (path->soft == func) { + path->soft = NULL; + path->cdata = H5MM_xfree (path->cdata); + + for (j=H5T_nsoft_g-1; j>=0 && !path->soft; --j) { + void *cdata = NULL; + + if (path->src->type != H5T_soft_g[j].src || + path->dst->type != H5T_soft_g[j].dst) { + continue; + } + /* + * Conversion functions are app-level, so temporarily create + * object id's for the data types. + */ + if ((src_id = H5A_register(H5_DATATYPE, H5T_copy(path->src))) < 0 || - (dst_id = H5A_register(H5_DATATYPE, + (dst_id = H5A_register(H5_DATATYPE, H5T_copy(path->dst))) < 0) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, - "unable to register conv types for query"); - } - if ((H5T_soft_g[j].func) (src_id, dst_id, 0, NULL, NULL) >= 0) { - path->soft = H5T_soft_g[j].func; - } - H5A_dec_ref(src_id); - H5A_dec_ref(dst_id); - H5ECLEAR; - } - } + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, + "unable to register conv types for query"); + } + if ((H5T_soft_g[j].func)(src_id, dst_id, &cdata, 0, + NULL, NULL) >= 0) { + path->soft = H5T_soft_g[j].func; + path->cdata = cdata; + } + H5A_dec_ref(src_id); + H5A_dec_ref(dst_id); + H5ECLEAR; + } + } } FUNC_LEAVE(SUCCEED); } - + /*------------------------------------------------------------------------- - * Function: H5Tfind + * Function: H5Tfind * - * Purpose: Finds a conversion function that can handle a conversion from - * type SRC_ID to type DST_ID. + * Purpose: Finds a conversion function that can handle a conversion from + * type SRC_ID to type DST_ID. The PCDATA argument is a pointer + * to a pointer to type conversion data which was created and + * initialized by the soft type conversion function of this path + * when the conversion function was installed on the path. * - * Return: Success: A pointer to a suitable conversion function. + * Return: Success: A pointer to a suitable conversion function. * - * Failure: NULL + * Failure: NULL * - * Programmer: Robb Matzke - * Tuesday, January 13, 1998 + * Programmer: Robb Matzke + * Tuesday, January 13, 1998 * * Modifications: * *------------------------------------------------------------------------- */ H5T_conv_t -H5Tfind(hid_t src_id, hid_t dst_id) +H5Tfind(hid_t src_id, hid_t dst_id, void **pcdata) { - H5T_conv_t ret_value = NULL; - H5T_t *src = NULL, *dst = NULL; + H5T_conv_t ret_value = NULL; + H5T_t *src = NULL, *dst = NULL; FUNC_ENTER(H5Tfind, NULL); /* Check args */ if (H5_DATATYPE != H5A_group(src_id) || - NULL == (src = H5A_object(src_id)) || - H5_DATATYPE != H5A_group(dst_id) || - NULL == (dst = H5A_object(dst_id))) { - HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type"); + NULL == (src = H5A_object(src_id)) || + H5_DATATYPE != H5A_group(dst_id) || + NULL == (dst = H5A_object(dst_id))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type"); + } + if (!pcdata) { + HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, NULL, + "no address to receive cdata pointer"); } + /* Find it */ - if (NULL == (ret_value = H5T_find(src, dst))) { - HRETURN_ERROR(H5E_DATATYPE, H5E_NOTFOUND, NULL, - "conversion function not found"); + *pcdata = NULL; + if (NULL == (ret_value = H5T_find(src, dst, pcdata))) { + HRETURN_ERROR(H5E_DATATYPE, H5E_NOTFOUND, NULL, + "conversion function not found"); } FUNC_LEAVE(ret_value); } @@ -2289,29 +2310,29 @@ H5Tfind(hid_t src_id, hid_t dst_id) * API functions are above; library-private functions are below... *------------------------------------------------------------------------- */ - + /*------------------------------------------------------------------------- - * Function: H5T_create + * Function: H5T_create * - * Purpose: Creates a new data type and initializes it to reasonable - * values. The new data type is SIZE bytes and an instance of - * the class TYPE. + * Purpose: Creates a new data type and initializes it to reasonable + * values. The new data type is SIZE bytes and an instance of + * the class TYPE. * - * Return: Success: Pointer to the new type. + * Return: Success: Pointer to the new type. * - * Failure: NULL + * Failure: NULL * - * Programmer: Robb Matzke - * Friday, December 5, 1997 + * Programmer: Robb Matzke + * Friday, December 5, 1997 * * Modifications: * *------------------------------------------------------------------------- */ -H5T_t * +H5T_t * H5T_create(H5T_class_t type, size_t size) { - H5T_t *dt = NULL; + H5T_t *dt = NULL; FUNC_ENTER(H5T_create, NULL); @@ -2324,17 +2345,17 @@ H5T_create(H5T_class_t type, size_t size) case H5T_STRING: case H5T_BITFIELD: case H5T_OPAQUE: - HRETURN_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, NULL, - "type class is not appropriate - use H5Tcopy()"); + HRETURN_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, NULL, + "type class is not appropriate - use H5Tcopy()"); case H5T_COMPOUND: - dt = H5MM_xcalloc(1, sizeof(H5T_t)); - dt->type = type; - break; + dt = H5MM_xcalloc(1, sizeof(H5T_t)); + dt->type = type; + break; default: - HRETURN_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, NULL, - "unknown data type class"); + HRETURN_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, NULL, + "unknown data type class"); } dt->size = size; @@ -2342,28 +2363,28 @@ H5T_create(H5T_class_t type, size_t size) } /*------------------------------------------------------------------------- - * Function: H5T_copy + * Function: H5T_copy * - * Purpose: Copies datatype OLD_DT. The resulting data type is not - * locked. + * Purpose: Copies datatype OLD_DT. The resulting data type is not + * locked. * - * Return: Success: Pointer to a new copy of the OLD_DT argument. + * Return: Success: Pointer to a new copy of the OLD_DT argument. * - * Failure: NULL + * Failure: NULL * - * Programmer: Robb Matzke - * Thursday, December 4, 1997 + * Programmer: Robb Matzke + * Thursday, December 4, 1997 * * Modifications: * *------------------------------------------------------------------------- */ -H5T_t * +H5T_t * H5T_copy(const H5T_t *old_dt) { - H5T_t *new_dt = NULL; - intn i; - char *s; + H5T_t *new_dt = NULL; + intn i; + char *s; FUNC_ENTER(H5T_copy, NULL); @@ -2376,29 +2397,29 @@ H5T_copy(const H5T_t *old_dt) new_dt->locked = FALSE; if (H5T_COMPOUND == new_dt->type) { - new_dt->u.compnd.memb = H5MM_xmalloc(new_dt->u.compnd.nmembs * - sizeof(H5T_member_t)); - HDmemcpy(new_dt->u.compnd.memb, old_dt->u.compnd.memb, - new_dt->u.compnd.nmembs * sizeof(H5T_member_t)); - for (i = 0; i < new_dt->u.compnd.nmembs; i++) { - s = new_dt->u.compnd.memb[i].name; - new_dt->u.compnd.memb[i].name = H5MM_xstrdup(s); - } + new_dt->u.compnd.memb = H5MM_xmalloc(new_dt->u.compnd.nmembs * + sizeof(H5T_member_t)); + HDmemcpy(new_dt->u.compnd.memb, old_dt->u.compnd.memb, + new_dt->u.compnd.nmembs * sizeof(H5T_member_t)); + for (i = 0; i < new_dt->u.compnd.nmembs; i++) { + s = new_dt->u.compnd.memb[i].name; + new_dt->u.compnd.memb[i].name = H5MM_xstrdup(s); + } } FUNC_LEAVE(new_dt); } /*------------------------------------------------------------------------- - * Function: H5T_close + * Function: H5T_close * - * Purpose: Frees a data type and all associated memory. + * Purpose: Frees a data type and all associated memory. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Monday, December 8, 1997 + * Programmer: Robb Matzke + * Monday, December 8, 1997 * * Modifications: * @@ -2407,7 +2428,7 @@ H5T_copy(const H5T_t *old_dt) herr_t H5T_close(H5T_t *dt) { - intn i; + intn i; FUNC_ENTER(H5T_close, FAIL); @@ -2415,29 +2436,29 @@ H5T_close(H5T_t *dt) assert(!dt->locked); if (dt && H5T_COMPOUND == dt->type) { - for (i = 0; i < dt->u.compnd.nmembs; i++) { - H5MM_xfree(dt->u.compnd.memb[i].name); - } - H5MM_xfree(dt->u.compnd.memb); - H5MM_xfree(dt); + for (i = 0; i < dt->u.compnd.nmembs; i++) { + H5MM_xfree(dt->u.compnd.memb[i].name); + } + H5MM_xfree(dt->u.compnd.memb); + H5MM_xfree(dt); } else if (dt) { - H5MM_xfree(dt); + H5MM_xfree(dt); } FUNC_LEAVE(SUCCEED); } /*------------------------------------------------------------------------- - * Function: H5T_is_atomic + * Function: H5T_is_atomic * - * Purpose: Determines if a data type is an atomic type. + * Purpose: Determines if a data type is an atomic type. * - * Return: Success: TRUE, FALSE + * Return: Success: TRUE, FALSE * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -2454,18 +2475,18 @@ H5T_is_atomic(const H5T_t *dt) } /*------------------------------------------------------------------------- - * Function: H5T_get_size + * Function: H5T_get_size * - * Purpose: Determines the total size of a data type in bytes. + * Purpose: Determines the total size of a data type in bytes. * - * Return: Success: Size of the data type in bytes. The size of - * the data type is the size of an instance of - * that data type. + * Return: Success: Size of the data type in bytes. The size of + * the data type is the size of an instance of + * that data type. * - * Failure: 0 (valid data types are never zero size) + * Failure: 0 (valid data types are never zero size) * - * Programmer: Robb Matzke - * Tuesday, December 9, 1997 + * Programmer: Robb Matzke + * Tuesday, December 9, 1997 * * Modifications: * @@ -2483,19 +2504,19 @@ H5T_get_size(const H5T_t *dt) } /*------------------------------------------------------------------------- - * Function: H5T_insert + * Function: H5T_insert * - * Purpose: Adds a new MEMBER to the compound data type PARENT. The new - * member will have a NAME that is unique within PARENT and an - * instance of PARENT will have the member begin at byte offset - * OFFSET from the beginning. + * Purpose: Adds a new MEMBER to the compound data type PARENT. The new + * member will have a NAME that is unique within PARENT and an + * instance of PARENT will have the member begin at byte offset + * OFFSET from the beginning. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Monday, December 8, 1997 + * Programmer: Robb Matzke + * Monday, December 8, 1997 * * Modifications: * @@ -2504,8 +2525,8 @@ H5T_get_size(const H5T_t *dt) herr_t H5T_insert(H5T_t *parent, const char *name, off_t offset, const H5T_t *member) { - intn i; - H5T_t *tmp = NULL; + intn i; + H5T_t *tmp = NULL; FUNC_ENTER(H5T_insert, FAIL); @@ -2517,36 +2538,36 @@ H5T_insert(H5T_t *parent, const char *name, off_t offset, const H5T_t *member) /* Does NAME already exist in PARENT? */ for (i = 0; i < parent->u.compnd.nmembs; i++) { - if (!HDstrcmp(parent->u.compnd.memb[i].name, name)) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, - "member name is not unique"); - } + if (!HDstrcmp(parent->u.compnd.memb[i].name, name)) { + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, + "member name is not unique"); + } } /* Does the new member overlap any existing member ? */ for (i = 0; i < parent->u.compnd.nmembs; i++) { - if ((offset < parent->u.compnd.memb[i].offset && - offset + member->size > parent->u.compnd.memb[i].offset) || - (parent->u.compnd.memb[i].offset < offset && - parent->u.compnd.memb[i].offset + - parent->u.compnd.memb[i].type.size > offset)) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, - "member overlaps with another member"); - } + if ((offset < parent->u.compnd.memb[i].offset && + offset + member->size > parent->u.compnd.memb[i].offset) || + (parent->u.compnd.memb[i].offset < offset && + parent->u.compnd.memb[i].offset + + parent->u.compnd.memb[i].type.size > offset)) { + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, + "member overlaps with another member"); + } } /* Increase member array if necessary */ if (parent->u.compnd.nmembs >= parent->u.compnd.nalloc) { - parent->u.compnd.nalloc += H5T_COMPND_INC; - parent->u.compnd.memb = H5MM_xrealloc(parent->u.compnd.memb, - (parent->u.compnd.nalloc * - sizeof(H5T_member_t))); + parent->u.compnd.nalloc += H5T_COMPND_INC; + parent->u.compnd.memb = H5MM_xrealloc(parent->u.compnd.memb, + (parent->u.compnd.nalloc * + sizeof(H5T_member_t))); } /* Add member to end of member array */ i = parent->u.compnd.nmembs; parent->u.compnd.memb[i].name = H5MM_xstrdup(name); parent->u.compnd.memb[i].offset = offset; - parent->u.compnd.memb[i].ndims = 0; /*defaults to scalar */ + parent->u.compnd.memb[i].ndims = 0; /*defaults to scalar */ tmp = H5T_copy(member); parent->u.compnd.memb[i].type = *tmp; @@ -2557,17 +2578,17 @@ H5T_insert(H5T_t *parent, const char *name, off_t offset, const H5T_t *member) } /*------------------------------------------------------------------------- - * Function: H5T_pack + * Function: H5T_pack * - * Purpose: Recursively packs a compound data type by removing padding - * bytes. This is done in place (that is, destructively). + * Purpose: Recursively packs a compound data type by removing padding + * bytes. This is done in place (that is, destructively). * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -2576,8 +2597,8 @@ H5T_insert(H5T_t *parent, const char *name, off_t offset, const H5T_t *member) herr_t H5T_pack(H5T_t *dt) { - int i; - size_t offset; + int i; + size_t offset; FUNC_ENTER(H5T_pack, FAIL); @@ -2585,40 +2606,40 @@ H5T_pack(H5T_t *dt) assert(!dt->locked); if (H5T_COMPOUND == dt->type) { - /* Recursively pack the members */ - for (i = 0; i < dt->u.compnd.nmembs; i++) { - if (H5T_pack(&(dt->u.compnd.memb[i].type)) < 0) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, - "unable to pack part of a compound data type"); - } - } - - /* Remove padding between members */ - H5T_sort_by_offset(dt); - for (i = 0, offset = 0; i < dt->u.compnd.nmembs; i++) { - dt->u.compnd.memb[i].offset = offset; - offset += dt->u.compnd.memb[i].type.size; - } - - /* Change total size */ - dt->size = MAX(1, offset); + /* Recursively pack the members */ + for (i = 0; i < dt->u.compnd.nmembs; i++) { + if (H5T_pack(&(dt->u.compnd.memb[i].type)) < 0) { + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, + "unable to pack part of a compound data type"); + } + } + + /* Remove padding between members */ + H5T_sort_by_offset(dt); + for (i = 0, offset = 0; i < dt->u.compnd.nmembs; i++) { + dt->u.compnd.memb[i].offset = offset; + offset += dt->u.compnd.memb[i].type.size; + } + + /* Change total size */ + dt->size = MAX(1, offset); } FUNC_LEAVE(SUCCEED); } /*------------------------------------------------------------------------- - * Function: H5T_sort_by_offset + * Function: H5T_sort_by_offset * - * Purpose: Sorts the members of a compound data type by their offsets. - * This even works for locked data types since it doesn't change - * the value of the type. + * Purpose: Sorts the members of a compound data type by their offsets. + * This even works for locked data types since it doesn't change + * the value of the type. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -2627,8 +2648,8 @@ H5T_pack(H5T_t *dt) herr_t H5T_sort_by_offset(H5T_t *dt) { - int i, j, nmembs; - hbool_t swapped; + int i, j, nmembs; + hbool_t swapped; FUNC_ENTER(H5T_sort_by_offset, FAIL); @@ -2639,20 +2660,20 @@ H5T_sort_by_offset(H5T_t *dt) /* Use a bubble sort because we can short circuit */ nmembs = dt->u.compnd.nmembs; for (i=nmembs-1, swapped=TRUE; i>0 && swapped; --i) { - for (j=0, swapped=FALSE; j<i; j++) { - if (dt->u.compnd.memb[j].offset > dt->u.compnd.memb[j+1].offset) { - H5T_member_t tmp = dt->u.compnd.memb[j]; - dt->u.compnd.memb[j] = dt->u.compnd.memb[j+1]; - dt->u.compnd.memb[j+1] = tmp; - swapped = 1; - } - } + for (j=0, swapped=FALSE; j<i; j++) { + if (dt->u.compnd.memb[j].offset > dt->u.compnd.memb[j+1].offset) { + H5T_member_t tmp = dt->u.compnd.memb[j]; + dt->u.compnd.memb[j] = dt->u.compnd.memb[j+1]; + dt->u.compnd.memb[j+1] = tmp; + swapped = 1; + } + } } #ifndef NDEBUG /* I never trust a sort :-) */ for (i = 0; i < dt->u.compnd.nmembs - 1; i++) { - assert(dt->u.compnd.memb[i].offset < dt->u.compnd.memb[i + 1].offset); + assert(dt->u.compnd.memb[i].offset < dt->u.compnd.memb[i + 1].offset); } #endif @@ -2660,18 +2681,18 @@ H5T_sort_by_offset(H5T_t *dt) } /*------------------------------------------------------------------------- - * Function: H5T_cmp + * Function: H5T_cmp * - * Purpose: Compares two data types. + * Purpose: Compares two data types. * - * Return: Success: 0 if DT1 and DT2 are equal. - * <0 if DT1 is less than DT2. - * >0 if DT1 is greater than DT2. + * Return: Success: 0 if DT1 and DT2 are equal. + * <0 if DT1 is less than DT2. + * >0 if DT1 is greater than DT2. * - * Failure: 0, never fails + * Failure: 0, never fails * - * Programmer: Robb Matzke - * Wednesday, December 10, 1997 + * Programmer: Robb Matzke + * Wednesday, December 10, 1997 * * Modifications: * @@ -2680,10 +2701,10 @@ H5T_sort_by_offset(H5T_t *dt) intn H5T_cmp(const H5T_t *dt1, const H5T_t *dt2) { - intn *idx1 = NULL, *idx2 = NULL; - intn ret_value = 0; - intn i, j, tmp; - hbool_t swapped; + intn *idx1 = NULL, *idx2 = NULL; + intn ret_value = 0; + intn i, j, tmp; + hbool_t swapped; FUNC_ENTER(H5T_equal, 0); @@ -2692,230 +2713,210 @@ H5T_cmp(const H5T_t *dt1, const H5T_t *dt2) assert(dt2); /* the easy case */ - if (dt1 == dt2) - HGOTO_DONE(0); + if (dt1 == dt2) HGOTO_DONE(0); /* compare */ - if (dt1->type < dt2->type) - HGOTO_DONE(-1); - if (dt1->type > dt2->type) - HGOTO_DONE(1); + if (dt1->type < dt2->type) HGOTO_DONE(-1); + if (dt1->type > dt2->type) HGOTO_DONE(1); - if (dt1->size < dt2->size) - HGOTO_DONE(-1); - if (dt1->size > dt2->size) - HGOTO_DONE(1); + if (dt1->size < dt2->size) HGOTO_DONE(-1); + if (dt1->size > dt2->size) HGOTO_DONE(1); if (H5T_COMPOUND == dt1->type) { - /* - * Compound data types... - */ - if (dt1->u.compnd.nmembs < dt2->u.compnd.nmembs) - HGOTO_DONE(-1); - if (dt1->u.compnd.nmembs > dt2->u.compnd.nmembs) - HGOTO_DONE(1); - - /* Build an index for each type so the names are sorted */ - idx1 = H5MM_xmalloc(dt1->u.compnd.nmembs * sizeof(intn)); - idx2 = H5MM_xmalloc(dt1->u.compnd.nmembs * sizeof(intn)); - for (i = 0; i < dt1->u.compnd.nmembs; i++) - idx1[i] = idx2[i] = i; - for (i = dt1->u.compnd.nmembs - 1, swapped = TRUE; swapped && i >= 0; --i) { - for (j = 0, swapped = FALSE; j < i; j++) { - if (HDstrcmp(dt1->u.compnd.memb[idx1[j]].name, - dt1->u.compnd.memb[idx1[j + 1]].name) > 0) { - tmp = idx1[j]; - idx1[j] = idx1[j + 1]; - idx1[j + 1] = tmp; - swapped = TRUE; - } - } - } - for (i = dt1->u.compnd.nmembs - 1, swapped = TRUE; swapped && i >= 0; --i) { - for (j = 0, swapped = FALSE; j < i; j++) { - if (HDstrcmp(dt2->u.compnd.memb[idx2[j]].name, - dt2->u.compnd.memb[idx2[j + 1]].name) > 0) { - tmp = idx2[j]; - idx2[j] = idx2[j + 1]; - idx2[j + 1] = tmp; - swapped = TRUE; - } - } - } + /* + * Compound data types... + */ + if (dt1->u.compnd.nmembs < dt2->u.compnd.nmembs) HGOTO_DONE(-1); + if (dt1->u.compnd.nmembs > dt2->u.compnd.nmembs) HGOTO_DONE(1); + + /* Build an index for each type so the names are sorted */ + idx1 = H5MM_xmalloc(dt1->u.compnd.nmembs * sizeof(intn)); + idx2 = H5MM_xmalloc(dt1->u.compnd.nmembs * sizeof(intn)); + for (i=0; i<dt1->u.compnd.nmembs; i++) idx1[i] = idx2[i] = i; + for (i=dt1->u.compnd.nmembs-1, swapped=TRUE; swapped && i>=0; --i) { + for (j=0, swapped=FALSE; j<i; j++) { + if (HDstrcmp(dt1->u.compnd.memb[idx1[j]].name, + dt1->u.compnd.memb[idx1[j+1]].name) > 0) { + tmp = idx1[j]; + idx1[j] = idx1[j+1]; + idx1[j+1] = tmp; + swapped = TRUE; + } + } + } + for (i=dt2->u.compnd.nmembs-1, swapped=TRUE; swapped && i>=0; --i) { + for (j=0, swapped=FALSE; j<i; j++) { + if (HDstrcmp(dt2->u.compnd.memb[idx2[j]].name, + dt2->u.compnd.memb[idx2[j+1]].name) > 0) { + tmp = idx2[j]; + idx2[j] = idx2[j+1]; + idx2[j+1] = tmp; + swapped = TRUE; + } + } + } #ifndef NDEBUG - /* I don't quite trust the code above yet :-) --RPM */ - for (i = 0; i < dt1->u.compnd.nmembs; i++) { - assert(HDstrcmp(dt1->u.compnd.memb[idx1[i]].name, - dt1->u.compnd.memb[idx1[i + 1]].name)); - assert(HDstrcmp(dt2->u.compnd.memb[idx2[i]].name, - dt2->u.compnd.memb[idx2[i + 1]].name)); - } + /* I don't quite trust the code above yet :-) --RPM */ + for (i=0; i<dt1->u.compnd.nmembs-1; i++) { + assert(HDstrcmp(dt1->u.compnd.memb[idx1[i]].name, + dt1->u.compnd.memb[idx1[i + 1]].name)); + assert(HDstrcmp(dt2->u.compnd.memb[idx2[i]].name, + dt2->u.compnd.memb[idx2[i + 1]].name)); + } #endif - /* Compare the members */ - for (i = 0; i < dt1->u.compnd.nmembs; i++) { - tmp = HDstrcmp(dt1->u.compnd.memb[idx1[i]].name, - dt2->u.compnd.memb[idx2[i]].name); - if (tmp < 0) - HGOTO_DONE(-1); - if (tmp > 0) - HGOTO_DONE(1); - - if (dt1->u.compnd.memb[idx1[i]].offset < - dt2->u.compnd.memb[idx2[i]].offset) - HGOTO_DONE(-1); - if (dt1->u.compnd.memb[idx1[i]].offset > - dt2->u.compnd.memb[idx2[i]].offset) - HGOTO_DONE(1); - - if (dt1->u.compnd.memb[idx1[i]].ndims < - dt2->u.compnd.memb[idx2[i]].ndims) - HGOTO_DONE(-1); - if (dt1->u.compnd.memb[idx1[i]].ndims > - dt2->u.compnd.memb[idx2[i]].ndims) - HGOTO_DONE(1); - - for (j = 0; j < dt1->u.compnd.memb[idx1[i]].ndims; j++) { - if (dt1->u.compnd.memb[idx1[i]].dim[j] < - dt2->u.compnd.memb[idx2[i]].dim[j]) - HGOTO_DONE(-1); - if (dt1->u.compnd.memb[idx1[i]].dim[j] > - dt2->u.compnd.memb[idx2[i]].dim[j]) - HGOTO_DONE(1); - } - - for (j = 0; j < dt1->u.compnd.memb[idx1[i]].ndims; j++) { - if (dt1->u.compnd.memb[idx1[i]].perm[j] < - dt2->u.compnd.memb[idx2[i]].perm[j]) - HGOTO_DONE(-1); - if (dt1->u.compnd.memb[idx1[i]].perm[j] > - dt2->u.compnd.memb[idx2[i]].perm[j]) - HGOTO_DONE(1); - } - - tmp = H5T_cmp(&(dt1->u.compnd.memb[idx1[i]].type), - &(dt2->u.compnd.memb[idx2[i]].type)); - if (tmp < 0) - HGOTO_DONE(-1); - if (tmp > 0) - HGOTO_DONE(1); - } + /* Compare the members */ + for (i=0; i<dt1->u.compnd.nmembs; i++) { + tmp = HDstrcmp(dt1->u.compnd.memb[idx1[i]].name, + dt2->u.compnd.memb[idx2[i]].name); + if (tmp < 0) HGOTO_DONE(-1); + if (tmp > 0) HGOTO_DONE(1); + + if (dt1->u.compnd.memb[idx1[i]].offset < + dt2->u.compnd.memb[idx2[i]].offset) HGOTO_DONE(-1); + if (dt1->u.compnd.memb[idx1[i]].offset > + dt2->u.compnd.memb[idx2[i]].offset) HGOTO_DONE(1); + + if (dt1->u.compnd.memb[idx1[i]].ndims < + dt2->u.compnd.memb[idx2[i]].ndims) HGOTO_DONE(-1); + if (dt1->u.compnd.memb[idx1[i]].ndims > + dt2->u.compnd.memb[idx2[i]].ndims) HGOTO_DONE(1); + + for (j=0; j<dt1->u.compnd.memb[idx1[i]].ndims; j++) { + if (dt1->u.compnd.memb[idx1[i]].dim[j] < + dt2->u.compnd.memb[idx2[i]].dim[j]) HGOTO_DONE(-1); + if (dt1->u.compnd.memb[idx1[i]].dim[j] > + dt2->u.compnd.memb[idx2[i]].dim[j]) HGOTO_DONE(1); + } + + for (j=0; j<dt1->u.compnd.memb[idx1[i]].ndims; j++) { + if (dt1->u.compnd.memb[idx1[i]].perm[j] < + dt2->u.compnd.memb[idx2[i]].perm[j]) HGOTO_DONE(-1); + if (dt1->u.compnd.memb[idx1[i]].perm[j] > + dt2->u.compnd.memb[idx2[i]].perm[j]) HGOTO_DONE(1); + } + + tmp = H5T_cmp(&(dt1->u.compnd.memb[idx1[i]].type), + &(dt2->u.compnd.memb[idx2[i]].type)); + if (tmp < 0) HGOTO_DONE(-1); + if (tmp > 0) HGOTO_DONE(1); + } } else { - /* - * Atomic data types... - */ - if (dt1->u.atomic.order < dt2->u.atomic.order) - HGOTO_DONE(-1); - if (dt1->u.atomic.order > dt2->u.atomic.order) - HGOTO_DONE(1); - - if (dt1->u.atomic.prec < dt2->u.atomic.prec) - HGOTO_DONE(-1); - if (dt1->u.atomic.prec > dt2->u.atomic.prec) - HGOTO_DONE(1); - - if (dt1->u.atomic.offset < dt2->u.atomic.offset) - HGOTO_DONE(-1); - if (dt1->u.atomic.offset > dt2->u.atomic.offset) - HGOTO_DONE(1); - - if (dt1->u.atomic.lsb_pad < dt2->u.atomic.lsb_pad) - HGOTO_DONE(-1); - if (dt1->u.atomic.lsb_pad > dt2->u.atomic.lsb_pad) - HGOTO_DONE(1); - - if (dt1->u.atomic.msb_pad < dt2->u.atomic.msb_pad) - HGOTO_DONE(-1); - if (dt1->u.atomic.msb_pad > dt2->u.atomic.msb_pad) - HGOTO_DONE(1); - - switch (dt1->type) { - case H5T_INTEGER: - if (dt1->u.atomic.u.i.sign < dt2->u.atomic.u.i.sign) - HGOTO_DONE(-1); - if (dt1->u.atomic.u.i.sign > dt2->u.atomic.u.i.sign) - HGOTO_DONE(1); - break; - - case H5T_FLOAT: - if (dt1->u.atomic.u.f.sign < dt2->u.atomic.u.f.sign) - HGOTO_DONE(-1); - if (dt1->u.atomic.u.f.sign > dt2->u.atomic.u.f.sign) - HGOTO_DONE(1); - - if (dt1->u.atomic.u.f.epos < dt2->u.atomic.u.f.epos) - HGOTO_DONE(-1); - if (dt1->u.atomic.u.f.epos > dt2->u.atomic.u.f.epos) - HGOTO_DONE(1); - - if (dt1->u.atomic.u.f.esize < - dt2->u.atomic.u.f.esize) - HGOTO_DONE(-1); - if (dt1->u.atomic.u.f.esize > - dt2->u.atomic.u.f.esize) - HGOTO_DONE(1); - - if (dt1->u.atomic.u.f.ebias < - dt2->u.atomic.u.f.ebias) - HGOTO_DONE(-1); - if (dt1->u.atomic.u.f.ebias > - dt2->u.atomic.u.f.ebias) - HGOTO_DONE(1); - - if (dt1->u.atomic.u.f.mpos < dt2->u.atomic.u.f.mpos) - HGOTO_DONE(-1); - if (dt1->u.atomic.u.f.mpos > dt2->u.atomic.u.f.mpos) - HGOTO_DONE(1); - - if (dt1->u.atomic.u.f.msize < - dt2->u.atomic.u.f.msize) - HGOTO_DONE(-1); - if (dt1->u.atomic.u.f.msize > - dt2->u.atomic.u.f.msize) - HGOTO_DONE(1); - - if (dt1->u.atomic.u.f.norm < dt2->u.atomic.u.f.norm) - HGOTO_DONE(-1); - if (dt1->u.atomic.u.f.norm > dt2->u.atomic.u.f.norm) - HGOTO_DONE(1); - - if (dt1->u.atomic.u.f.pad < dt2->u.atomic.u.f.pad) - HGOTO_DONE(-1); - if (dt1->u.atomic.u.f.pad > dt2->u.atomic.u.f.pad) - HGOTO_DONE(1); - - break; - - case H5T_TIME: - /*void */ - break; - - case H5T_STRING: - if (dt1->u.atomic.u.s.cset < dt1->u.atomic.u.s.cset) - HGOTO_DONE(-1); - if (dt1->u.atomic.u.s.cset > dt1->u.atomic.u.s.cset) - HGOTO_DONE(1); - - if (dt1->u.atomic.u.s.pad < dt1->u.atomic.u.s.pad) - HGOTO_DONE(-1); - if (dt1->u.atomic.u.s.pad > dt1->u.atomic.u.s.pad) - HGOTO_DONE(1); - - break; - - case H5T_BITFIELD: - /*void */ - break; - - case H5T_OPAQUE: - /*void */ - break; - - default: - assert("not implemented yet" && 0); - } + /* + * Atomic data types... + */ + if (dt1->u.atomic.order < dt2->u.atomic.order) HGOTO_DONE(-1); + if (dt1->u.atomic.order > dt2->u.atomic.order) HGOTO_DONE(1); + + if (dt1->u.atomic.prec < dt2->u.atomic.prec) HGOTO_DONE(-1); + if (dt1->u.atomic.prec > dt2->u.atomic.prec) HGOTO_DONE(1); + + if (dt1->u.atomic.offset < dt2->u.atomic.offset) HGOTO_DONE(-1); + if (dt1->u.atomic.offset > dt2->u.atomic.offset) HGOTO_DONE(1); + + if (dt1->u.atomic.lsb_pad < dt2->u.atomic.lsb_pad) HGOTO_DONE(-1); + if (dt1->u.atomic.lsb_pad > dt2->u.atomic.lsb_pad) HGOTO_DONE(1); + + if (dt1->u.atomic.msb_pad < dt2->u.atomic.msb_pad) HGOTO_DONE(-1); + if (dt1->u.atomic.msb_pad > dt2->u.atomic.msb_pad) HGOTO_DONE(1); + + switch (dt1->type) { + case H5T_INTEGER: + if (dt1->u.atomic.u.i.sign < dt2->u.atomic.u.i.sign) { + HGOTO_DONE(-1); + } + if (dt1->u.atomic.u.i.sign > dt2->u.atomic.u.i.sign) { + HGOTO_DONE(1); + } + break; + + case H5T_FLOAT: + if (dt1->u.atomic.u.f.sign < dt2->u.atomic.u.f.sign) { + HGOTO_DONE(-1); + } + if (dt1->u.atomic.u.f.sign > dt2->u.atomic.u.f.sign) { + HGOTO_DONE(1); + } + + if (dt1->u.atomic.u.f.epos < dt2->u.atomic.u.f.epos) { + HGOTO_DONE(-1); + } + if (dt1->u.atomic.u.f.epos > dt2->u.atomic.u.f.epos) { + HGOTO_DONE(1); + } + + if (dt1->u.atomic.u.f.esize < + dt2->u.atomic.u.f.esize) HGOTO_DONE(-1); + if (dt1->u.atomic.u.f.esize > + dt2->u.atomic.u.f.esize) HGOTO_DONE(1); + + if (dt1->u.atomic.u.f.ebias < + dt2->u.atomic.u.f.ebias) HGOTO_DONE(-1); + if (dt1->u.atomic.u.f.ebias > + dt2->u.atomic.u.f.ebias) HGOTO_DONE(1); + + if (dt1->u.atomic.u.f.mpos < dt2->u.atomic.u.f.mpos) { + HGOTO_DONE(-1); + } + if (dt1->u.atomic.u.f.mpos > dt2->u.atomic.u.f.mpos) { + HGOTO_DONE(1); + } + + if (dt1->u.atomic.u.f.msize < + dt2->u.atomic.u.f.msize) HGOTO_DONE(-1); + if (dt1->u.atomic.u.f.msize > + dt2->u.atomic.u.f.msize) HGOTO_DONE(1); + + if (dt1->u.atomic.u.f.norm < dt2->u.atomic.u.f.norm) { + HGOTO_DONE(-1); + } + if (dt1->u.atomic.u.f.norm > dt2->u.atomic.u.f.norm) { + HGOTO_DONE(1); + } + + if (dt1->u.atomic.u.f.pad < dt2->u.atomic.u.f.pad) { + HGOTO_DONE(-1); + } + if (dt1->u.atomic.u.f.pad > dt2->u.atomic.u.f.pad) { + HGOTO_DONE(1); + } + + break; + + case H5T_TIME: + /*void */ + break; + + case H5T_STRING: + if (dt1->u.atomic.u.s.cset < dt1->u.atomic.u.s.cset) { + HGOTO_DONE(-1); + } + if (dt1->u.atomic.u.s.cset > dt1->u.atomic.u.s.cset) { + HGOTO_DONE(1); + } + + if (dt1->u.atomic.u.s.pad < dt1->u.atomic.u.s.pad) { + HGOTO_DONE(-1); + } + if (dt1->u.atomic.u.s.pad > dt1->u.atomic.u.s.pad) { + HGOTO_DONE(1); + } + + break; + + case H5T_BITFIELD: + /*void */ + break; + + case H5T_OPAQUE: + /*void */ + break; + + default: + assert("not implemented yet" && 0); + } } done: @@ -2924,85 +2925,91 @@ H5T_cmp(const H5T_t *dt1, const H5T_t *dt2) FUNC_LEAVE(ret_value); } - + /*------------------------------------------------------------------------- - * Function: H5T_find + * Function: H5T_find * - * Purpose: Finds a conversion function for the specified path. + * Purpose: Finds a conversion function for the specified path. * - * Return: Success: A pointer to an appropriate conversion - * function. + * Return: Success: A pointer to an appropriate conversion + * function. The PCDATA argument is initialized + * to point to type conversion data which should + * be passed to the type conversion function. * - * Failure: NULL + * Failure: NULL * - * Programmer: Robb Matzke - * Wednesday, January 14, 1998 + * Programmer: Robb Matzke + * Wednesday, January 14, 1998 * * Modifications: * *------------------------------------------------------------------------- */ H5T_conv_t -H5T_find(const H5T_t *src, const H5T_t *dst) +H5T_find(const H5T_t *src, const H5T_t *dst, void **pcdata) { - H5T_path_t *path = NULL; - H5T_conv_t ret_value = NULL; + H5T_path_t *path = NULL; + H5T_conv_t ret_value = NULL; FUNC_ENTER(H5T_find, NULL); /* Check args */ assert(src); assert(dst); + assert (pcdata); /* No-op case */ - if (0 == H5T_cmp(src, dst)) - HRETURN(H5T_conv_noop); + if (0 == H5T_cmp(src, dst)) HRETURN(H5T_conv_noop); /* Find it */ if (NULL == (path = H5T_path_find(src, dst, TRUE))) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, - "unable to create conversion path"); + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, + "unable to create conversion path"); } - ret_value = path->hard; - if (!ret_value) - ret_value = path->soft; - if (!ret_value) { - HRETURN_ERROR(H5E_DATATYPE, H5E_NOTFOUND, NULL, - "no conversion function for that path"); + if (path->hard) { + ret_value = path->hard; + *pcdata = NULL; + } else if (path->soft) { + ret_value = path->soft; + *pcdata = path->cdata; + } else { + HRETURN_ERROR(H5E_DATATYPE, H5E_NOTFOUND, NULL, + "no conversion function for that path"); } + FUNC_LEAVE(ret_value); } - + /*------------------------------------------------------------------------- - * Function: H5T_path_find + * Function: H5T_path_find * - * Purpose: Finds the path which converts type SRC_ID to type DST_ID. If - * the path isn't found and CREATE is non-zero then a new path - * is created. + * Purpose: Finds the path which converts type SRC_ID to type DST_ID. If + * the path isn't found and CREATE is non-zero then a new path + * is created. * - * Return: Success: Pointer to the path, valid until the path - * database is modified. + * Return: Success: Pointer to the path, valid until the path + * database is modified. * - * Failure: NULL + * Failure: NULL * - * Programmer: Robb Matzke - * Tuesday, January 13, 1998 + * Programmer: Robb Matzke + * Tuesday, January 13, 1998 * * Modifications: * *------------------------------------------------------------------------- */ -H5T_path_t * +H5T_path_t * H5T_path_find(const H5T_t *src, const H5T_t *dst, hbool_t create) { - intn lt = 0; /*left edge (inclusive) */ - intn rt = H5T_npath_g; /*right edge (exclusive) */ - intn md = 0; /*middle */ - intn cmp = -1; /*comparison result */ - H5T_path_t *path = NULL; /*path found */ - int i; - hid_t src_id, dst_id; + intn lt = 0; /*left edge (inclusive) */ + intn rt = H5T_npath_g; /*right edge (exclusive) */ + intn md = 0; /*middle */ + intn cmp = -1; /*comparison result */ + H5T_path_t *path = NULL; /*path found */ + int i; + hid_t src_id, dst_id; FUNC_ENTER(H5T_path_find, NULL); @@ -3012,74 +3019,76 @@ H5T_path_find(const H5T_t *src, const H5T_t *dst, hbool_t create) /* Binary search */ while (lt < rt) { - md = (lt + rt) / 2; + md = (lt + rt) / 2; - cmp = H5T_cmp(src, H5T_path_g[md].src); - if (0 == cmp) - cmp = H5T_cmp(dst, H5T_path_g[md].dst); + cmp = H5T_cmp(src, H5T_path_g[md].src); + if (0 == cmp) cmp = H5T_cmp(dst, H5T_path_g[md].dst); - if (cmp < 0) { - rt = md; - } else if (cmp > 0) { - lt = md + 1; - } else { - HRETURN(H5T_path_g + md); - } + if (cmp < 0) { + rt = md; + } else if (cmp > 0) { + lt = md + 1; + } else { + HRETURN(H5T_path_g + md); + } } /* Insert */ if (create) { - if (H5T_npath_g >= H5T_apath_g) { - H5T_apath_g = MAX(64, 2 * H5T_apath_g); - H5T_path_g = H5MM_xrealloc(H5T_path_g, - H5T_apath_g * sizeof(H5T_path_t)); - } - if (cmp > 0) - md++; - - /* make room */ - HDmemmove(H5T_path_g + md + 1, H5T_path_g + md, - (H5T_npath_g - md) * sizeof(H5T_path_t)); - H5T_npath_g++; - - /* insert */ - path = H5T_path_g + md; - HDmemset(path, 0, sizeof(H5T_path_t)); - path->src = H5T_copy(src); - path->dst = H5T_copy(dst); - - /* Locate soft function */ - for (i = H5T_nsoft_g - 1; i >= 0 && !path->soft; --i) { - if (src->type != H5T_soft_g[i].src || dst->type != H5T_soft_g[i].dst) { - continue; - } - if ((src_id=H5A_register(H5_DATATYPE, H5T_copy(path->src))) < 0 || - (dst_id=H5A_register(H5_DATATYPE, H5T_copy(path->dst))) < 0) { - HRETURN_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, - "unable to register conv types for query"); - } - if ((H5T_soft_g[i].func) (src_id, dst_id, 0, NULL, NULL) >= 0) { - path->soft = H5T_soft_g[i].func; - } - H5A_dec_ref(src_id); - H5A_dec_ref(dst_id); - H5ECLEAR; - } + if (H5T_npath_g >= H5T_apath_g) { + H5T_apath_g = MAX(64, 2 * H5T_apath_g); + H5T_path_g = H5MM_xrealloc(H5T_path_g, + H5T_apath_g * sizeof(H5T_path_t)); + } + if (cmp > 0) md++; + + /* make room */ + HDmemmove(H5T_path_g + md + 1, H5T_path_g + md, + (H5T_npath_g - md) * sizeof(H5T_path_t)); + H5T_npath_g++; + + /* insert */ + path = H5T_path_g + md; + HDmemset(path, 0, sizeof(H5T_path_t)); + path->src = H5T_copy(src); + path->dst = H5T_copy(dst); + + /* Locate soft function */ + for (i=H5T_nsoft_g-1; i>=0 && !path->soft; --i) { + void *cdata = NULL; + if (src->type!=H5T_soft_g[i].src || + dst->type!=H5T_soft_g[i].dst) { + continue; + } + if ((src_id=H5A_register(H5_DATATYPE, H5T_copy(path->src))) < 0 || + (dst_id=H5A_register(H5_DATATYPE, H5T_copy(path->dst))) < 0) { + HRETURN_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, + "unable to register conv types for query"); + } + if ((H5T_soft_g[i].func) (src_id, dst_id, &cdata, 0, + NULL, NULL) >= 0) { + path->soft = H5T_soft_g[i].func; + path->cdata = cdata; + } + H5A_dec_ref(src_id); + H5A_dec_ref(dst_id); + H5ECLEAR; + } } FUNC_LEAVE(path); } /*------------------------------------------------------------------------- - * Function: H5T_debug + * Function: H5T_debug * - * Purpose: Prints information about a data type. + * Purpose: Prints information about a data type. * - * Return: Success: SUCCEED + * Return: Success: SUCCEED * - * Failure: FAIL + * Failure: FAIL * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 + * Programmer: Robb Matzke + * Wednesday, January 7, 1998 * * Modifications: * @@ -3088,9 +3097,9 @@ H5T_path_find(const H5T_t *src, const H5T_t *dst, hbool_t create) herr_t H5T_debug(H5T_t *dt, FILE * stream) { - const char *s = ""; - int i, j; - uint64 tmp; + const char *s = ""; + int i, j; + uint64 tmp; FUNC_ENTER(H5T_debug, FAIL); @@ -3100,134 +3109,134 @@ H5T_debug(H5T_t *dt, FILE * stream) switch (dt->type) { case H5T_INTEGER: - s = "int"; - break; + s = "int"; + break; case H5T_FLOAT: - s = "float"; - break; + s = "float"; + break; case H5T_TIME: - s = "time"; - break; + s = "time"; + break; case H5T_STRING: - s = "str"; - break; + s = "str"; + break; case H5T_BITFIELD: - s = "bits"; - break; + s = "bits"; + break; case H5T_OPAQUE: - s = "opaque"; - break; + s = "opaque"; + break; case H5T_COMPOUND: - s = "struct"; - break; + s = "struct"; + break; default: - s = ""; - break; + s = ""; + break; } fprintf(stream, "%s%s {nbytes=%d", - s, dt->locked ? "[!]" : "", dt->size); + s, dt->locked ? "[!]" : "", dt->size); if (H5T_is_atomic(dt)) { - switch (dt->u.atomic.order) { - case H5T_ORDER_BE: - s = "BE"; - break; - case H5T_ORDER_LE: - s = "LE"; - break; - case H5T_ORDER_VAX: - s = "VAX"; - break; - case H5T_ORDER_NONE: - s = "NONE"; - break; - default: - s = "order?"; - break; - } - fprintf(stream, ", %s", s); - - if (dt->u.atomic.offset) { - fprintf(stream, ", offset=%lu", - (unsigned long) (dt->u.atomic.offset)); - } - if (dt->u.atomic.prec != 8 * dt->size) { - fprintf(stream, ", prec=%lu", - (unsigned long) (dt->u.atomic.prec)); - } - switch (dt->type) { - case H5T_INTEGER: - switch (dt->u.atomic.u.i.sign) { - case H5T_SGN_NONE: - s = "unsigned"; - break; - case H5T_SGN_2: - s = NULL; - break; - default: - s = "sign?"; - break; - } - if (s) - fprintf(stream, ", %s", s); - break; - - case H5T_FLOAT: - switch (dt->u.atomic.u.f.norm) { - case H5T_NORM_IMPLIED: - s = "implied"; - break; - case H5T_NORM_MSBSET: - s = "msbset"; - break; - case H5T_NORM_NONE: - s = "no-norm"; - break; - default: - s = "norm?"; - break; - } - fprintf(stream, ", sign=%lu+1", - (unsigned long) (dt->u.atomic.u.f.sign)); - fprintf(stream, ", mant=%lu+%lu (%s)", - (unsigned long) (dt->u.atomic.u.f.mpos), - (unsigned long) (dt->u.atomic.u.f.msize), s); - fprintf(stream, ", exp=%lu+%lu", - (unsigned long) (dt->u.atomic.u.f.epos), - (unsigned long) (dt->u.atomic.u.f.esize)); - tmp = dt->u.atomic.u.f.ebias >> 32; - if (tmp) { - uintn hi = tmp; - uintn lo = dt->u.atomic.u.f.ebias & 0xffffffff; - fprintf(stream, " bias=0x%08x%08x", hi, lo); - } else { - uintn lo = dt->u.atomic.u.f.ebias & 0xffffffff; - fprintf(stream, " bias=0x%08x", lo); - } - break; - - default: - /* No additional info */ - break; - } + switch (dt->u.atomic.order) { + case H5T_ORDER_BE: + s = "BE"; + break; + case H5T_ORDER_LE: + s = "LE"; + break; + case H5T_ORDER_VAX: + s = "VAX"; + break; + case H5T_ORDER_NONE: + s = "NONE"; + break; + default: + s = "order?"; + break; + } + fprintf(stream, ", %s", s); + + if (dt->u.atomic.offset) { + fprintf(stream, ", offset=%lu", + (unsigned long) (dt->u.atomic.offset)); + } + if (dt->u.atomic.prec != 8 * dt->size) { + fprintf(stream, ", prec=%lu", + (unsigned long) (dt->u.atomic.prec)); + } + switch (dt->type) { + case H5T_INTEGER: + switch (dt->u.atomic.u.i.sign) { + case H5T_SGN_NONE: + s = "unsigned"; + break; + case H5T_SGN_2: + s = NULL; + break; + default: + s = "sign?"; + break; + } + if (s) + fprintf(stream, ", %s", s); + break; + + case H5T_FLOAT: + switch (dt->u.atomic.u.f.norm) { + case H5T_NORM_IMPLIED: + s = "implied"; + break; + case H5T_NORM_MSBSET: + s = "msbset"; + break; + case H5T_NORM_NONE: + s = "no-norm"; + break; + default: + s = "norm?"; + break; + } + fprintf(stream, ", sign=%lu+1", + (unsigned long) (dt->u.atomic.u.f.sign)); + fprintf(stream, ", mant=%lu+%lu (%s)", + (unsigned long) (dt->u.atomic.u.f.mpos), + (unsigned long) (dt->u.atomic.u.f.msize), s); + fprintf(stream, ", exp=%lu+%lu", + (unsigned long) (dt->u.atomic.u.f.epos), + (unsigned long) (dt->u.atomic.u.f.esize)); + tmp = dt->u.atomic.u.f.ebias >> 32; + if (tmp) { + uintn hi = tmp; + uintn lo = dt->u.atomic.u.f.ebias & 0xffffffff; + fprintf(stream, " bias=0x%08x%08x", hi, lo); + } else { + uintn lo = dt->u.atomic.u.f.ebias & 0xffffffff; + fprintf(stream, " bias=0x%08x", lo); + } + break; + + default: + /* No additional info */ + break; + } } else { - for (i = 0; i < dt->u.compnd.nmembs; i++) { - fprintf(stream, "\n\"%s\" @%lu", - dt->u.compnd.memb[i].name, - (unsigned long) (dt->u.compnd.memb[i].offset)); - if (dt->u.compnd.memb[i].ndims) { - fprintf(stream, "["); - for (j = 0; j < dt->u.compnd.memb[i].ndims; j++) { - fprintf(stream, "%s%d", j ? ", " : "", - dt->u.compnd.memb[i].dim[j]); - } - fprintf(stream, "]"); - } - fprintf(stream, " "); - H5T_debug(&(dt->u.compnd.memb[i].type), stream); - } - fprintf(stream, "\n"); + for (i = 0; i < dt->u.compnd.nmembs; i++) { + fprintf(stream, "\n\"%s\" @%lu", + dt->u.compnd.memb[i].name, + (unsigned long) (dt->u.compnd.memb[i].offset)); + if (dt->u.compnd.memb[i].ndims) { + fprintf(stream, "["); + for (j = 0; j < dt->u.compnd.memb[i].ndims; j++) { + fprintf(stream, "%s%d", j ? ", " : "", + dt->u.compnd.memb[i].dim[j]); + } + fprintf(stream, "]"); + } + fprintf(stream, " "); + H5T_debug(&(dt->u.compnd.memb[i].type), stream); + } + fprintf(stream, "\n"); } fprintf(stream, "}"); diff --git a/src/H5Tconv.c b/src/H5Tconv.c index ff612ba..48d45ef 100644 --- a/src/H5Tconv.c +++ b/src/H5Tconv.c @@ -36,8 +36,8 @@ static intn interface_initialize_g = FALSE; *------------------------------------------------------------------------- */ herr_t -H5T_conv_noop(hid_t src_id, hid_t dst_id, size_t nelmts, - void *buf, const void *background) +H5T_conv_noop(hid_t src_id, hid_t dst_id, void **pcdata, size_t nelmts, + void *buf, void *background) { FUNC_ENTER(H5T_conv_noop, FAIL); FUNC_LEAVE(SUCCEED); @@ -63,8 +63,8 @@ H5T_conv_noop(hid_t src_id, hid_t dst_id, size_t nelmts, *------------------------------------------------------------------------- */ herr_t -H5T_conv_order(hid_t src_id, hid_t dst_id, size_t nelmts, - void *_buf, const void *background) +H5T_conv_order(hid_t src_id, hid_t dst_id, void **pcdata, size_t nelmts, + void *_buf, void *background) { uint8 *buf = (uint8 *) _buf; uint8 tmp; @@ -81,10 +81,6 @@ H5T_conv_order(hid_t src_id, hid_t dst_id, size_t nelmts, NULL == (dst = H5A_object(dst_id))) { HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); } - if (background) { - HRETURN_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, - "background values not supported in this conv path"); - } if (!buf) { /* Capability query */ @@ -123,6 +119,7 @@ H5T_conv_order(hid_t src_id, hid_t dst_id, size_t nelmts, } HRETURN(SUCCEED); } + /* The conversion */ md = src->size / 2; for (i = 0; i < nelmts; i++, buf += src->size) { @@ -166,15 +163,26 @@ H5T_conv_order(hid_t src_id, hid_t dst_id, size_t nelmts, *------------------------------------------------------------------------- */ herr_t -H5T_conv_struct(hid_t src_id, hid_t dst_id, size_t nelmts, - void *_buf, const void *background) +H5T_conv_struct(hid_t src_id, hid_t dst_id, void **_pcdata, size_t nelmts, + void *_buf, void *_bkg) { + H5T_conv_struct_t **pcdata = (H5T_conv_struct_t **)_pcdata; uint8 *buf = (uint8 *)_buf; /*cast for pointer arithmetic */ + uint8 *bkg = (uint8 *)_bkg; /*background pointer arithmetic */ H5T_t *src = NULL; /*source data type */ H5T_t *dst = NULL; /*destination data type */ - intn *dst2src_map = NULL; /*maps dst member to src member */ - intn i; - + H5T_t *type = NULL; /*temporary type pointer */ + hid_t tid; /*temporary type ID */ + intn *src2dst = NULL; /*maps src member to dst member */ + H5T_member_t *src_memb = NULL; /*source struct member descript.*/ + H5T_member_t *dst_memb = NULL; /*destination struct memb desc. */ + H5T_conv_t tconv_func = NULL; /*member data type conv. func. */ + size_t offset; /*byte offset wrt struct */ + size_t src_delta, dst_delta; /*source & destination stride */ + intn elmtno, i, j; /*counters */ + void *memb_cdata = NULL; /*member conversion data */ + herr_t ret_value = FAIL; + FUNC_ENTER (H5T_conv_struct, FAIL); /* Check args */ @@ -184,64 +192,186 @@ H5T_conv_struct(hid_t src_id, hid_t dst_id, size_t nelmts, NULL == (dst = H5A_object(dst_id))) { HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); } - if (background) { - HRETURN_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, - "background values not supported in this conv path"); - } /* Capability query? */ if (!buf) { assert (H5T_COMPOUND==src->type); assert (H5T_COMPOUND==dst->type); - HRETURN (SUCCEED); - } - /* - * Build a mapping from destination member number to source member number - */ - H5T_sort_by_offset (src); - H5T_sort_by_offset (dst); - dst2src_map = H5MM_xmalloc (dst->u.compnd.nmembs * sizeof(intn)); - for (i=0; i<src->u.compnd.nmembs; i++) { - } +#ifndef LATER + /* + * Struct members must be scalar for now. + */ + for (i=0; i<src->u.compnd.nmembs; i++) { + assert (0==src->u.compnd.memb[i].ndims); + } + for (i=0; i<dst->u.compnd.nmembs; i++) { + assert (0==dst->u.compnd.memb[i].ndims); + } +#endif + /* + * Okay, we've determined that this conversion function applies to + * the data types supplied as arguments. Now we build information + * which is expensive to calculate but is constant for all + * conversions from SRC_ID to DST_ID. Notice: the thing marked with + * `!' really is `dst' and not `src' because we're only interested in + * the members of the source type that are also in the destination + * type. + */ + assert (pcdata); + *pcdata = H5MM_xcalloc (1, sizeof(H5T_conv_struct_t)); + src2dst = H5MM_xmalloc (src->u.compnd.nmembs * sizeof(intn)); + (*pcdata)->src2dst = src2dst; + (*pcdata)->src_memb_id = H5MM_xmalloc (/*!*/dst->u.compnd.nmembs * + sizeof(hid_t)); + (*pcdata)->dst_memb_id = H5MM_xmalloc (dst->u.compnd.nmembs * + sizeof(hid_t)); + /* + * Insure that members are sorted. + */ + H5T_sort_by_offset (src); + H5T_sort_by_offset (dst); - /* - * For each source member which will be present in the destination, - * convert the member to the destination type unless it is larger than - * the source type. Then move the member to the left-most unoccupied - * position in the buffer. This makes the data point as small as - * possible with all the free space on the right side. - */ - for (i=0; i<src->u.compnd.nmembs; i++) { - } + /* + * Build a mapping from source member number to destination member + * number. If some source member is not a destination member then that + * mapping element will be negative. Also create atoms for each + * source and destination member data type so we can look up the + * member data type conversion functions later. + */ + for (i=0; i<src->u.compnd.nmembs; i++) { + src2dst[i] = -1; + for (j=0; j<dst->u.compnd.nmembs; j++) { + if (!HDstrcmp (src->u.compnd.memb[i].name, + dst->u.compnd.memb[j].name)) { + src2dst[i] = j; + break; + } + } + if (src2dst[i]>=0) { + type = &(src->u.compnd.memb[i].type); + tid = H5A_register (H5_DATATYPE, type); + assert (tid>=0); + (*pcdata)->src_memb_id[i] = tid; + type = &(dst->u.compnd.memb[src2dst[i]].type); + tid = H5A_register (H5_DATATYPE, type); + assert (tid>=0); + (*pcdata)->dst_memb_id[i] = tid; + } + } + + + HRETURN (SUCCEED); + } /* - * For each source member which will be present in the destination, - * convert the member to the destination type if it is larger than the - * source type (that is, has not been converted yet). Then copy the - * member to the destination offset in the background buffer. + * Here comes the real conversion... */ - for (i=src->u.compnd.nmembs-1; i>=0; --i) { - } + assert (pcdata && *pcdata); + assert ((*pcdata)->src2dst); + assert ((*pcdata)->src_memb_id); + assert ((*pcdata)->dst_memb_id); - /* - * Copy the background buffer back into the in-place conversion buffer. + * Insure that members are sorted. */ - HDmemcpy (buf, background, dst->size); + H5T_sort_by_offset (src); + H5T_sort_by_offset (dst); + src2dst = (*pcdata)->src2dst; + /* + * Direction of conversion. + */ + if (dst->size <= src->size) { + src_delta = src->size; + dst_delta = dst->size; + } else { + src_delta = -(src->size); + dst_delta = -(dst->size); + buf += (nelmts-1) * src->size; + bkg += (nelmts-1) * dst->size; + } + for (elmtno=0; elmtno<nelmts; elmtno++) { + /* + * For each source member which will be present in the destination, + * convert the member to the destination type unless it is larger than + * the source type. Then move the member to the left-most unoccupied + * position in the buffer. This makes the data point as small as + * possible with all the free space on the right side. + */ + for (i=0, offset=0; i<src->u.compnd.nmembs; i++) { + if (src2dst[i]<0) continue; + src_memb = src->u.compnd.memb + i; + dst_memb = dst->u.compnd.memb + src2dst[i]; + + if (dst_memb->type.size <= src_memb->type.size) { + tconv_func = H5T_find (&(dst_memb->type), &(src_memb->type), + &memb_cdata); + if (!tconv_func) { + HGOTO_ERROR (H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unable to convert member data type"); + } + (tconv_func)((*pcdata)->src_memb_id[i], + (*pcdata)->dst_memb_id[i], &memb_cdata, 1, + buf + src_memb->offset, bkg + dst_memb->offset); + HDmemmove (buf + offset, buf + src_memb->offset, + dst_memb->type.size); + offset += dst_memb->type.size; + } else { + HDmemmove (buf + offset, buf + src_memb->offset, + src_memb->type.size); + offset += src_memb->type.size; + } + } + /* + * For each source member which will be present in the destination, + * convert the member to the destination type if it is larger than the + * source type (that is, has not been converted yet). Then copy the + * member to the destination offset in the background buffer. + */ + for (i=src->u.compnd.nmembs-1; i>=0; --i) { + if (src2dst[i]<0) continue; + src_memb = src->u.compnd.memb + i; + dst_memb = dst->u.compnd.memb + src2dst[i]; + offset -= dst_memb->type.size; + if (dst_memb->type.size > src_memb->type.size) { + tconv_func = H5T_find (&(src_memb->type), &(dst_memb->type), + &memb_cdata); + if (!tconv_func) { + HGOTO_ERROR (H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unable to convert member data type"); + } + (tconv_func)((*pcdata)->src_memb_id[i], + (*pcdata)->dst_memb_id[i], &memb_cdata, 1, + buf + offset, bkg + dst_memb->offset); + } + HDmemmove (bkg+dst_memb->offset, buf+offset, dst_memb->type.size); + } + assert (0==offset); + /* + * Update buf and background. + */ + buf += src_delta; + bkg += dst_delta; + } - HRETURN_ERROR (H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "not implemented yet"); - FUNC_LEAVE (SUCCEED); + /* + * Copy the background buffer back into the in-place conversion buffer. + */ + HDmemcpy (_buf, _bkg, nelmts*dst->size); + ret_value = SUCCEED; + + done: + FUNC_LEAVE (ret_value); } diff --git a/src/H5Tpkg.h b/src/H5Tpkg.h index 5fc1075..7fa5811 100644 --- a/src/H5Tpkg.h +++ b/src/H5Tpkg.h @@ -78,6 +78,7 @@ typedef struct H5T_path_t { H5T_t *dst; /*destination data type ID */ H5T_conv_t hard; /*hard conversion function or null */ H5T_conv_t soft; /*soft conversion function or null */ + void *cdata; /*extra conversion data */ } H5T_path_t; /* The master list of soft conversion functions */ @@ -87,17 +88,24 @@ typedef struct H5T_soft_t { H5T_conv_t func; /*the conversion function */ } H5T_soft_t; +/* Conversion data for H5T_conv_struct() */ +typedef struct H5T_conv_struct_t { + intn *src2dst; /*mapping from src to dst memb ID */ + hid_t *src_memb_id; /*source member type ID's */ + hid_t *dst_memb_id; /*destination member type ID's */ +} H5T_conv_struct_t; + /* Function prototypes for H5T package scope */ H5T_path_t *H5T_path_find (const H5T_t *src, const H5T_t *dst, hbool_t create); /* Conversion functions */ -herr_t H5T_conv_noop (hid_t src_id, hid_t dst_id, size_t nelmts, void *buf, - const void *background); -herr_t H5T_conv_order (hid_t src_id, hid_t dst_id, size_t nelmts, void *_buf, - const void *background); -herr_t H5T_conv_struct (hid_t src_id, hid_t dst_id, size_t nelmts, - void *_buf, const void *background); +herr_t H5T_conv_noop (hid_t src_id, hid_t dst_id, void **pcdata, + size_t nelmts, void *buf, void *bkg); +herr_t H5T_conv_order (hid_t src_id, hid_t dst_id, void **pcdata, + size_t nelmts, void *_buf, void *bkg); +herr_t H5T_conv_struct (hid_t src_id, hid_t dst_id, void **pcdata, + size_t nelmts, void *_buf, void *bkg); #endif diff --git a/src/H5Tprivate.h b/src/H5Tprivate.h index c58f4c2..8a1b940 100644 --- a/src/H5Tprivate.h +++ b/src/H5Tprivate.h @@ -40,5 +40,5 @@ herr_t H5T_insert (H5T_t *parent, const char *name, off_t offset, herr_t H5T_sort_by_offset (H5T_t *dt); herr_t H5T_pack (H5T_t *dt); herr_t H5T_debug (H5T_t *dt, FILE * stream); -H5T_conv_t H5T_find (const H5T_t *src, const H5T_t *dst); +H5T_conv_t H5T_find (const H5T_t *src, const H5T_t *dst, void **pcdata); #endif diff --git a/src/H5Tpublic.h b/src/H5Tpublic.h index 4608fe6..6c89e14 100644 --- a/src/H5Tpublic.h +++ b/src/H5Tpublic.h @@ -20,6 +20,9 @@ #include <H5public.h> #include <H5Apublic.h> +#define HOFFSET(S,M) ((const char*)&S.M-(const char*)&S) +#define HPOFFSET(P,M) ((const char*)&(P->M)-(const char*)P) + /* These are the various classes of data types */ typedef enum H5T_class_t { H5T_NO_CLASS = -1, /*error */ @@ -90,9 +93,8 @@ typedef enum H5T_pad_t { } H5T_pad_t; /* All data type conversion functions are... */ -typedef herr_t (*H5T_conv_t) (hid_t, hid_t, size_t, void *, const void *); -#define HOFFSET(S,M) ((const char*)&S.M-(const char*)&S) -#define HPOFFSET(P,M) ((const char*)&(P->M)-(const char*)P) +typedef herr_t (*H5T_conv_t) (hid_t src_id, hid_t dst_id, void **pcdata, + size_t nelmts, void *buf, void *bkg); /* The predefined types */ #define H5T_NATIVE_CHAR (H5init(), H5T_NATIVE_CHAR_g) @@ -207,7 +209,7 @@ herr_t H5Tset_strpad (hid_t type_id, H5T_str_t strpad); herr_t H5Tregister_hard (hid_t src_id, hid_t dst_id, H5T_conv_t func); herr_t H5Tregister_soft (H5T_class_t src, H5T_class_t dst, H5T_conv_t func); herr_t H5Tunregister (H5T_conv_t func); -H5T_conv_t H5Tfind (hid_t src_id, hid_t dst_id); +H5T_conv_t H5Tfind (hid_t src_id, hid_t dst_id, void **pcdata); #ifdef __cplusplus } diff --git a/test/Makefile.in b/test/Makefile.in index 66bd646..008829d 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -11,7 +11,7 @@ CPPFLAGS=-I. -I../src @CPPFLAGS@ # These are our main targets. They should be listed in the order to be # executed, generally most specific tests to least specific tests. -PROGS=testhdf5 hyperslab istore dtypes dsets +PROGS=testhdf5 hyperslab istore dtypes dsets cmpd_dset TESTS=$(PROGS) # Source and object files for programs... The PROG_SRC list contains all the @@ -19,7 +19,7 @@ TESTS=$(PROGS) # other source lists are for the individual tests, the files of which may # overlap with other tests. PROG_SRC=testhdf5.c tfile.c theap.c tmeta.c tohdr.c tstab.c th5p.c dtypes.c \ - hyperslab.c istore.c dsets.c + hyperslab.c istore.c dsets.c cmpd_dset.c PROG_OBJ=$(PROG_SRC:.c=.o) TESTHDF5_SRC=testhdf5.c tfile.c theap.c tmeta.c tohdr.c tstab.c th5p.c @@ -37,6 +37,9 @@ HYPERSLAB_OBJ=$(HYPERSLAB_SRC:.c=.o) ISTORE_SRC=istore.c ISTORE_OBJ=$(ISTORE_SRC:.c=.o) +CMPD_DSET_SRC=cmpd_dset.c +CMPD_DSET_OBJ=$(CMPD_DSET_SRC:.c=.o) + # Private header files (not to be installed)... PRIVATE_HDR=testhdf5.h @@ -56,4 +59,7 @@ hyperslab: $(HYPERSLAB_OBJ) ../src/libhdf5.a istore: $(ISTORE_OBJ) ../src/libhdf5.a $(CC) $(CFLAGS) -o $@ $(ISTORE_OBJ) ../src/libhdf5.a $(LIBS) +cmpd_dset: $(CMPD_DSET_OBJ) ../src/libhdf5.a + $(CC) $(CFLAGS) -o $@ $(CMPD_DSET_OBJ) ../src/libhdf5.a $(LIBS) + @CONCLUDE@ |