diff --git a/src/H5T.c b/src/H5T.c index 609bbc9938..df98c7cb96 100644 --- a/src/H5T.c +++ b/src/H5T.c @@ -263,6 +263,7 @@ static herr_t H5T_unregister(H5T_pers_t pers, const char *name, H5T_t *src, H5T_t *dst, H5T_conv_t func, hid_t dxpl_id); static herr_t H5T_register(H5T_pers_t pers, const char *name, H5T_t *src, H5T_t *dst, H5T_conv_t func, hid_t dxpl_id, hbool_t api_call); +static htri_t H5T_compiler_conv(H5T_t *src, H5T_t *dst); static herr_t H5T_encode(H5T_t *obj, unsigned char *buf, size_t *nalloc); static H5T_t *H5T_decode(const unsigned char *buf); @@ -2679,20 +2680,21 @@ H5Tcompiler_conv(hid_t src_id, hid_t dst_id) htri_t ret_value; H5T_t *src = NULL, *dst = NULL; - FUNC_ENTER_API(H5Tcompiler_conv, FAIL); + FUNC_ENTER_API(H5Tcompiler_conv, FAIL) /* Check args */ if (NULL == (src = H5I_object_verify(src_id,H5I_DATATYPE)) || NULL == (dst = H5I_object_verify(dst_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type") /* Find it */ if((ret_value=H5T_compiler_conv(src, dst))<0) - HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "conversion function not found"); + HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "conversion function not found") done: - FUNC_LEAVE_API(ret_value); + FUNC_LEAVE_API(ret_value) } + /*------------------------------------------------------------------------- * Function: H5Tconvert @@ -4666,22 +4668,22 @@ H5T_path_bkg(const H5T_path_t *p) * *------------------------------------------------------------------------- */ -htri_t +static htri_t H5T_compiler_conv(H5T_t *src, H5T_t *dst) { + H5T_path_t *path; htri_t ret_value; - H5T_path_t *path = NULL; - FUNC_ENTER_NOAPI(H5T_compiler_conv, FAIL); + FUNC_ENTER_NOAPI_NOINIT(H5T_compiler_conv) /* Find it */ if (NULL==(path=H5T_path_find(src, dst, NULL, NULL, H5AC_ind_dxpl_id, FALSE))) - HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "conversion function not found"); + HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "conversion function not found") ret_value = (htri_t)path->is_hard; done: - FUNC_LEAVE_NOAPI(ret_value); + FUNC_LEAVE_NOAPI(ret_value) } diff --git a/src/H5Tconv.c b/src/H5Tconv.c index e5c050a1bd..5cfdfbadc1 100644 --- a/src/H5Tconv.c +++ b/src/H5Tconv.c @@ -183,10 +183,10 @@ H5FL_BLK_DEFINE_STATIC(array_seq); * destination. * */ -#define H5T_CONV_xX_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_xX_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_xX_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_xX_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ *((DT*)D) = (DT)(*((ST*)S)); \ } @@ -197,9 +197,9 @@ H5FL_BLK_DEFINE_STATIC(array_seq); * equal. In this case, do not return exception but make sure the maximum is assigned * to the destination. SLU - 2005/06/29 */ -#define H5T_CONV_Xx_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_Xx_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ if (*((ST*)S) > (DT)(D_MAX)) { \ - H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, \ + H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, \ src_id, dst_id, S, D, cb_struct.user_data); \ if(except_ret == H5T_CONV_UNHANDLED) \ /* Let compiler convert if case is ignored by user handler*/ \ @@ -208,7 +208,7 @@ H5FL_BLK_DEFINE_STATIC(array_seq); HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \ /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \ } else if (*((ST*)S) < (DT)(D_MIN)) { \ - H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW, \ + H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW, \ src_id, dst_id, S, D, cb_struct.user_data); \ if(except_ret == H5T_CONV_UNHANDLED) \ /* Let compiler convert if case is ignored by user handler*/ \ @@ -219,7 +219,7 @@ H5FL_BLK_DEFINE_STATIC(array_seq); } else \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_Xx_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_Xx_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ if (*((ST*)S) > (DT)(D_MAX)) { \ *((DT*)D) = (D_MAX); \ } else if (*((ST*)S) < (DT)(D_MIN)) { \ @@ -228,7 +228,7 @@ H5FL_BLK_DEFINE_STATIC(array_seq); *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_Ux_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_Ux_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ if (*((ST*)S) > (DT)(D_MAX)) { \ H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, \ src_id, dst_id, S, D, cb_struct.user_data); \ @@ -241,19 +241,19 @@ H5FL_BLK_DEFINE_STATIC(array_seq); } else \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_Ux_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_Ux_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ if (*((ST*)S) > (DT)(D_MAX)) { \ *((DT*)D) = (D_MAX); \ } else \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_sS(STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_sS(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ assert(sizeof(ST)<=sizeof(DT)); \ - H5T_CONV(H5T_CONV_xX, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, S_PREC, D_PREC) \ + H5T_CONV(H5T_CONV_xX, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ } -#define H5T_CONV_sU_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_sU_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ if (*((ST*)S) < 0) { \ H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW, \ src_id, dst_id, S, D, cb_struct.user_data); \ @@ -266,19 +266,19 @@ H5FL_BLK_DEFINE_STATIC(array_seq); } else \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_sU_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_sU_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ if (*((ST*)S) < 0) { \ *((DT*)D) = 0; \ } else \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_sU(STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_sU(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ assert(sizeof(ST)<=sizeof(DT)); \ - H5T_CONV(H5T_CONV_sU, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, S_PREC, D_PREC) \ + H5T_CONV(H5T_CONV_sU, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ } -#define H5T_CONV_uS_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_uS_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ if (sizeof(ST)==sizeof(DT) && *((ST*)S) > (D_MAX)) { \ H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, \ src_id, dst_id, S, D, cb_struct.user_data); \ @@ -291,29 +291,29 @@ H5FL_BLK_DEFINE_STATIC(array_seq); } else \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_uS_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_uS_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ if (sizeof(ST)==sizeof(DT) && *((ST*)S) > (D_MAX)) { \ *((DT*)D) = (D_MAX); \ } else \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_uS(STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_uS(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ assert(sizeof(ST)<=sizeof(DT)); \ - H5T_CONV(H5T_CONV_uS, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, S_PREC, D_PREC) \ + H5T_CONV(H5T_CONV_uS, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ } -#define H5T_CONV_uU(STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_uU(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ assert(sizeof(ST)<=sizeof(DT)); \ - H5T_CONV(H5T_CONV_xX, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, S_PREC, D_PREC) \ + H5T_CONV(H5T_CONV_xX, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ } -#define H5T_CONV_Ss(STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_Ss(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ assert(sizeof(ST)>=sizeof(DT)); \ - H5T_CONV(H5T_CONV_Xx, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, S_PREC, D_PREC) \ + H5T_CONV(H5T_CONV_Xx, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ } -#define H5T_CONV_Su_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_Su_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ if (*((ST*)S) < 0) { \ H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW, \ src_id, dst_id, S, D, cb_struct.user_data); \ @@ -335,7 +335,7 @@ H5FL_BLK_DEFINE_STATIC(array_seq); } else \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_Su_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_Su_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ if (*((ST*)S) < 0) { \ *((DT*)D) = 0; \ } else if (sizeof(ST)>sizeof(DT) && *((ST*)S) > (DT)(D_MAX)) { \ @@ -344,22 +344,22 @@ H5FL_BLK_DEFINE_STATIC(array_seq); *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_Su(STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_Su(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ assert(sizeof(ST)>=sizeof(DT)); \ - H5T_CONV(H5T_CONV_Su, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, S_PREC, D_PREC) \ + H5T_CONV(H5T_CONV_Su, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ } -#define H5T_CONV_Us(STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_Us(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ assert(sizeof(ST)>=sizeof(DT)); \ - H5T_CONV(H5T_CONV_Ux, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, S_PREC, D_PREC) \ + H5T_CONV(H5T_CONV_Ux, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ } -#define H5T_CONV_Uu(STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_Uu(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ assert(sizeof(ST)>=sizeof(DT)); \ - H5T_CONV(H5T_CONV_Ux, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, S_PREC, D_PREC) \ + H5T_CONV(H5T_CONV_Ux, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ } -#define H5T_CONV_su_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_su_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ /* Assumes memory format of unsigned & signed integers is same */ \ if (*((ST*)S) < 0) { \ H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW, \ @@ -373,7 +373,7 @@ H5FL_BLK_DEFINE_STATIC(array_seq); } else \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_su_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_su_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ /* Assumes memory format of unsigned & signed integers is same */ \ if (*((ST*)S) < 0) { \ *((DT*)D) = 0; \ @@ -381,12 +381,12 @@ H5FL_BLK_DEFINE_STATIC(array_seq); *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_su(STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_su(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ assert(sizeof(ST)==sizeof(DT)); \ - H5T_CONV(H5T_CONV_su, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, S_PREC, D_PREC) \ + H5T_CONV(H5T_CONV_su, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ } -#define H5T_CONV_us_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_us_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ /* Assumes memory format of unsigned & signed integers is same */ \ if (*((ST*)S) > (DT)(D_MAX)) { \ H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, \ @@ -400,7 +400,7 @@ H5FL_BLK_DEFINE_STATIC(array_seq); } else \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_us_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_us_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ /* Assumes memory format of unsigned & signed integers is same */ \ if (*((ST*)S) > (DT)(D_MAX)) { \ *((DT*)D) = (D_MAX); \ @@ -408,20 +408,20 @@ H5FL_BLK_DEFINE_STATIC(array_seq); *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_us(STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_us(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ assert(sizeof(ST)==sizeof(DT)); \ - H5T_CONV(H5T_CONV_us, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, S_PREC, D_PREC) \ + H5T_CONV(H5T_CONV_us, long_long, STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ } -#define H5T_CONV_fF(STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_fF(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ assert(sizeof(ST)<=sizeof(DT)); \ - H5T_CONV(H5T_CONV_xX, long double, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, S_PREC, D_PREC) \ + H5T_CONV(H5T_CONV_xX, long double, STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ } /* Same as H5T_CONV_Xx_CORE, except that instead of using D_MAX and D_MIN * when an overflow occurs, use the 'float' infinity values. */ -#define H5T_CONV_Ff_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_Ff_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ if (*((ST*)S) > (DT)(D_MAX)) { \ H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, \ src_id, dst_id, S, D, cb_struct.user_data); \ @@ -443,7 +443,7 @@ H5FL_BLK_DEFINE_STATIC(array_seq); } else \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_Ff_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_Ff_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ if (*((ST*)S) > (DT)(D_MAX)) { \ *((DT*)D) = (H5T_NATIVE_FLOAT_POS_INF_g); \ } else if (*((ST*)S) < (DT)(D_MIN)) { \ @@ -452,9 +452,9 @@ H5FL_BLK_DEFINE_STATIC(array_seq); *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_Ff(STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_Ff(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ assert(sizeof(ST)>=sizeof(DT)); \ - H5T_CONV(H5T_CONV_Ff, long double, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, S_PREC, D_PREC) \ + H5T_CONV(H5T_CONV_Ff, long double, STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ } #define H5T_HI_LO_BIT_SET(TYP, V, LO, HI) { \ @@ -516,15 +516,15 @@ H5FL_BLK_DEFINE_STATIC(array_seq); LO = count; \ } -#define H5T_CONV_xF_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ - if (S_PREC > D_PREC) { \ +#define H5T_CONV_xF_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ + if (sprec > dprec) { \ unsigned low_bit_pos, high_bit_pos; \ \ /* Detect high & low bits set in source */ \ H5T_HI_LO_BIT_SET(ST, *((ST*)S), low_bit_pos, high_bit_pos) \ \ /* Check for more bits of precision in src than available in dst */ \ - if((high_bit_pos - low_bit_pos) >= D_PREC) { \ + if((high_bit_pos - low_bit_pos) >= dprec) { \ H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_PRECISION, \ src_id, dst_id, S, D, cb_struct.user_data); \ if(except_ret == H5T_CONV_UNHANDLED) \ @@ -540,25 +540,25 @@ H5FL_BLK_DEFINE_STATIC(array_seq); else \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_xF_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_xF_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_xF(STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ - H5T_CONV(H5T_CONV_xF, long double, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, S_PREC, D_PREC) \ +#define H5T_CONV_xF(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ + H5T_CONV(H5T_CONV_xF, long double, STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ } /* Quincey added the condition branch (else if (*((ST*)S) != (ST)((DT)(*((ST*)S))))). * It handles a special situation when the source is "float" and assigned the value * of "INT_MAX". Compilers do roundup making this value "INT_MAX+1". This branch * is to check that situation and return exception for some compilers, mainly GCC. - * The branch if (*((ST*)S) > (DT)(D_MAX) || (S_PREC < D_PREC && *((ST*)S) == + * The branch if (*((ST*)S) > (DT)(D_MAX) || (sprec < dprec && *((ST*)S) == * (DT)(D_MAX))) is for some compilers like Sun, HP, IBM, and SGI where under * the same situation the "int" doesn't overflow. SLU - 2005/9/12 */ -#define H5T_CONV_Fx_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ - if (*((ST*)S) > (DT)(D_MAX) || (S_PREC < D_PREC && *((ST*)S) == (DT)(D_MAX))) { \ - H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, \ +#define H5T_CONV_Fx_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ + if (*((ST*)S) > (DT)(D_MAX) || (sprec < dprec && *((ST*)S) == (DT)(D_MAX))) { \ + H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, \ src_id, dst_id, S, D, cb_struct.user_data); \ if(except_ret == H5T_CONV_UNHANDLED) \ /* Let compiler convert if case is ignored by user handler*/ \ @@ -567,7 +567,7 @@ H5FL_BLK_DEFINE_STATIC(array_seq); HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \ /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \ } else if (*((ST*)S) < (DT)(D_MIN)) { \ - H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW, \ + H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW, \ src_id, dst_id, S, D, cb_struct.user_data); \ if(except_ret == H5T_CONV_UNHANDLED) \ /* Let compiler convert if case is ignored by user handler*/ \ @@ -576,7 +576,7 @@ H5FL_BLK_DEFINE_STATIC(array_seq); HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \ /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \ } else if (*((ST*)S) != (ST)((DT)(*((ST*)S)))) { \ - H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_TRUNCATE, \ + H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_TRUNCATE, \ src_id, dst_id, S, D, cb_struct.user_data); \ if(except_ret == H5T_CONV_UNHANDLED) \ /* Let compiler convert if case is ignored by user handler*/ \ @@ -588,7 +588,7 @@ H5FL_BLK_DEFINE_STATIC(array_seq); else \ *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_Fx_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_Fx_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ if (*((ST*)S) > (DT)(D_MAX)) { \ *((DT*)D) = (D_MAX); \ } else if (*((ST*)S) < (DT)(D_MIN)) { \ @@ -598,23 +598,26 @@ H5FL_BLK_DEFINE_STATIC(array_seq); *((DT*)D) = (DT)(*((ST*)S)); \ } -#define H5T_CONV_Fx(STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ - H5T_CONV(H5T_CONV_Fx, long double, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, S_PREC, D_PREC) \ +#define H5T_CONV_Fx(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ + H5T_CONV(H5T_CONV_Fx, long double, STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ } /* Since all "no exception" cores do the same thing (assign the value in the * source location to the destination location, using casting), use one "core" * to do them all. */ -#define H5T_CONV_NO_EXCEPT_CORE(S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV_NO_EXCEPT_CORE(S,D,ST,DT,D_MIN,D_MAX) { \ *((DT*)D) = (DT)(*((ST*)S)); \ } /* The main part of every integer hardware conversion macro */ -#define H5T_CONV(GUTS,ATYPE,STYPE,DTYPE,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) { \ +#define H5T_CONV(GUTS,ATYPE,STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \ size_t elmtno; /*element number */ \ + size_t sprec; /*source precision */ \ + size_t dprec; /*destination precision */ \ uint8_t *src, *s; /*source buffer */ \ uint8_t *dst, *d; /*destination buffer */ \ + H5T_class_t tclass; /*datatype's class */ \ H5T_t *st, *dt; /*data type descriptors */ \ ATYPE aligned; /*aligned type */ \ hbool_t s_mv, d_mv; /*move data to align it? */ \ @@ -627,9 +630,9 @@ H5FL_BLK_DEFINE_STATIC(array_seq); case H5T_CONV_INIT: \ /* Sanity check and initialize statistics */ \ cdata->need_bkg = H5T_BKG_NO; \ - if (NULL==(st=H5I_object(src_id)) || NULL==(dt=H5I_object(dst_id))) \ - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, \ - "unable to dereference datatype object ID") \ + if (NULL==(st=H5I_object(src_id)) || NULL==(dt=H5I_object(dst_id))) \ + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, \ + "unable to dereference datatype object ID") \ if (st->shared->size!=sizeof(ST) || dt->shared->size!=sizeof(DT)) \ HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, \ "disagreement about datatype size") \ @@ -674,6 +677,25 @@ H5FL_BLK_DEFINE_STATIC(array_seq); if (H5P_get(plist,H5D_XFER_CONV_CB_NAME,&cb_struct)<0) \ HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get conversion exception callback"); \ \ + /* Get source and destination datatypes */ \ + if (NULL==(st=H5I_object(src_id)) || NULL==(dt=H5I_object(dst_id))) \ + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, \ + "unable to dereference datatype object ID") \ + \ + /* Get source & destination precisions into a variable */ \ + tclass = st->shared->type; \ + HDassert(tclass == H5T_INTEGER || tclass == H5T_FLOAT); \ + if(tclass == H5T_INTEGER) \ + sprec = st->shared->u.atomic.prec; \ + else \ + sprec = 1 + st->shared->u.atomic.u.f.msize; \ + tclass = dt->shared->type; \ + HDassert(tclass == H5T_INTEGER || tclass == H5T_FLOAT); \ + if(tclass == H5T_INTEGER) \ + dprec = dt->shared->u.atomic.prec; \ + else \ + dprec = 1 + dt->shared->u.atomic.u.f.msize; \ + \ /* The outer loop of the type conversion macro, controlling which */ \ /* direction the buffer is walked */ \ while (nelmts>0) { \ @@ -709,17 +731,17 @@ H5FL_BLK_DEFINE_STATIC(array_seq); if (s_mv && d_mv) { \ /* Alignment is required for both source and dest */ \ s = (uint8_t*)&aligned; \ - H5T_CONV_LOOP_OUTER(PRE_SALIGN,PRE_DALIGN,POST_SALIGN,POST_DALIGN,GUTS,s,d,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) \ + H5T_CONV_LOOP_OUTER(PRE_SALIGN,PRE_DALIGN,POST_SALIGN,POST_DALIGN,GUTS,s,d,ST,DT,D_MIN,D_MAX) \ } else if(s_mv) { \ /* Alignment is required only for source */ \ s = (uint8_t*)&aligned; \ - H5T_CONV_LOOP_OUTER(PRE_SALIGN,PRE_DNOALIGN,POST_SALIGN,POST_DNOALIGN,GUTS,s,dst,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) \ + H5T_CONV_LOOP_OUTER(PRE_SALIGN,PRE_DNOALIGN,POST_SALIGN,POST_DNOALIGN,GUTS,s,dst,ST,DT,D_MIN,D_MAX) \ } else if(d_mv) { \ /* Alignment is required only for destination */ \ - H5T_CONV_LOOP_OUTER(PRE_SNOALIGN,PRE_DALIGN,POST_SNOALIGN,POST_DALIGN,GUTS,src,d,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) \ + H5T_CONV_LOOP_OUTER(PRE_SNOALIGN,PRE_DALIGN,POST_SNOALIGN,POST_DALIGN,GUTS,src,d,ST,DT,D_MIN,D_MAX) \ } else { \ /* Alignment is not required for both source and destination */ \ - H5T_CONV_LOOP_OUTER(PRE_SNOALIGN,PRE_DNOALIGN,POST_SNOALIGN,POST_DNOALIGN,GUTS,src,dst,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) \ + H5T_CONV_LOOP_OUTER(PRE_SNOALIGN,PRE_DNOALIGN,POST_SNOALIGN,POST_DNOALIGN,GUTS,src,dst,ST,DT,D_MIN,D_MAX) \ } \ \ /* Decrement number of elements left to convert */ \ @@ -769,16 +791,16 @@ H5FL_BLK_DEFINE_STATIC(array_seq); } /* The outer wrapper for the type conversion loop, to check for an exception handling routine */ -#define H5T_CONV_LOOP_OUTER(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) \ +#define H5T_CONV_LOOP_OUTER(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,S,D,ST,DT,D_MIN,D_MAX) \ if(cb_struct.func) { \ - H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) \ + H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,S,D,ST,DT,D_MIN,D_MAX) \ } \ else { \ - H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,H5_GLUE(GUTS,_NOEX),S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) \ + H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,H5_GLUE(GUTS,_NOEX),S,D,ST,DT,D_MIN,D_MAX) \ } /* The inner loop of the type conversion macro, actually converting the elements */ -#define H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,S,D,ST,DT,D_MIN,D_MAX,S_PREC,D_PREC) \ +#define H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,S,D,ST,DT,D_MIN,D_MAX) \ for (elmtno=0; elmtno