diff options
Diffstat (limited to 'src/H5Tprecis.c')
| -rw-r--r-- | src/H5Tprecis.c | 194 |
1 files changed, 81 insertions, 113 deletions
diff --git a/src/H5Tprecis.c b/src/H5Tprecis.c index b3975af..4505ea3 100644 --- a/src/H5Tprecis.c +++ b/src/H5Tprecis.c @@ -1,16 +1,13 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://www.hdfgroup.org/licenses. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* @@ -18,43 +15,16 @@ * the datatype precision for the H5T interface. */ -#define H5T_PACKAGE /*suppress error about including H5Tpkg */ +#include "H5Tmodule.h" /* This source code file is part of the H5T module */ -/* Interface initialization */ -#define H5_INTERFACE_INIT_FUNC H5T_init_precis_interface - - -#include "H5private.h" /* Generic Functions */ -#include "H5Eprivate.h" /* Error handling */ -#include "H5Iprivate.h" /* IDs */ -#include "H5Tpkg.h" /* Datatypes */ +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Iprivate.h" /* IDs */ +#include "H5Tpkg.h" /* Datatypes */ /* Static local functions */ -static herr_t H5T_set_precision(const H5T_t *dt, size_t prec); - - -/*-------------------------------------------------------------------------- -NAME - H5T_init_precis_interface -- Initialize interface-specific information -USAGE - herr_t H5T_init_precis_interface() - -RETURNS - Non-negative on success/Negative on failure -DESCRIPTION - Initializes any interface-specific data or routines. (Just calls - H5T_init_iterface currently). - ---------------------------------------------------------------------------*/ -static herr_t -H5T_init_precis_interface(void) -{ - FUNC_ENTER_NOAPI_NOINIT_NOERR +static herr_t H5T__set_precision(const H5T_t *dt, size_t prec); - FUNC_LEAVE_NOAPI(H5T_init()) -} /* H5T_init_precis_interface() */ - - /*------------------------------------------------------------------------- * Function: H5Tget_precision * @@ -71,34 +41,29 @@ H5T_init_precis_interface(void) * Programmer: Robb Matzke * Wednesday, January 7, 1998 * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived datatypes. - * *------------------------------------------------------------------------- */ size_t H5Tget_precision(hid_t type_id) { - H5T_t *dt; - size_t ret_value; + H5T_t *dt; + size_t ret_value; FUNC_ENTER_API(0) H5TRACE1("z", "i", type_id); /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a datatype") + if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a datatype") /* Get precision */ - if((ret_value = H5T_get_precision(dt)) == 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, 0, "cant't get precision for specified datatype") + if ((ret_value = H5T_get_precision(dt)) == 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, 0, "can't get precision for specified datatype") done: FUNC_LEAVE_API(ret_value) } /* end H5Tget_precision() */ - /*------------------------------------------------------------------------- * Function: H5T_get_precision * @@ -119,15 +84,15 @@ done: size_t H5T_get_precision(const H5T_t *dt) { - size_t ret_value; + size_t ret_value = 0; /* Return value */ FUNC_ENTER_NOAPI(0) /* Defer to parent*/ - while(dt->shared->parent) + while (dt->shared->parent) dt = dt->shared->parent; - if(!H5T_IS_ATOMIC(dt->shared)) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, 0, "operation not defined for specified datatype") + if (!H5T_IS_ATOMIC(dt->shared)) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, 0, "operation not defined for specified datatype") /* Precision */ ret_value = dt->shared->u.atomic.prec; @@ -136,7 +101,6 @@ done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5T_get_precision() */ - /*------------------------------------------------------------------------- * Function: H5Tset_precision * @@ -160,46 +124,43 @@ done: * Programmer: Robb Matzke * Wednesday, January 7, 1998 * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Moved real work to a private function. - * *------------------------------------------------------------------------- */ herr_t H5Tset_precision(hid_t type_id, size_t prec) { - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ + H5T_t *dt = NULL; + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(FAIL) H5TRACE2("e", "iz", type_id, prec); /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype") - if (H5T_STATE_TRANSIENT!=dt->shared->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is read-only") + if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype") + if (H5T_STATE_TRANSIENT != dt->shared->state) + HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is read-only") + if (NULL != dt->vol_obj) + HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is committed") if (prec == 0) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "precision must be positive") - if (H5T_ENUM==dt->shared->type && dt->shared->u.enumer.nmembs>0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "operation not allowed after members are defined") - if (H5T_STRING==dt->shared->type) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "precision must be positive") + if (H5T_ENUM == dt->shared->type && dt->shared->u.enumer.nmembs > 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "operation not allowed after members are defined") + if (H5T_STRING == dt->shared->type) HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "precision for this type is read-only") - if (H5T_COMPOUND==dt->shared->type || H5T_OPAQUE==dt->shared->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for specified datatype") + if (H5T_COMPOUND == dt->shared->type || H5T_OPAQUE == dt->shared->type) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for specified datatype") /* Do the work */ - if (H5T_set_precision(dt, prec)<0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "unable to set precision") + if (H5T__set_precision(dt, prec) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "unable to set precision") done: FUNC_LEAVE_API(ret_value) } - /*------------------------------------------------------------------------- - * Function: H5T_set_precision + * Function: H5T__set_precision * * Purpose: Sets the precision of a datatype. The precision is * the number of significant bits which, unless padding is @@ -221,51 +182,48 @@ done: * Programmer: Robb Matzke * Wednesday, January 7, 1998 * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived datatypes. - * *------------------------------------------------------------------------- */ static herr_t -H5T_set_precision(const H5T_t *dt, size_t prec) +H5T__set_precision(const H5T_t *dt, size_t prec) { - size_t offset, size; - herr_t ret_value=SUCCEED; /* Return value */ + size_t offset, size; + herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Check args */ HDassert(dt); - HDassert(prec>0); - HDassert(H5T_OPAQUE!=dt->shared->type); - HDassert(H5T_COMPOUND!=dt->shared->type); - HDassert(H5T_STRING!=dt->shared->type); - HDassert(!(H5T_ENUM==dt->shared->type && 0==dt->shared->u.enumer.nmembs)); + HDassert(prec > 0); + HDassert(H5T_OPAQUE != dt->shared->type); + HDassert(H5T_COMPOUND != dt->shared->type); + HDassert(H5T_STRING != dt->shared->type); + HDassert(!(H5T_ENUM == dt->shared->type && 0 == dt->shared->u.enumer.nmembs)); if (dt->shared->parent) { - if (H5T_set_precision(dt->shared->parent, prec)<0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "unable to set precision for base type") + if (H5T__set_precision(dt->shared->parent, prec) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "unable to set precision for base type") /* Adjust size of datatype appropriately */ - if(dt->shared->type==H5T_ARRAY) + if (dt->shared->type == H5T_ARRAY) dt->shared->size = dt->shared->parent->shared->size * dt->shared->u.array.nelem; - else if(dt->shared->type!=H5T_VLEN) + else if (dt->shared->type != H5T_VLEN) dt->shared->size = dt->shared->parent->shared->size; - } else { + } + else { if (H5T_IS_ATOMIC(dt->shared)) { - /* Adjust the offset and size */ - offset = dt->shared->u.atomic.offset; - size = dt->shared->size; - if (prec > 8*size) + /* Adjust the offset and size */ + offset = dt->shared->u.atomic.offset; + size = dt->shared->size; + if (prec > 8 * size) offset = 0; - else if (offset+prec > 8 * size) + else if (offset + prec > 8 * size) offset = 8 * size - prec; - if (prec > 8*size) - size = (prec+7) / 8; + if (prec > 8 * size) + size = (prec + 7) / 8; - /* Check that things are still kosher */ - switch (dt->shared->type) { + /* Check that things are still kosher */ + switch (dt->shared->type) { case H5T_INTEGER: case H5T_TIME: case H5T_BITFIELD: @@ -278,20 +236,31 @@ H5T_set_precision(const H5T_t *dt, size_t prec) * first when decreasing the precision of a floating point * type. */ - if (dt->shared->u.atomic.u.f.sign >= prec+offset || - dt->shared->u.atomic.u.f.epos + dt->shared->u.atomic.u.f.esize > prec+offset || - dt->shared->u.atomic.u.f.mpos + dt->shared->u.atomic.u.f.msize > prec+offset) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "adjust sign, mantissa, and exponent fields first") + if (dt->shared->u.atomic.u.f.sign >= prec + offset || + dt->shared->u.atomic.u.f.epos + dt->shared->u.atomic.u.f.esize > prec + offset || + dt->shared->u.atomic.u.f.mpos + dt->shared->u.atomic.u.f.msize > prec + offset) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "adjust sign, mantissa, and exponent fields first") break; + + case H5T_NO_CLASS: + case H5T_STRING: + case H5T_OPAQUE: + case H5T_COMPOUND: + case H5T_REFERENCE: + case H5T_ENUM: + case H5T_VLEN: + case H5T_ARRAY: + case H5T_NCLASSES: default: HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "operation not defined for datatype class") - } /* end switch */ /*lint !e788 All appropriate cases are covered */ + } /* end switch */ - /* Commit */ - dt->shared->size = size; + /* Commit */ + dt->shared->size = size; dt->shared->u.atomic.offset = offset; - dt->shared->u.atomic.prec = prec; - } /* end if */ + dt->shared->u.atomic.prec = prec; + } /* end if */ else HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for specified datatype") } /* end else */ @@ -299,4 +268,3 @@ H5T_set_precision(const H5T_t *dt, size_t prec) done: FUNC_LEAVE_NOAPI(ret_value) } - |
