#include "H5Tmodule.h"
#include "H5private.h"
#include "H5CXprivate.h"
#include "H5Dprivate.h"
#include "H5Eprivate.h"
#include "H5FLprivate.h"
#include "H5HGprivate.h"
#include "H5Iprivate.h"
#include "H5MMprivate.h"
#include "H5Pprivate.h"
#include "H5Tpkg.h"
#define H5T_CONV_xX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_xX_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_Xx_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
if (*(S) > (ST)(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) \
\
*(D) = (DT)(D_MAX); \
else if(except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
\
} else if (*(S) < (ST)(D_MIN)) { \
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) \
\
*(D) = (DT)(D_MIN); \
else if(except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
\
} else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_Xx_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
if (*(S) > (ST)(D_MAX)) { \
*(D) = (DT)(D_MAX); \
} else if (*(S) < (ST)(D_MIN)) { \
*(D) = (DT)(D_MIN); \
} else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_Ux_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
if (*(S) > (ST)(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) \
\
*(D) = (DT)(D_MAX); \
else if(except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
\
} else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_Ux_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
if (*(S) > (ST)(D_MAX)) { \
*(D) = (DT)(D_MAX); \
} else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_sS(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \
HDcompile_assert(sizeof(ST)<=sizeof(DT)); \
H5T_CONV(H5T_CONV_xX, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \
}
#define H5T_CONV_sU_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
if (*(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); \
if(except_ret == H5T_CONV_UNHANDLED) \
\
*(D) = 0; \
else if(except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
\
} else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_sU_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
if(*(S) < 0) \
*(D) = 0; \
else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_sU(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \
HDcompile_assert(sizeof(ST)<=sizeof(DT)); \
H5T_CONV(H5T_CONV_sU, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \
}
#define H5T_CONV_uS_UCHAR_SHORT 0
#define H5T_CONV_uS_UCHAR_INT 0
#define H5T_CONV_uS_UCHAR_LONG 0
#define H5T_CONV_uS_UCHAR_LLONG 0
#if H5_SIZEOF_SHORT == H5_SIZEOF_INT
#define H5T_CONV_uS_USHORT_INT 1
#else
#define H5T_CONV_uS_USHORT_INT 0
#endif
#define H5T_CONV_uS_USHORT_LONG 0
#define H5T_CONV_uS_USHORT_LLONG 0
#if H5_SIZEOF_INT == H5_SIZEOF_LONG
#define H5T_CONV_uS_UINT_LONG 1
#else
#define H5T_CONV_uS_UINT_LONG 0
#endif
#define H5T_CONV_uS_UINT_LLONG 0
#if H5_SIZEOF_LONG == H5_SIZEOF_LONG_LONG
#define H5T_CONV_uS_ULONG_LLONG 1
#else
#define H5T_CONV_uS_ULONG_LLONG 0
#endif
#define H5T_CONV_uS_EVAL_TYPES(STYPE, DTYPE) \
H5_GLUE4(H5T_CONV_uS_, STYPE, _, DTYPE)
#define H5T_CONV_uS_CORE_1(S, D, ST, DT, D_MIN, D_MAX) \
if (*(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) \
\
*(D) = (DT)(D_MAX); \
else if (except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, \
"can't handle conversion exception") \
\
} else \
*(D) = (DT)(*(S));
#define H5T_CONV_uS_CORE_0(S, D, ST, DT, D_MIN, D_MAX) \
*(D) = (DT)(*(S));
#define H5T_CONV_uS_CORE_I(over, S, D, ST, DT, D_MIN, D_MAX) \
H5_GLUE(H5T_CONV_uS_CORE_, over)(S, D, ST, DT, D_MIN, D_MAX)
#define H5T_CONV_uS_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) { \
H5T_CONV_uS_CORE_I(H5T_CONV_uS_EVAL_TYPES(STYPE, DTYPE), \
S, D, ST, DT, D_MIN, D_MAX) \
}
#define H5T_CONV_uS_NOEX_CORE_1(S, D, ST, DT, D_MIN, D_MAX) \
if (*(S) > (DT)(D_MAX)) \
*(D) = (D_MAX); \
else \
*(D) = (DT)(*(S));
#define H5T_CONV_uS_NOEX_CORE_0(S, D, ST, DT, D_MIN, D_MAX) \
*(D) = (DT)(*(S));
#define H5T_CONV_uS_NOEX_CORE_I(over, S, D, ST, DT, D_MIN, D_MAX) \
H5_GLUE(H5T_CONV_uS_NOEX_CORE_, over)(S, D, ST, DT, D_MIN, D_MAX)
#define H5T_CONV_uS_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) { \
H5T_CONV_uS_NOEX_CORE_I(H5T_CONV_uS_EVAL_TYPES(STYPE, DTYPE), \
S, D, ST, DT, D_MIN, D_MAX) \
}
#define H5T_CONV_uS(STYPE, DTYPE, ST, DT, D_MIN, D_MAX) { \
HDcompile_assert(sizeof(ST) <= sizeof(DT)); \
H5T_CONV(H5T_CONV_uS, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \
}
#define H5T_CONV_uU(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \
HDcompile_assert(sizeof(ST)<=sizeof(DT)); \
H5T_CONV(H5T_CONV_xX, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \
}
#define H5T_CONV_Ss(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \
HDcompile_assert(sizeof(ST)>=sizeof(DT)); \
H5T_CONV(H5T_CONV_Xx, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \
}
#define H5T_CONV_Su_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
if(*(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); \
if(except_ret == H5T_CONV_UNHANDLED) \
\
*(D) = 0; \
else if(except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
\
} else if (sizeof(ST)>sizeof(DT) && *(S) > (ST)(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) \
\
*(D) = (DT)(D_MAX); \
else if(except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
\
} else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_Su_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
if(*(S) < 0) \
*(D) = 0; \
else if (sizeof(ST)>sizeof(DT) && *(S) > (ST)(D_MAX)) \
*(D) = (DT)(D_MAX); \
else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_Su(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \
HDcompile_assert(sizeof(ST)>=sizeof(DT)); \
H5T_CONV(H5T_CONV_Su, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \
}
#define H5T_CONV_Us(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \
HDcompile_assert(sizeof(ST)>=sizeof(DT)); \
H5T_CONV(H5T_CONV_Ux, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \
}
#define H5T_CONV_Uu(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \
HDcompile_assert(sizeof(ST)>=sizeof(DT)); \
H5T_CONV(H5T_CONV_Ux, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \
}
#define H5T_CONV_su_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
\
if(*(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); \
if(except_ret == H5T_CONV_UNHANDLED) \
\
*(D) = 0; \
else if(except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
\
} else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_su_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
\
if(*(S) < 0) \
*(D) = 0; \
else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_su(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \
HDcompile_assert(sizeof(ST)==sizeof(DT)); \
H5T_CONV(H5T_CONV_su, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \
}
#define H5T_CONV_us_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
\
if (*(S) > (ST)(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) \
\
*(D) = (DT)(D_MAX); \
else if(except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
\
} else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_us_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
\
if(*(S) > (ST)(D_MAX)) \
*(D) = (DT)(D_MAX); \
else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_us(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \
HDcompile_assert(sizeof(ST)==sizeof(DT)); \
H5T_CONV(H5T_CONV_us, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \
}
#define H5T_CONV_fF(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \
HDcompile_assert(sizeof(ST)<=sizeof(DT)); \
H5T_CONV(H5T_CONV_xX, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \
}
#define H5T_CONV_Ff_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
if(*(S) > (ST)(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) \
\
*(D) = (H5T_NATIVE_FLOAT_POS_INF_g); \
else if(except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
\
} else if (*(S) < (ST)(D_MIN)) { \
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) \
\
*(D) = (H5T_NATIVE_FLOAT_NEG_INF_g); \
else if(except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
\
} else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_Ff_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
if(*(S) > (ST)(D_MAX)) \
*(D) = (H5T_NATIVE_FLOAT_POS_INF_g); \
else if (*(S) < (ST)(D_MIN)) \
*(D) = (H5T_NATIVE_FLOAT_NEG_INF_g); \
else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_Ff(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \
HDcompile_assert(sizeof(ST)>=sizeof(DT)); \
H5T_CONV(H5T_CONV_Ff, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \
}
#define H5T_HI_LO_BIT_SET(TYP, V, LO, HI) { \
unsigned count; \
unsigned char p; \
unsigned u; \
\
count = 0; \
for(u = 0; u < sizeof(TYP); u++) { \
count = (((unsigned)sizeof(TYP) - 1) - u) * 8; \
p = (unsigned char)((V) >> count); \
if(p > 0) { \
if(p & 0x80) \
count += 7; \
else if(p & 0x40) \
count += 6; \
else if(p & 0x20) \
count += 5; \
else if(p & 0x10) \
count += 4; \
else if(p & 0x08) \
count += 3; \
else if(p & 0x04) \
count += 2; \
else if(p & 0x02) \
count += 1; \
break; \
} \
} \
\
HI = count; \
\
count = 0; \
for(u = 0; u < sizeof(TYP); u++) { \
p = (unsigned char)((V) >> (u * 8)); \
if(p > 0) { \
count = u * 8; \
\
if(p & 0x01) \
; \
else if(p & 0x02) \
count += 1; \
else if(p & 0x04) \
count += 2; \
else if(p & 0x08) \
count += 3; \
else if(p & 0x10) \
count += 4; \
else if(p & 0x20) \
count += 5; \
else if(p & 0x40) \
count += 6; \
else if(p & 0x80) \
count += 7; \
break; \
} \
} \
\
LO = count; \
}
#define H5T_CONV_xF_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
if (sprec > dprec) { \
unsigned low_bit_pos, high_bit_pos; \
\
\
H5T_HI_LO_BIT_SET(ST, *(S), low_bit_pos, high_bit_pos) \
\
\
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) \
\
*(D) = (DT)(*(S)); \
else if(except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
\
} \
else \
*(D) = (DT)(*(S)); \
} \
else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_xF_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_xF(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \
H5T_CONV(H5T_CONV_xF, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, Y) \
}
#define H5T_CONV_Fx_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
if(*(S) > (ST)(D_MAX) || (sprec < dprec && *(S) == (ST)(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) \
\
*(D) = (DT)(D_MAX); \
else if(except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
\
} else if (*(S) < (ST)(D_MIN)) { \
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) \
\
*(D) = (DT)(D_MIN); \
else if(except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
\
} else if (*(S) != (ST)((DT)(*(S)))) { \
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) \
\
*(D) = (DT)(*(S)); \
else if(except_ret == H5T_CONV_ABORT) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
\
} \
else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_Fx_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
if(*(S) > (ST)(D_MAX)) \
*(D) = (DT)(D_MAX); \
else if(*(S) < (ST)(D_MIN)) \
*(D) = (DT)(D_MIN); \
else \
*(D) = (DT)(*(S)); \
}
#define H5T_CONV_Fx(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) { \
H5T_CONV(H5T_CONV_Fx, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, Y) \
}
#ifndef H5_WANT_DCONV_EXCEPTION
#define H5T_CONV_NO_EXCEPT_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) { \
*(D) = (DT)(*(S)); \
}
#endif
#define H5T_CONV(GUTS,STYPE,DTYPE,ST,DT,D_MIN,D_MAX,PREC) \
{ \
herr_t ret_value=SUCCEED; \
\
FUNC_ENTER_PACKAGE \
\
{ \
size_t elmtno; \
H5T_CONV_DECL_PREC(PREC) \
uint8_t *src_buf; \
uint8_t *dst_buf; \
ST *src, *s; \
DT *dst, *d; \
H5T_t *st, *dt; \
ST src_aligned; \
DT dst_aligned; \
hbool_t s_mv, d_mv; \
ssize_t s_stride, d_stride; \
size_t safe; \
H5T_conv_cb_t cb_struct; \
\
switch (cdata->command) { \
case H5T_CONV_INIT: \
\
cdata->need_bkg = H5T_BKG_NO; \
if (NULL==(st=(H5T_t*)H5I_object(src_id)) || NULL==(dt=(H5T_t*)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") \
CI_ALLOC_PRIV \
break; \
\
case H5T_CONV_FREE: \
\
CI_PRINT_STATS(STYPE,DTYPE); \
CI_FREE_PRIV \
break; \
\
case H5T_CONV_CONV: \
\
if (buf_stride) { \
HDassert(buf_stride >= sizeof(ST)); \
HDassert(buf_stride >= sizeof(DT)); \
s_stride = d_stride = (ssize_t)buf_stride; \
} else { \
s_stride = sizeof(ST); \
d_stride = sizeof(DT); \
} \
\
\
s_mv = H5T_NATIVE_##STYPE##_ALIGN_g>1 && \
((size_t)buf%H5T_NATIVE_##STYPE##_ALIGN_g || \
((size_t)((ST*)buf)!=(size_t)buf) || \
(size_t)s_stride%H5T_NATIVE_##STYPE##_ALIGN_g); \
d_mv = H5T_NATIVE_##DTYPE##_ALIGN_g>1 && \
((size_t)buf%H5T_NATIVE_##DTYPE##_ALIGN_g || \
((size_t)((DT*)buf)!=(size_t)buf) || \
(size_t)d_stride%H5T_NATIVE_##DTYPE##_ALIGN_g); \
CI_INC_SRC(s_mv) \
CI_INC_DST(d_mv) \
\
\
if(H5CX_get_dt_conv_cb(&cb_struct) < 0) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "unable to get conversion exception callback") \
\
\
if(NULL == (st = (H5T_t *)H5I_object(src_id)) || NULL == (dt = (H5T_t *)H5I_object(dst_id))) \
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to dereference datatype object ID") \
\
H5T_CONV_SET_PREC(PREC) \
\
\
\
while (nelmts>0) { \
\
if(d_stride>s_stride) { \
\
\
\
safe = nelmts - (((nelmts * (size_t)s_stride) + (size_t)(d_stride - 1)) / (size_t)d_stride); \
\
\
\
if(safe<2) { \
src = (ST *)(src_buf = (uint8_t *)buf + (nelmts - 1) * (size_t)s_stride); \
dst = (DT *)(dst_buf = (uint8_t *)buf + (nelmts - 1) * (size_t)d_stride); \
s_stride = -s_stride; \
d_stride = -d_stride; \
\
safe=nelmts; \
} \
else { \
src = (ST *)(src_buf = (uint8_t *)buf + (nelmts - safe) * (size_t)s_stride); \
dst = (DT *)(dst_buf = (uint8_t *)buf + (nelmts - safe) * (size_t)d_stride); \
} \
} \
else { \
\
src = (ST *)(src_buf = (uint8_t*)buf); \
dst = (DT *)(dst_buf = (uint8_t*)buf); \
safe=nelmts; \
} \
\
\
if (s_mv && d_mv) { \
\
s = &src_aligned; \
H5T_CONV_LOOP_OUTER(PRE_SALIGN,PRE_DALIGN,POST_SALIGN,POST_DALIGN,GUTS,STYPE,DTYPE,s,d,ST,DT,D_MIN,D_MAX) \
} else if(s_mv) { \
\
s = &src_aligned; \
H5T_CONV_LOOP_OUTER(PRE_SALIGN,PRE_DNOALIGN,POST_SALIGN,POST_DNOALIGN,GUTS,STYPE,DTYPE,s,dst,ST,DT,D_MIN,D_MAX) \
} else if(d_mv) { \
\
H5T_CONV_LOOP_OUTER(PRE_SNOALIGN,PRE_DALIGN,POST_SNOALIGN,POST_DALIGN,GUTS,STYPE,DTYPE,src,d,ST,DT,D_MIN,D_MAX) \
} else { \
\
H5T_CONV_LOOP_OUTER(PRE_SNOALIGN,PRE_DNOALIGN,POST_SNOALIGN,POST_DNOALIGN,GUTS,STYPE,DTYPE,src,dst,ST,DT,D_MIN,D_MAX) \
} \
\
\
nelmts-=safe; \
} \
break; \
\
default: \
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, \
"unknown conversion command"); \
} \
} \
\
done: \
FUNC_LEAVE_NOAPI(ret_value) \
}
#define H5T_CONV_DECL_PREC(PREC) H5_GLUE(H5T_CONV_DECL_PREC_, PREC)
#define H5T_CONV_DECL_PREC_Y \
size_t sprec; \
size_t dprec; \
H5T_class_t tclass;
#define H5T_CONV_DECL_PREC_N
#define H5T_CONV_SET_PREC(PREC) H5_GLUE(H5T_CONV_SET_PREC_, PREC)
#define H5T_CONV_SET_PREC_Y \
\
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;
#define H5T_CONV_SET_PREC_N
#define H5T_CONV_LOOP_PRE_SALIGN(ST) { \
H5MM_memcpy(&src_aligned, src, sizeof(ST)); \
}
#define H5T_CONV_LOOP_PRE_SNOALIGN(ST) { \
}
#define H5T_CONV_LOOP_PRE_DALIGN(DT) { \
d = &dst_aligned; \
}
#define H5T_CONV_LOOP_PRE_DNOALIGN(DT) { \
}
#define H5T_CONV_LOOP_POST_SALIGN(ST) { \
}
#define H5T_CONV_LOOP_POST_SNOALIGN(ST) { \
}
#define H5T_CONV_LOOP_POST_DALIGN(DT) { \
H5MM_memcpy(dst, &dst_aligned, sizeof(DT)); \
}
#define H5T_CONV_LOOP_POST_DNOALIGN(DT) { \
}
#define H5T_CONV_LOOP_OUTER(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,STYPE,DTYPE,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,STYPE,DTYPE,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),STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) \
}
#define H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) \
for (elmtno=0; elmtno<safe; elmtno++) { \
\
H5_GLUE(H5T_CONV_LOOP_,PRE_SALIGN_GUTS)(ST) \
\
\
H5_GLUE(H5T_CONV_LOOP_,PRE_DALIGN_GUTS)(DT) \
\
\
H5T_CONV_LOOP_GUTS(GUTS,STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) \
\
\
H5_GLUE(H5T_CONV_LOOP_,POST_SALIGN_GUTS)(ST) \
\
\
H5_GLUE(H5T_CONV_LOOP_,POST_DALIGN_GUTS)(DT) \
\
\
src_buf += s_stride; \
src = (ST *)src_buf; \
dst_buf += d_stride; \
dst = (DT *)dst_buf; \
}
#ifdef H5_WANT_DCONV_EXCEPTION
#define H5T_CONV_LOOP_GUTS(GUTS,STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) \
\
H5_GLUE(GUTS,_CORE)(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX)
#else
#define H5T_CONV_LOOP_GUTS(GUTS,STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) \
H5_GLUE(H5T_CONV_NO_EXCEPT,_CORE)(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX)
#endif
#ifdef H5T_DEBUG
# define CI_PRINT_STATS(STYPE,DTYPE) { \
if (H5DEBUG(T) && ((H5T_conv_hw_t *)cdata->priv)->s_aligned) { \
HDfprintf(H5DEBUG(T), \
" %Hu src elements aligned on %lu-byte boundaries\n", \
((H5T_conv_hw_t *)cdata->priv)->s_aligned, \
(unsigned long)H5T_NATIVE_##STYPE##_ALIGN_g); \
} \
if (H5DEBUG(T) && ((H5T_conv_hw_t *)cdata->priv)->d_aligned) { \
HDfprintf(H5DEBUG(T), \
" %Hu dst elements aligned on %lu-byte boundaries\n", \
((H5T_conv_hw_t *)cdata->priv)->d_aligned, \
(unsigned long)H5T_NATIVE_##DTYPE##_ALIGN_g); \
} \
}
# define CI_ALLOC_PRIV \
if (NULL==(cdata->priv=H5MM_calloc(sizeof(H5T_conv_hw_t)))) { \
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
"memory allocation failed"); \
}
# define CI_FREE_PRIV \
if(cdata->priv!=NULL) \
cdata->priv = H5MM_xfree(cdata->priv);
# define CI_INC_SRC(s) if (s) ((H5T_conv_hw_t *)cdata->priv)->s_aligned += nelmts;
# define CI_INC_DST(d) if (d) ((H5T_conv_hw_t *)cdata->priv)->d_aligned += nelmts;
#else
# define CI_PRINT_STATS(STYPE,DTYPE)
# define CI_ALLOC_PRIV cdata->priv=NULL;
# define CI_FREE_PRIV
# define CI_INC_SRC(s)
# define CI_INC_DST(d)
#endif
#define H5_SWAP_BYTES(ARRAY,I,J) {uint8_t _tmp; _tmp=ARRAY[I]; ARRAY[I]=ARRAY[J]; ARRAY[J]=_tmp;}
#define H5T_VLEN_MIN_CONF_BUF_SIZE 4096
typedef struct H5T_conv_struct_t {
int *src2dst;
hid_t *src_memb_id;
hid_t *dst_memb_id;
H5T_path_t **memb_path;
H5T_subset_info_t subset_info;
unsigned src_nmembs;
} H5T_conv_struct_t;
typedef struct H5T_enum_struct_t {
int base;
unsigned length;
int *src2dst;
} H5T_enum_struct_t;
typedef struct H5T_conv_hw_t {
size_t s_aligned;
size_t d_aligned;
} H5T_conv_hw_t;
static herr_t H5T_reverse_order(uint8_t *rev, uint8_t *s, size_t size, H5T_order_t order);
H5FL_BLK_DEFINE_STATIC(vlen_seq);
H5FL_BLK_DEFINE_STATIC(array_seq);
herr_t
H5T__conv_noop(hid_t H5_ATTR_UNUSED src_id, hid_t H5_ATTR_UNUSED dst_id, H5T_cdata_t *cdata,
size_t H5_ATTR_UNUSED nelmts, size_t H5_ATTR_UNUSED buf_stride,
size_t H5_ATTR_UNUSED bkg_stride, void H5_ATTR_UNUSED *buf,
void H5_ATTR_UNUSED *background)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_PACKAGE
switch(cdata->command) {
case H5T_CONV_INIT:
cdata->need_bkg = H5T_BKG_NO;
break;
case H5T_CONV_CONV:
break;
case H5T_CONV_FREE:
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
}
done:
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5T__conv_order_opt(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride,
size_t H5_ATTR_UNUSED bkg_stride, void *_buf,
void H5_ATTR_UNUSED *background)
{
uint8_t *buf = (uint8_t*)_buf;
H5T_t *src = NULL;
H5T_t *dst = NULL;
size_t i;
herr_t ret_value = SUCCEED;
FUNC_ENTER_PACKAGE
switch(cdata->command) {
case H5T_CONV_INIT:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(src->shared->size != dst->shared->size ||
0 != src->shared->u.atomic.offset ||
0 != dst->shared->u.atomic.offset)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
if((src->shared->type == H5T_REFERENCE && dst->shared->type != H5T_REFERENCE) ||
(dst->shared->type == H5T_REFERENCE && src->shared->type != H5T_REFERENCE))
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
if(src->shared->type != H5T_REFERENCE &&
!((H5T_ORDER_BE == src->shared->u.atomic.order && H5T_ORDER_LE == dst->shared->u.atomic.order) ||
(H5T_ORDER_LE == src->shared->u.atomic.order && H5T_ORDER_BE == dst->shared->u.atomic.order)))
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
if(src->shared->size != 1 && src->shared->size != 2 && src->shared->size != 4 &&
src->shared->size != 8 && src->shared->size != 16)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
switch(src->shared->type) {
case H5T_INTEGER:
case H5T_BITFIELD:
case H5T_REFERENCE:
break;
case H5T_FLOAT:
if(src->shared->u.atomic.u.f.sign != dst->shared->u.atomic.u.f.sign ||
src->shared->u.atomic.u.f.epos != dst->shared->u.atomic.u.f.epos ||
src->shared->u.atomic.u.f.esize != dst->shared->u.atomic.u.f.esize ||
src->shared->u.atomic.u.f.ebias != dst->shared->u.atomic.u.f.ebias ||
src->shared->u.atomic.u.f.mpos != dst->shared->u.atomic.u.f.mpos ||
src->shared->u.atomic.u.f.msize != dst->shared->u.atomic.u.f.msize ||
src->shared->u.atomic.u.f.norm != dst->shared->u.atomic.u.f.norm ||
src->shared->u.atomic.u.f.pad != dst->shared->u.atomic.u.f.pad)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
break;
case H5T_NO_CLASS:
case H5T_TIME:
case H5T_STRING:
case H5T_OPAQUE:
case H5T_COMPOUND:
case H5T_ENUM:
case H5T_VLEN:
case H5T_ARRAY:
case H5T_NCLASSES:
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
}
cdata->need_bkg = H5T_BKG_NO;
break;
case H5T_CONV_CONV:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(src->shared->type == H5T_REFERENCE) {
if(dst->shared->type != H5T_REFERENCE)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_REFERENCE datatype")
if(H5T_native_order_g == H5T_ORDER_LE)
break;
}
buf_stride = buf_stride ? buf_stride : src->shared->size;
switch(src->shared->size) {
case 1:
break;
case 2:
for(; nelmts >= 20; nelmts -= 20) {
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 1);
buf += buf_stride;
}
for(i = 0; i < nelmts; i++, buf += buf_stride)
H5_SWAP_BYTES(buf, 0, 1);
break;
case 4:
for(; nelmts >= 20; nelmts -= 20) {
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
buf += buf_stride;
}
for(i = 0; i < nelmts; i++, buf += buf_stride) {
H5_SWAP_BYTES(buf, 0, 3);
H5_SWAP_BYTES(buf, 1, 2);
}
break;
case 8:
for(; nelmts >= 10; nelmts -= 10) {
H5_SWAP_BYTES(buf, 0, 7);
H5_SWAP_BYTES(buf, 1, 6);
H5_SWAP_BYTES(buf, 2, 5);
H5_SWAP_BYTES(buf, 3, 4);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 7);
H5_SWAP_BYTES(buf, 1, 6);
H5_SWAP_BYTES(buf, 2, 5);
H5_SWAP_BYTES(buf, 3, 4);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 7);
H5_SWAP_BYTES(buf, 1, 6);
H5_SWAP_BYTES(buf, 2, 5);
H5_SWAP_BYTES(buf, 3, 4);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 7);
H5_SWAP_BYTES(buf, 1, 6);
H5_SWAP_BYTES(buf, 2, 5);
H5_SWAP_BYTES(buf, 3, 4);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 7);
H5_SWAP_BYTES(buf, 1, 6);
H5_SWAP_BYTES(buf, 2, 5);
H5_SWAP_BYTES(buf, 3, 4);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 7);
H5_SWAP_BYTES(buf, 1, 6);
H5_SWAP_BYTES(buf, 2, 5);
H5_SWAP_BYTES(buf, 3, 4);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 7);
H5_SWAP_BYTES(buf, 1, 6);
H5_SWAP_BYTES(buf, 2, 5);
H5_SWAP_BYTES(buf, 3, 4);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 7);
H5_SWAP_BYTES(buf, 1, 6);
H5_SWAP_BYTES(buf, 2, 5);
H5_SWAP_BYTES(buf, 3, 4);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 7);
H5_SWAP_BYTES(buf, 1, 6);
H5_SWAP_BYTES(buf, 2, 5);
H5_SWAP_BYTES(buf, 3, 4);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 7);
H5_SWAP_BYTES(buf, 1, 6);
H5_SWAP_BYTES(buf, 2, 5);
H5_SWAP_BYTES(buf, 3, 4);
buf += buf_stride;
}
for(i = 0; i < nelmts; i++, buf += buf_stride) {
H5_SWAP_BYTES(buf, 0, 7);
H5_SWAP_BYTES(buf, 1, 6);
H5_SWAP_BYTES(buf, 2, 5);
H5_SWAP_BYTES(buf, 3, 4);
}
break;
case 16:
for(; nelmts >= 10; nelmts -= 10) {
H5_SWAP_BYTES(buf, 0, 15);
H5_SWAP_BYTES(buf, 1, 14);
H5_SWAP_BYTES(buf, 2, 13);
H5_SWAP_BYTES(buf, 3, 12);
H5_SWAP_BYTES(buf, 4, 11);
H5_SWAP_BYTES(buf, 5, 10);
H5_SWAP_BYTES(buf, 6, 9);
H5_SWAP_BYTES(buf, 7, 8);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 15);
H5_SWAP_BYTES(buf, 1, 14);
H5_SWAP_BYTES(buf, 2, 13);
H5_SWAP_BYTES(buf, 3, 12);
H5_SWAP_BYTES(buf, 4, 11);
H5_SWAP_BYTES(buf, 5, 10);
H5_SWAP_BYTES(buf, 6, 9);
H5_SWAP_BYTES(buf, 7, 8);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 15);
H5_SWAP_BYTES(buf, 1, 14);
H5_SWAP_BYTES(buf, 2, 13);
H5_SWAP_BYTES(buf, 3, 12);
H5_SWAP_BYTES(buf, 4, 11);
H5_SWAP_BYTES(buf, 5, 10);
H5_SWAP_BYTES(buf, 6, 9);
H5_SWAP_BYTES(buf, 7, 8);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 15);
H5_SWAP_BYTES(buf, 1, 14);
H5_SWAP_BYTES(buf, 2, 13);
H5_SWAP_BYTES(buf, 3, 12);
H5_SWAP_BYTES(buf, 4, 11);
H5_SWAP_BYTES(buf, 5, 10);
H5_SWAP_BYTES(buf, 6, 9);
H5_SWAP_BYTES(buf, 7, 8);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 15);
H5_SWAP_BYTES(buf, 1, 14);
H5_SWAP_BYTES(buf, 2, 13);
H5_SWAP_BYTES(buf, 3, 12);
H5_SWAP_BYTES(buf, 4, 11);
H5_SWAP_BYTES(buf, 5, 10);
H5_SWAP_BYTES(buf, 6, 9);
H5_SWAP_BYTES(buf, 7, 8);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 15);
H5_SWAP_BYTES(buf, 1, 14);
H5_SWAP_BYTES(buf, 2, 13);
H5_SWAP_BYTES(buf, 3, 12);
H5_SWAP_BYTES(buf, 4, 11);
H5_SWAP_BYTES(buf, 5, 10);
H5_SWAP_BYTES(buf, 6, 9);
H5_SWAP_BYTES(buf, 7, 8);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 15);
H5_SWAP_BYTES(buf, 1, 14);
H5_SWAP_BYTES(buf, 2, 13);
H5_SWAP_BYTES(buf, 3, 12);
H5_SWAP_BYTES(buf, 4, 11);
H5_SWAP_BYTES(buf, 5, 10);
H5_SWAP_BYTES(buf, 6, 9);
H5_SWAP_BYTES(buf, 7, 8);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 15);
H5_SWAP_BYTES(buf, 1, 14);
H5_SWAP_BYTES(buf, 2, 13);
H5_SWAP_BYTES(buf, 3, 12);
H5_SWAP_BYTES(buf, 4, 11);
H5_SWAP_BYTES(buf, 5, 10);
H5_SWAP_BYTES(buf, 6, 9);
H5_SWAP_BYTES(buf, 7, 8);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 15);
H5_SWAP_BYTES(buf, 1, 14);
H5_SWAP_BYTES(buf, 2, 13);
H5_SWAP_BYTES(buf, 3, 12);
H5_SWAP_BYTES(buf, 4, 11);
H5_SWAP_BYTES(buf, 5, 10);
H5_SWAP_BYTES(buf, 6, 9);
H5_SWAP_BYTES(buf, 7, 8);
buf += buf_stride;
H5_SWAP_BYTES(buf, 0, 15);
H5_SWAP_BYTES(buf, 1, 14);
H5_SWAP_BYTES(buf, 2, 13);
H5_SWAP_BYTES(buf, 3, 12);
H5_SWAP_BYTES(buf, 4, 11);
H5_SWAP_BYTES(buf, 5, 10);
H5_SWAP_BYTES(buf, 6, 9);
H5_SWAP_BYTES(buf, 7, 8);
buf += buf_stride;
}
for(i = 0; i < nelmts; i++, buf += buf_stride) {
H5_SWAP_BYTES(buf, 0, 15);
H5_SWAP_BYTES(buf, 1, 14);
H5_SWAP_BYTES(buf, 2, 13);
H5_SWAP_BYTES(buf, 3, 12);
H5_SWAP_BYTES(buf, 4, 11);
H5_SWAP_BYTES(buf, 5, 10);
H5_SWAP_BYTES(buf, 6, 9);
H5_SWAP_BYTES(buf, 7, 8);
}
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "invalid conversion size")
}
break;
case H5T_CONV_FREE:
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
}
done:
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5T__conv_order(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *_buf,
void H5_ATTR_UNUSED *background)
{
uint8_t *buf = (uint8_t*)_buf;
H5T_t *src = NULL;
H5T_t *dst = NULL;
size_t i;
size_t j, md;
herr_t ret_value = SUCCEED;
FUNC_ENTER_PACKAGE
switch(cdata->command) {
case H5T_CONV_INIT:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) ||
NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(src->shared->size != dst->shared->size || 0 != src->shared->u.atomic.offset ||
0 != dst->shared->u.atomic.offset ||
!((H5T_ORDER_BE == src->shared->u.atomic.order &&
H5T_ORDER_LE == dst->shared->u.atomic.order) ||
(H5T_ORDER_LE == src->shared->u.atomic.order &&
H5T_ORDER_BE == dst->shared->u.atomic.order)))
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
switch(src->shared->type) {
case H5T_INTEGER:
case H5T_BITFIELD:
break;
case H5T_FLOAT:
if(src->shared->u.atomic.u.f.sign != dst->shared->u.atomic.u.f.sign ||
src->shared->u.atomic.u.f.epos != dst->shared->u.atomic.u.f.epos ||
src->shared->u.atomic.u.f.esize != dst->shared->u.atomic.u.f.esize ||
src->shared->u.atomic.u.f.ebias != dst->shared->u.atomic.u.f.ebias ||
src->shared->u.atomic.u.f.mpos != dst->shared->u.atomic.u.f.mpos ||
src->shared->u.atomic.u.f.msize != dst->shared->u.atomic.u.f.msize ||
src->shared->u.atomic.u.f.norm != dst->shared->u.atomic.u.f.norm ||
src->shared->u.atomic.u.f.pad != dst->shared->u.atomic.u.f.pad) {
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
}
break;
case H5T_NO_CLASS:
case H5T_TIME:
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_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported")
}
cdata->need_bkg = H5T_BKG_NO;
break;
case H5T_CONV_CONV:
if(NULL == (src = (H5T_t *)H5I_object(src_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
buf_stride = buf_stride ? buf_stride : src->shared->size;
md = src->shared->size / 2;
for(i = 0; i < nelmts; i++, buf += buf_stride)
for(j = 0; j < md; j++)
H5_SWAP_BYTES(buf, j, src->shared->size - (j + 1));
break;
case H5T_CONV_FREE:
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
}
done:
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5T__conv_b_b(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *_buf,
void H5_ATTR_UNUSED *background)
{
uint8_t *buf = (uint8_t*)_buf;
H5T_t *src = NULL, *dst = NULL;
ssize_t direction;
size_t elmtno;
size_t olap;
size_t half_size;
uint8_t *s, *sp, *d, *dp;
uint8_t dbuf[256];
size_t msb_pad_offset;
size_t i;
uint8_t *src_rev=NULL;
H5T_conv_cb_t cb_struct = {NULL, NULL};
H5T_conv_ret_t except_ret;
hbool_t reverse;
herr_t ret_value = SUCCEED;
FUNC_ENTER_PACKAGE
switch(cdata->command) {
case H5T_CONV_INIT:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) ||
NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(H5T_ORDER_LE != src->shared->u.atomic.order &&
H5T_ORDER_BE != src->shared->u.atomic.order)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
if(H5T_ORDER_LE != dst->shared->u.atomic.order &&
H5T_ORDER_BE != dst->shared->u.atomic.order)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
cdata->need_bkg = H5T_BKG_NO;
break;
case H5T_CONV_FREE:
break;
case H5T_CONV_CONV:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(src->shared->size == dst->shared->size || buf_stride) {
sp = dp = (uint8_t*)buf;
direction = 1;
olap = nelmts;
} else if(src->shared->size >= dst->shared->size) {
double olap_d = HDceil((double)(dst->shared->size) /
(double)(src->shared->size - dst->shared->size));
olap = (size_t)olap_d;
sp = dp = (uint8_t*)buf;
direction = 1;
} else {
double olap_d = HDceil((double)(src->shared->size) /
(double)(dst->shared->size - src->shared->size));
olap = (size_t)olap_d;
sp = (uint8_t*)buf + (nelmts-1) * src->shared->size;
dp = (uint8_t*)buf + (nelmts-1) * dst->shared->size;
direction = -1;
}
if(H5CX_get_dt_conv_cb(&cb_struct) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "unable to get conversion exception callback")
src_rev = (uint8_t *)H5MM_calloc(src->shared->size);
H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t);
H5_CHECK_OVERFLOW(src->shared->size, size_t, ssize_t);
H5_CHECK_OVERFLOW(dst->shared->size, size_t, ssize_t);
for(elmtno = 0; elmtno < nelmts; elmtno++) {
if(direction > 0) {
s = sp;
d = elmtno < olap ? dbuf : dp;
}
else {
s = sp;
d = (elmtno + olap) >= nelmts ? dbuf : dp;
}
#ifndef NDEBUG
if(d == dbuf)
HDassert((dp >= sp && dp < sp + src->shared->size) ||
(sp >= dp && sp < dp + dst->shared->size));
else
HDassert((dp < sp && dp + dst->shared->size<=sp) ||
(sp < dp && sp + src->shared->size<=dp));
#endif
if(H5T_ORDER_BE == src->shared->u.atomic.order) {
half_size = src->shared->size / 2;
for(i = 0; i < half_size; i++) {
uint8_t tmp = s[src->shared->size - (i + 1)];
s[src->shared->size - (i + 1)] = s[i];
s[i] = tmp;
}
}
except_ret = H5T_CONV_UNHANDLED;
reverse = TRUE;
if(src->shared->u.atomic.prec > dst->shared->u.atomic.prec) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src->shared->size, src->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
H5T__bit_copy(d, dst->shared->u.atomic.offset,
s, src->shared->u.atomic.offset, dst->shared->u.atomic.prec);
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED)
reverse = FALSE;
} else {
H5T__bit_copy(d, dst->shared->u.atomic.offset,
s, src->shared->u.atomic.offset,
src->shared->u.atomic.prec);
H5T__bit_set(d, dst->shared->u.atomic.offset+src->shared->u.atomic.prec,
dst->shared->u.atomic.prec-src->shared->u.atomic.prec, FALSE);
}
switch(dst->shared->u.atomic.lsb_pad) {
case H5T_PAD_ZERO:
H5T__bit_set(d, (size_t)0, dst->shared->u.atomic.offset, FALSE);
break;
case H5T_PAD_ONE:
H5T__bit_set(d, (size_t)0, dst->shared->u.atomic.offset, TRUE);
break;
case H5T_PAD_ERROR:
case H5T_PAD_BACKGROUND:
case H5T_NPAD:
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported LSB padding")
}
msb_pad_offset = dst->shared->u.atomic.offset + dst->shared->u.atomic.prec;
switch(dst->shared->u.atomic.msb_pad) {
case H5T_PAD_ZERO:
H5T__bit_set(d, msb_pad_offset, 8 * dst->shared->size - msb_pad_offset, FALSE);
break;
case H5T_PAD_ONE:
H5T__bit_set(d, msb_pad_offset, 8 * dst->shared->size - msb_pad_offset, TRUE);
break;
case H5T_PAD_ERROR:
case H5T_PAD_BACKGROUND:
case H5T_NPAD:
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported MSB padding")
}
if(H5T_ORDER_BE == dst->shared->u.atomic.order && reverse) {
half_size = dst->shared->size / 2;
for(i = 0; i < half_size; i++) {
uint8_t tmp = d[dst->shared->size - (i + 1)];
d[dst->shared->size - (i + 1)] = d[i];
d[i] = tmp;
}
}
if(d == dbuf)
H5MM_memcpy(dp, d, dst->shared->size);
if(buf_stride) {
sp += direction * (ssize_t)buf_stride;
dp += direction * (ssize_t)buf_stride;
}
else {
sp += direction * (ssize_t)src->shared->size;
dp += direction * (ssize_t)dst->shared->size;
}
}
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
}
done:
if(src_rev)
H5MM_free(src_rev);
FUNC_LEAVE_NOAPI(ret_value)
}
static H5T_conv_struct_t *
H5T_conv_struct_free(H5T_conv_struct_t *priv)
{
int *src2dst = priv->src2dst;
hid_t *src_memb_id = priv->src_memb_id,
*dst_memb_id = priv->dst_memb_id;
unsigned i;
FUNC_ENTER_NOAPI_NOINIT_NOERR
for(i = 0; i < priv->src_nmembs; i++)
if(src2dst[i] >= 0) {
int status;
status = H5I_dec_ref(src_memb_id[i]);
HDassert(status >= 0);
status = H5I_dec_ref(dst_memb_id[src2dst[i]]);
HDassert(status >= 0);
}
H5MM_xfree(src2dst);
H5MM_xfree(src_memb_id);
H5MM_xfree(dst_memb_id);
H5MM_xfree(priv->memb_path);
FUNC_LEAVE_NOAPI((H5T_conv_struct_t *)H5MM_xfree(priv))
}
static herr_t
H5T_conv_struct_init(H5T_t *src, H5T_t *dst, H5T_cdata_t *cdata)
{
H5T_conv_struct_t *priv = (H5T_conv_struct_t*)(cdata->priv);
int *src2dst = NULL;
unsigned src_nmembs, dst_nmembs;
unsigned i, j;
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI_NOINIT
src_nmembs = src->shared->u.compnd.nmembs;
dst_nmembs = dst->shared->u.compnd.nmembs;
if(!priv) {
if(NULL == (priv = (H5T_conv_struct_t *)(cdata->priv=H5MM_calloc(sizeof(H5T_conv_struct_t)))) ||
NULL == (priv->src2dst = (int *)H5MM_malloc(src_nmembs * sizeof(int))) ||
NULL == (priv->src_memb_id = (hid_t *)H5MM_malloc(src_nmembs * sizeof(hid_t))) ||
NULL == (priv->dst_memb_id = (hid_t *)H5MM_malloc(dst_nmembs * sizeof(hid_t))))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
src2dst = priv->src2dst;
priv->src_nmembs = src_nmembs;
priv->subset_info.subset = H5T_SUBSET_FALSE;
priv->subset_info.copy_size = 0;
H5T__sort_value(src, NULL);
H5T__sort_value(dst, NULL);
for(i = 0; i < src_nmembs; i++) {
src2dst[i] = -1;
for(j = 0; j < dst_nmembs; j++) {
if(!HDstrcmp(src->shared->u.compnd.memb[i].name, dst->shared->u.compnd.memb[j].name)) {
H5_CHECKED_ASSIGN(src2dst[i], int, j, unsigned);
break;
}
}
if(src2dst[i] >= 0) {
hid_t tid;
H5T_t *type;
type = H5T_copy(src->shared->u.compnd.memb[i].type, H5T_COPY_ALL);
tid = H5I_register(H5I_DATATYPE, type, FALSE);
HDassert(tid >= 0);
priv->src_memb_id[i] = tid;
type = H5T_copy(dst->shared->u.compnd.memb[src2dst[i]].type, H5T_COPY_ALL);
tid = H5I_register(H5I_DATATYPE, type, FALSE);
HDassert(tid >= 0);
priv->dst_memb_id[src2dst[i]] = tid;
}
}
}
else {
H5T__sort_value(src, NULL);
H5T__sort_value(dst, NULL);
}
src2dst = priv->src2dst;
H5MM_xfree(priv->memb_path);
if(NULL == (priv->memb_path = (H5T_path_t **)H5MM_malloc(src->shared->u.compnd.nmembs * sizeof(H5T_path_t*))))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
for(i = 0; i < src_nmembs; i++) {
if(src2dst[i] >= 0) {
H5T_path_t *tpath = H5T_path_find(src->shared->u.compnd.memb[i].type, dst->shared->u.compnd.memb[src2dst[i]].type);
if(NULL == (priv->memb_path[i] = tpath)) {
cdata->priv = H5T_conv_struct_free(priv);
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unable to convert member datatype")
}
}
}
cdata->need_bkg = H5T_BKG_YES;
if(src_nmembs < dst_nmembs) {
priv->subset_info.subset = H5T_SUBSET_SRC;
for(i = 0; i < src_nmembs; i++) {
if(src2dst[i] != (int)i || (src->shared->u.compnd.memb[i].offset != dst->shared->u.compnd.memb[i].offset) || (priv->memb_path[i])->is_noop == FALSE) {
priv->subset_info.subset = H5T_SUBSET_FALSE;
break;
}
}
if(priv->subset_info.subset == H5T_SUBSET_SRC)
priv->subset_info.copy_size = src->shared->u.compnd.memb[src_nmembs - 1].offset
+ src->shared->u.compnd.memb[src_nmembs - 1].size;
} else if(dst_nmembs < src_nmembs) {
priv->subset_info.subset = H5T_SUBSET_DST;
for(i = 0; i < dst_nmembs; i++) {
if(src2dst[i] != (int)i || (src->shared->u.compnd.memb[i].offset != dst->shared->u.compnd.memb[i].offset) || (priv->memb_path[i])->is_noop == FALSE) {
priv->subset_info.subset = H5T_SUBSET_FALSE;
break;
}
}
if(priv->subset_info.subset == H5T_SUBSET_DST)
priv->subset_info.copy_size = dst->shared->u.compnd.memb[dst_nmembs-1].offset
+ dst->shared->u.compnd.memb[dst_nmembs-1].size;
} else
{;}
cdata->recalc = FALSE;
done:
FUNC_LEAVE_NOAPI(ret_value)
}
H5T_subset_info_t *
H5T__conv_struct_subset(const H5T_cdata_t *cdata)
{
H5T_conv_struct_t *priv = NULL;
FUNC_ENTER_PACKAGE_NOERR
HDassert(cdata);
HDassert(cdata->priv);
priv = (H5T_conv_struct_t *)(cdata->priv);
FUNC_LEAVE_NOAPI((H5T_subset_info_t *) &priv->subset_info)
}
herr_t
H5T__conv_struct(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
size_t buf_stride, size_t bkg_stride, void *_buf, void *_bkg)
{
uint8_t *buf = (uint8_t *)_buf;
uint8_t *bkg = (uint8_t *)_bkg;
uint8_t *xbuf = buf, *xbkg = bkg;
H5T_t *src = NULL;
H5T_t *dst = NULL;
int *src2dst = NULL;
H5T_cmemb_t *src_memb = NULL;
H5T_cmemb_t *dst_memb = NULL;
size_t offset;
ssize_t src_delta;
ssize_t bkg_delta;
size_t elmtno;
unsigned u;
int i;
H5T_conv_struct_t *priv = (H5T_conv_struct_t *)(cdata->priv);
herr_t ret_value = SUCCEED;
FUNC_ENTER_PACKAGE
switch(cdata->command) {
case H5T_CONV_INIT:
if (NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a datatype")
if(H5T_COMPOUND != src->shared->type)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_COMPOUND datatype")
if(H5T_COMPOUND != dst->shared->type)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_COMPOUND datatype")
if(H5T_conv_struct_init(src, dst, cdata) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize conversion data")
break;
case H5T_CONV_FREE:
cdata->priv = H5T_conv_struct_free(priv);
break;
case H5T_CONV_CONV:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a datatype")
HDassert(priv);
HDassert(bkg && cdata->need_bkg);
if(cdata->recalc && H5T_conv_struct_init(src, dst, cdata) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize conversion data")
H5T__sort_value(src, NULL);
H5T__sort_value(dst, NULL);
src2dst = priv->src2dst;
if(buf_stride) {
H5_CHECKED_ASSIGN(src_delta, ssize_t, buf_stride, size_t);
if(!bkg_stride) {
H5_CHECKED_ASSIGN(bkg_delta, ssize_t, dst->shared->size, size_t);
}
else
H5_CHECKED_ASSIGN(bkg_delta, ssize_t, bkg_stride, size_t);
}
else if(dst->shared->size <= src->shared->size) {
H5_CHECKED_ASSIGN(src_delta, ssize_t, src->shared->size, size_t);
H5_CHECKED_ASSIGN(bkg_delta, ssize_t, dst->shared->size, size_t);
}
else {
H5_CHECK_OVERFLOW(src->shared->size, size_t, ssize_t);
src_delta = -(ssize_t)src->shared->size;
H5_CHECK_OVERFLOW(dst->shared->size, size_t, ssize_t);
bkg_delta = -(ssize_t)dst->shared->size;
xbuf += (nelmts - 1) * src->shared->size;
xbkg += (nelmts - 1) * dst->shared->size;
}
for(elmtno = 0; elmtno < nelmts; elmtno++) {
for(u = 0, offset = 0; u < src->shared->u.compnd.nmembs; u++) {
if(src2dst[u] < 0)
continue;
src_memb = src->shared->u.compnd.memb + u;
dst_memb = dst->shared->u.compnd.memb + src2dst[u];
if(dst_memb->size <= src_memb->size) {
if(H5T_convert(priv->memb_path[u], priv->src_memb_id[u],
priv->dst_memb_id[src2dst[u]],
(size_t)1, (size_t)0, (size_t)0,
xbuf + src_memb->offset, xbkg + dst_memb->offset) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert compound datatype member")
HDmemmove(xbuf + offset, xbuf + src_memb->offset, dst_memb->size);
offset += dst_memb->size;
}
else {
HDmemmove (xbuf+offset, xbuf+src_memb->offset,
src_memb->size);
offset += src_memb->size;
}
}
H5_CHECK_OVERFLOW(src->shared->u.compnd.nmembs, size_t, int);
for(i = (int)src->shared->u.compnd.nmembs - 1; i >= 0; --i) {
if(src2dst[i] < 0)
continue;
src_memb = src->shared->u.compnd.memb + i;
dst_memb = dst->shared->u.compnd.memb + src2dst[i];
if(dst_memb->size > src_memb->size) {
offset -= src_memb->size;
if(H5T_convert(priv->memb_path[i],
priv->src_memb_id[i], priv->dst_memb_id[src2dst[i]],
(size_t)1, (size_t)0, (size_t)0,
xbuf + offset, xbkg + dst_memb->offset) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert compound datatype member")
}
else
offset -= dst_memb->size;
HDmemmove(xbkg + dst_memb->offset, xbuf + offset, dst_memb->size);
}
HDassert(0 == offset);
xbuf += src_delta;
xbkg += bkg_delta;
}
if(buf_stride == 0 && dst->shared->size > src->shared->size)
H5_CHECKED_ASSIGN(bkg_delta, ssize_t, dst->shared->size, size_t);
for(xbuf = buf, xbkg = bkg, elmtno = 0; elmtno < nelmts; elmtno++) {
HDmemmove(xbuf, xbkg, dst->shared->size);
xbuf += buf_stride ? buf_stride : dst->shared->size;
xbkg += bkg_delta;
}
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
}
done:
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5T__conv_struct_opt(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t bkg_stride, void *_buf, void *_bkg)
{
uint8_t *buf = (uint8_t *)_buf;
uint8_t *bkg = (uint8_t *)_bkg;
uint8_t *xbuf = NULL;
uint8_t *xbkg = NULL;
H5T_t *src = NULL;
H5T_t *dst = NULL;
int *src2dst = NULL;
H5T_cmemb_t *src_memb = NULL;
H5T_cmemb_t *dst_memb = NULL;
size_t offset;
size_t elmtno;
size_t copy_size;
H5T_conv_struct_t *priv = NULL;
hbool_t no_stride = FALSE;
unsigned u;
int i;
herr_t ret_value = SUCCEED;
FUNC_ENTER_PACKAGE
switch(cdata->command) {
case H5T_CONV_INIT:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(H5T_COMPOUND != src->shared->type)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_COMPOUND datatype")
if(H5T_COMPOUND != dst->shared->type)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_COMPOUND datatype")
if(H5T_conv_struct_init(src, dst, cdata) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize conversion data")
priv = (H5T_conv_struct_t *)(cdata->priv);
src2dst = priv->src2dst;
if(dst->shared->size > src->shared->size) {
for(u = 0, offset = 0; u < src->shared->u.compnd.nmembs; u++) {
if(src2dst[u] < 0)
continue;
src_memb = src->shared->u.compnd.memb + u;
dst_memb = dst->shared->u.compnd.memb + src2dst[u];
if(dst_memb->size > src_memb->size)
offset += src_memb->size;
}
H5_CHECK_OVERFLOW(src->shared->u.compnd.nmembs, size_t, int);
for(i = (int)src->shared->u.compnd.nmembs - 1; i >= 0; --i) {
if(src2dst[i] < 0)
continue;
src_memb = src->shared->u.compnd.memb + i;
dst_memb = dst->shared->u.compnd.memb + src2dst[i];
if(dst_memb->size > src_memb->size) {
offset -= src_memb->size;
if(dst_memb->size > src->shared->size-offset) {
cdata->priv = H5T_conv_struct_free(priv);
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion is unsupported by this function")
}
}
}
}
break;
case H5T_CONV_FREE:
cdata->priv = H5T_conv_struct_free((H5T_conv_struct_t *)(cdata->priv));
break;
case H5T_CONV_CONV:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(cdata->recalc && H5T_conv_struct_init(src, dst, cdata) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize conversion data")
priv = (H5T_conv_struct_t *)(cdata->priv);
HDassert(priv);
src2dst = priv->src2dst;
HDassert(bkg && cdata->need_bkg);
H5T__sort_value(src, NULL);
H5T__sort_value(dst, NULL);
if(!buf_stride || !bkg_stride)
bkg_stride = dst->shared->size;
if(!buf_stride) {
no_stride = TRUE;
buf_stride = src->shared->size;
}
if(priv->subset_info.subset == H5T_SUBSET_SRC || priv->subset_info.subset == H5T_SUBSET_DST) {
xbuf = buf;
xbkg = bkg;
copy_size = priv->subset_info.copy_size;
for(elmtno = 0; elmtno < nelmts; elmtno++) {
HDmemmove(xbkg, xbuf, copy_size);
xbuf += buf_stride;
xbkg += bkg_stride;
}
}
else {
for(u = 0, offset = 0; u < src->shared->u.compnd.nmembs; u++) {
if(src2dst[u] < 0)
continue;
src_memb = src->shared->u.compnd.memb + u;
dst_memb = dst->shared->u.compnd.memb + src2dst[u];
if(dst_memb->size <= src_memb->size) {
xbuf = buf + src_memb->offset;
xbkg = bkg + dst_memb->offset;
if(H5T_convert(priv->memb_path[u], priv->src_memb_id[u],
priv->dst_memb_id[src2dst[u]], nelmts,
buf_stride, bkg_stride, xbuf, xbkg) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert compound datatype member")
for(elmtno = 0; elmtno < nelmts; elmtno++) {
HDmemmove(xbkg, xbuf, dst_memb->size);
xbuf += buf_stride;
xbkg += bkg_stride;
}
}
else {
for(xbuf = buf, elmtno = 0; elmtno < nelmts; elmtno++) {
HDmemmove(xbuf + offset, xbuf + src_memb->offset, src_memb->size);
xbuf += buf_stride;
}
offset += src_memb->size;
}
}
H5_CHECK_OVERFLOW(src->shared->u.compnd.nmembs, size_t, int);
for(i = (int)src->shared->u.compnd.nmembs - 1; i >= 0; --i) {
if(src2dst[i] < 0)
continue;
src_memb = src->shared->u.compnd.memb + i;
dst_memb = dst->shared->u.compnd.memb + src2dst[i];
if(dst_memb->size > src_memb->size) {
offset -= src_memb->size;
xbuf = buf + offset;
xbkg = bkg + dst_memb->offset;
if(H5T_convert(priv->memb_path[i], priv->src_memb_id[i],
priv->dst_memb_id[src2dst[i]], nelmts,
buf_stride, bkg_stride, xbuf, xbkg) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert compound datatype member")
for(elmtno = 0; elmtno < nelmts; elmtno++) {
HDmemmove(xbkg, xbuf, dst_memb->size);
xbuf += buf_stride;
xbkg += bkg_stride;
}
}
}
}
if(no_stride)
buf_stride = dst->shared->size;
for(xbuf = buf, xbkg = bkg, elmtno = 0; elmtno < nelmts; elmtno++) {
HDmemmove(xbuf, xbkg, dst->shared->size);
xbuf += buf_stride;
xbkg += bkg_stride;
}
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
}
done:
FUNC_LEAVE_NOAPI(ret_value)
}
static herr_t
H5T_conv_enum_init(H5T_t *src, H5T_t *dst, H5T_cdata_t *cdata)
{
H5T_enum_struct_t *priv = NULL;
int n;
int domain[2] = {0, 0};
int *map = NULL;
unsigned length;
unsigned i, j;
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI_NOINIT
cdata->need_bkg = H5T_BKG_NO;
if(NULL == (priv = (H5T_enum_struct_t *)(cdata->priv = H5MM_calloc(sizeof(*priv)))))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
if(0 == src->shared->u.enumer.nmembs)
HGOTO_DONE(SUCCEED);
H5T__sort_name(src, NULL);
H5T__sort_name(dst, NULL);
if(NULL == (priv->src2dst = (int *)H5MM_malloc(src->shared->u.enumer.nmembs * sizeof(int))))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
for(i = 0, j = 0;
i < src->shared->u.enumer.nmembs && j < dst->shared->u.enumer.nmembs;
i++, j++) {
while(j < dst->shared->u.enumer.nmembs &&
HDstrcmp(src->shared->u.enumer.name[i], dst->shared->u.enumer.name[j]))
j++;
if(j >= dst->shared->u.enumer.nmembs)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "source type is not a subset of destination type")
priv->src2dst[i] = (int)j;
}
if(1 == src->shared->size || sizeof(short) == src->shared->size || sizeof(int) == src->shared->size) {
for(i = 0; i < src->shared->u.enumer.nmembs; i++) {
if(1 == src->shared->size)
n = *((signed char *)(src->shared->u.enumer.value + i));
else if (sizeof(short) == src->shared->size)
n = *((short *)(src->shared->u.enumer.value + i * src->shared->size));
else
n = *((int *)(src->shared->u.enumer.value + i * src->shared->size));
if(0 == i) {
domain[0] = domain[1] = n;
} else {
domain[0] = MIN(domain[0], n);
domain[1] = MAX(domain[1], n);
}
}
HDassert(domain[1] >= domain[0]);
length = (unsigned)(domain[1] - domain[0]) + 1;
if(src->shared->u.enumer.nmembs < 2 ||
(double)length / src->shared->u.enumer.nmembs < (double)(1.2f)) {
priv->base = domain[0];
priv->length = length;
if(NULL == (map = (int *)H5MM_malloc(length * sizeof(int))))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
for(i = 0; i < length; i++)
map[i] = -1;
for(i = 0; i < src->shared->u.enumer.nmembs; i++) {
if(1 == src->shared->size)
n = *((signed char *)(src->shared->u.enumer.value + i));
else if(sizeof(short) == src->shared->size)
n = *((short *)(src->shared->u.enumer.value + i * src->shared->size));
else
n = *((int *)(src->shared->u.enumer.value + i * src->shared->size));
n -= priv->base;
HDassert(n >= 0 && (unsigned)n < priv->length);
HDassert(map[n] < 0);
map[n] = priv->src2dst[i];
}
H5MM_xfree(priv->src2dst);
priv->src2dst = map;
HGOTO_DONE(SUCCEED);
}
}
H5T__sort_value(src, priv->src2dst);
done:
if (ret_value<0 && priv) {
H5MM_xfree(priv->src2dst);
H5MM_xfree(priv);
cdata->priv = NULL;
}
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5T__conv_enum(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *_buf,
void H5_ATTR_UNUSED *bkg)
{
uint8_t *buf = (uint8_t*)_buf;
H5T_t *src = NULL, *dst = NULL;
uint8_t *s = NULL, *d = NULL;
ssize_t src_delta, dst_delta;
int n;
H5T_enum_struct_t *priv = (H5T_enum_struct_t*)(cdata->priv);
H5T_conv_cb_t cb_struct;
H5T_conv_ret_t except_ret;
size_t i;
herr_t ret_value = SUCCEED;
FUNC_ENTER_PACKAGE
switch(cdata->command) {
case H5T_CONV_INIT:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a datatype")
if(H5T_ENUM != src->shared->type)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_ENUM datatype")
if(H5T_ENUM != dst->shared->type)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_ENUM datatype")
if(H5T_conv_enum_init(src, dst, cdata) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize private data")
break;
case H5T_CONV_FREE:
#ifdef H5T_DEBUG
if (H5DEBUG(T)) {
HDfprintf(H5DEBUG(T), " Using %s mapping function%s\n",
priv->length?"O(1)":"O(log N)",
priv->length?"":", where N is the number of enum members");
}
#endif
if (priv) {
H5MM_xfree(priv->src2dst);
H5MM_xfree(priv);
}
cdata->priv = NULL;
break;
case H5T_CONV_CONV:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(H5T_ENUM != src->shared->type)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_ENUM datatype")
if(H5T_ENUM != dst->shared->type)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_ENUM datatype")
H5T__sort_name(dst, NULL);
if(!priv->length)
H5T__sort_value(src, NULL);
if(buf_stride) {
H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t);
src_delta = dst_delta = (ssize_t)buf_stride;
s = d = buf;
} else if(dst->shared->size <= src->shared->size) {
H5_CHECKED_ASSIGN(src_delta, ssize_t, src->shared->size, size_t);
H5_CHECKED_ASSIGN(dst_delta, ssize_t, dst->shared->size, size_t);
s = d = buf;
} else {
H5_CHECK_OVERFLOW(src->shared->size, size_t, ssize_t);
H5_CHECK_OVERFLOW(dst->shared->size, size_t, ssize_t);
src_delta = -(ssize_t)src->shared->size;
dst_delta = -(ssize_t)dst->shared->size;
s = buf + (nelmts - 1) * src->shared->size;
d = buf + (nelmts - 1) * dst->shared->size;
}
if(H5CX_get_dt_conv_cb(&cb_struct) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "unable to get conversion exception callback")
for(i = 0; i < nelmts; i++, s += src_delta, d += dst_delta) {
if(priv->length) {
if(1 == src->shared->size)
n = *((signed char*)s);
else if(sizeof(short) == src->shared->size)
n = *((short*)s);
else
n = *((int*)s);
n -= priv->base;
if(n < 0 || (unsigned)n >= priv->length || priv->src2dst[n] < 0) {
except_ret = H5T_CONV_UNHANDLED;
if(cb_struct.func)
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)
HDmemset(d, 0xff, dst->shared->size);
else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
} else
H5MM_memcpy(d,
dst->shared->u.enumer.value + (unsigned)priv->src2dst[n] * dst->shared->size,
dst->shared->size);
}
else {
unsigned lt = 0;
unsigned rt = src->shared->u.enumer.nmembs;
unsigned md = 0;
int cmp;
while(lt < rt) {
md = (lt + rt) / 2;
cmp = HDmemcmp(s, src->shared->u.enumer.value + md * src->shared->size,
src->shared->size);
if(cmp < 0)
rt = md;
else if(cmp > 0)
lt = md + 1;
else
break;
}
if(lt >= rt) {
except_ret = H5T_CONV_UNHANDLED;
if(cb_struct.func)
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
src, d, cb_struct.user_data);
if(except_ret == H5T_CONV_UNHANDLED)
HDmemset(d, 0xff, dst->shared->size);
else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
}
else {
HDassert(priv->src2dst[md] >= 0);
H5MM_memcpy(d,
dst->shared->u.enumer.value + (unsigned)priv->src2dst[md] * dst->shared->size,
dst->shared->size);
}
}
}
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
}
done:
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5T__conv_enum_numeric(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
size_t H5_ATTR_UNUSED buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *_buf,
void H5_ATTR_UNUSED *bkg)
{
H5T_t *src, *dst;
H5T_t *src_parent;
hid_t src_parent_id = -1;
H5T_path_t *tpath;
herr_t ret_value = SUCCEED;
FUNC_ENTER_PACKAGE
switch(cdata->command) {
case H5T_CONV_INIT:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a datatype")
if(H5T_ENUM != src->shared->type)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "source type is not a H5T_ENUM datatype")
if(H5T_INTEGER != dst->shared->type && H5T_FLOAT != dst->shared->type)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "destination is not an integer type")
cdata->need_bkg = H5T_BKG_NO;
break;
case H5T_CONV_FREE:
break;
case H5T_CONV_CONV:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
src_parent = src->shared->parent;
if(NULL == (tpath = H5T_path_find(src_parent, dst))) {
HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest datatype")
} else if(!H5T_path_noop(tpath)) {
if((src_parent_id = H5I_register(H5I_DATATYPE, H5T_copy(src_parent, H5T_COPY_ALL), FALSE)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
if(H5T_convert(tpath, src_parent_id, dst_id, nelmts, buf_stride, bkg_stride, _buf, bkg) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "datatype conversion failed")
}
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
}
done:
if(src_parent_id >= 0)
H5I_dec_ref(src_parent_id);
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5T__conv_vlen(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
size_t buf_stride, size_t bkg_stride, void *buf, void *bkg)
{
H5T_vlen_alloc_info_t vl_alloc_info;
H5T_path_t *tpath = NULL;
hbool_t noop_conv = FALSE;
hbool_t write_to_file = FALSE;
htri_t parent_is_vlen;
hid_t tsrc_id = -1, tdst_id = -1;
H5T_t *src = NULL;
H5T_t *dst = NULL;
H5HG_t bg_hobjid, parent_hobjid;
uint8_t *s = NULL;
uint8_t *d = NULL;
uint8_t *b = NULL;
ssize_t s_stride, d_stride;
ssize_t b_stride;
size_t safe;
size_t bg_seq_len = 0;
size_t src_base_size, dst_base_size;
void *conv_buf = NULL;
size_t conv_buf_size = 0;
void *tmp_buf = NULL;
size_t tmp_buf_size = 0;
hbool_t nested = FALSE;
size_t elmtno;
herr_t ret_value = SUCCEED;
FUNC_ENTER_PACKAGE
switch(cdata->command) {
case H5T_CONV_INIT:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a datatype")
if(H5T_VLEN != src->shared->type)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_VLEN datatype")
if(H5T_VLEN != dst->shared->type)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a H5T_VLEN datatype")
if(H5T_VLEN_STRING == src->shared->u.vlen.type && H5T_VLEN_STRING == dst->shared->u.vlen.type) {
if((H5T_CSET_ASCII == src->shared->u.vlen.cset && H5T_CSET_UTF8 == dst->shared->u.vlen.cset)
|| (H5T_CSET_ASCII == dst->shared->u.vlen.cset && H5T_CSET_UTF8 == src->shared->u.vlen.cset))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "The library doesn't convert between strings of ASCII and UTF")
}
cdata->need_bkg = H5T_BKG_NO;
break;
case H5T_CONV_FREE:
break;
case H5T_CONV_CONV:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(buf_stride) {
HDassert(buf_stride >= src->shared->size);
HDassert(buf_stride >= dst->shared->size);
H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t);
s_stride = d_stride = (ssize_t)buf_stride;
}
else {
H5_CHECK_OVERFLOW(src->shared->size, size_t, ssize_t);
H5_CHECK_OVERFLOW(dst->shared->size, size_t, ssize_t);
s_stride = (ssize_t)src->shared->size;
d_stride = (ssize_t)dst->shared->size;
}
if(bkg) {
if(bkg_stride)
b_stride = (ssize_t)bkg_stride;
else
b_stride = d_stride;
}
else
b_stride = 0;
src_base_size = H5T_get_size(src->shared->parent);
dst_base_size = H5T_get_size(dst->shared->parent);
if(NULL == (tpath = H5T_path_find(src->shared->parent, dst->shared->parent)))
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest datatypes")
else if(!H5T_path_noop(tpath)) {
if((tsrc_id = H5I_register(H5I_DATATYPE, H5T_copy(src->shared->parent, H5T_COPY_ALL), FALSE)) < 0 ||
(tdst_id = H5I_register(H5I_DATATYPE, H5T_copy(dst->shared->parent, H5T_COPY_ALL), FALSE)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
}
else
noop_conv = TRUE;
if((parent_is_vlen = H5T_detect_class(dst->shared->parent, H5T_VLEN, FALSE)) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_SYSTEM, FAIL, "internal error when detecting variable-length class")
if(tpath->cdata.need_bkg || parent_is_vlen) {
tmp_buf_size = MAX(src_base_size, dst_base_size);
if(NULL == (tmp_buf = H5FL_BLK_CALLOC(vlen_seq,tmp_buf_size)))
HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "memory allocation failed for type conversion")
}
if(H5CX_get_vlen_alloc_info(&vl_alloc_info) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "unable to retrieve VL allocation info")
if(dst->shared->u.vlen.f != NULL)
write_to_file = TRUE;
if(write_to_file && parent_is_vlen && bkg != NULL)
nested = TRUE;
while(nelmts > 0) {
if(d_stride > s_stride) {
HDassert(s_stride > 0);
HDassert(d_stride > 0);
HDassert(b_stride >= 0);
safe = nelmts - (((nelmts * (size_t)s_stride) + ((size_t)d_stride - 1)) / (size_t)d_stride);
if(safe < 2) {
s = (uint8_t *)buf + (nelmts - 1) * (size_t)s_stride;
d = (uint8_t *)buf + (nelmts - 1) * (size_t)d_stride;
b = (uint8_t *)bkg + (nelmts - 1) * (size_t)b_stride;
s_stride = -s_stride;
d_stride = -d_stride;
b_stride = -b_stride;
safe = nelmts;
}
else {
s = (uint8_t *)buf + (nelmts - safe) * (size_t)s_stride;
d = (uint8_t *)buf + (nelmts - safe) * (size_t)d_stride;
b = (uint8_t *)bkg + (nelmts - safe) * (size_t)b_stride;
}
}
else {
s = d = (uint8_t *)buf;
b = (uint8_t *)bkg;
safe = nelmts;
}
for(elmtno = 0; elmtno < safe; elmtno++) {
if((*(src->shared->u.vlen.isnull))(src->shared->u.vlen.f, s)) {
if((*(dst->shared->u.vlen.setnull))(dst->shared->u.vlen.f, d, b) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_WRITEERROR, FAIL, "can't set VL data to 'nil'")
}
else {
ssize_t sseq_len;
size_t seq_len;
if((sseq_len = (*(src->shared->u.vlen.getlen))(s)) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "incorrect length")
seq_len = (size_t)sseq_len;
if(write_to_file && noop_conv) {
if(NULL == (conv_buf = (*(src->shared->u.vlen.getptr))(s)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid source pointer")
}
else {
size_t src_size, dst_size;
src_size = seq_len * src_base_size;
dst_size = seq_len * dst_base_size;
if(!seq_len && !conv_buf) {
conv_buf_size = ((1 / H5T_VLEN_MIN_CONF_BUF_SIZE) + 1) * H5T_VLEN_MIN_CONF_BUF_SIZE;
if(NULL == (conv_buf = H5FL_BLK_CALLOC(vlen_seq, conv_buf_size)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for type conversion")
}
else if(conv_buf_size < MAX(src_size, dst_size)) {
conv_buf_size = ((MAX(src_size, dst_size) / H5T_VLEN_MIN_CONF_BUF_SIZE) + 1) * H5T_VLEN_MIN_CONF_BUF_SIZE;
if(NULL == (conv_buf = H5FL_BLK_REALLOC(vlen_seq, conv_buf, conv_buf_size)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for type conversion")
HDmemset(conv_buf, 0, conv_buf_size);
}
if((*(src->shared->u.vlen.read))(src->shared->u.vlen.f, s, conv_buf, src_size) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_READERROR, FAIL, "can't read VL data")
}
if(!noop_conv) {
if(tmp_buf && tmp_buf_size < conv_buf_size) {
tmp_buf_size = conv_buf_size;
if(NULL == (tmp_buf = H5FL_BLK_REALLOC(vlen_seq, tmp_buf, tmp_buf_size)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for type conversion")
HDmemset(tmp_buf, 0, tmp_buf_size);
}
if(nested) {
const uint8_t *tmp = b;
UINT32DECODE(tmp, bg_seq_len);
if(bg_seq_len > 0) {
if(tmp_buf_size < (bg_seq_len * MAX(src_base_size, dst_base_size))) {
tmp_buf_size = (bg_seq_len * MAX(src_base_size, dst_base_size));
if(NULL == (tmp_buf = H5FL_BLK_REALLOC(vlen_seq, tmp_buf, tmp_buf_size)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for type conversion")
HDmemset(tmp_buf, 0, tmp_buf_size);
}
H5F_addr_decode(dst->shared->u.vlen.f, &tmp, &(bg_hobjid.addr));
UINT32DECODE(tmp, bg_hobjid.idx);
if(NULL == H5HG_read(dst->shared->u.vlen.f, &bg_hobjid, tmp_buf, NULL))
HGOTO_ERROR(H5E_DATATYPE, H5E_READERROR, FAIL, "can't read VL sequence into background buffer")
}
if(bg_seq_len < seq_len)
HDmemset((uint8_t *)tmp_buf + dst_base_size * bg_seq_len, 0, (seq_len - bg_seq_len) * dst_base_size);
}
if(H5T_convert(tpath, tsrc_id, tdst_id, seq_len, (size_t)0, (size_t)0, conv_buf, tmp_buf) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "datatype conversion failed")
}
if((*(dst->shared->u.vlen.write))(dst->shared->u.vlen.f, &vl_alloc_info, d, conv_buf, b, seq_len, dst_base_size) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_WRITEERROR, FAIL, "can't write VL data")
if(!noop_conv) {
if(nested && seq_len < bg_seq_len) {
size_t parent_seq_len;
const uint8_t *tmp;
size_t u;
for(u = seq_len; u < bg_seq_len; u++) {
tmp = (uint8_t *)tmp_buf + u * dst_base_size;
UINT32DECODE(tmp, parent_seq_len);
if(parent_seq_len > 0) {
H5F_addr_decode(dst->shared->u.vlen.f, &tmp, &(parent_hobjid.addr));
UINT32DECODE(tmp, parent_hobjid.idx);
if(H5HG_remove(dst->shared->u.vlen.f, &parent_hobjid) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_WRITEERROR, FAIL, "Unable to remove heap object")
}
}
}
}
}
s += s_stride;
d += d_stride;
b += b_stride;
}
nelmts -= safe;
}
if(tsrc_id >= 0)
H5I_dec_ref(tsrc_id);
if(tdst_id >= 0)
H5I_dec_ref(tdst_id);
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
}
done:
if(write_to_file && noop_conv)
conv_buf = NULL;
if(conv_buf)
conv_buf = H5FL_BLK_FREE(vlen_seq, conv_buf);
if(tmp_buf)
tmp_buf = H5FL_BLK_FREE(vlen_seq, tmp_buf);
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5T__conv_array(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
size_t buf_stride, size_t bkg_stride, void *_buf, void H5_ATTR_UNUSED *_bkg)
{
H5T_path_t *tpath;
hid_t tsrc_id = -1, tdst_id = -1;
H5T_t *src = NULL;
H5T_t *dst = NULL;
uint8_t *sp, *dp;
ssize_t src_delta, dst_delta;
int direction;
size_t elmtno;
unsigned u;
void *bkg_buf = NULL;
herr_t ret_value=SUCCEED;
FUNC_ENTER_PACKAGE
switch (cdata->command) {
case H5T_CONV_INIT:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
HDassert(H5T_ARRAY==src->shared->type);
HDassert(H5T_ARRAY==dst->shared->type);
if(src->shared->u.array.ndims != dst->shared->u.array.ndims)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "array datatypes do not have the same number of dimensions")
for(u = 0; u < src->shared->u.array.ndims; u++)
if(src->shared->u.array.dim[u] != dst->shared->u.array.dim[u])
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "array datatypes do not have the same sizes of dimensions")
cdata->need_bkg = H5T_BKG_NO;
break;
case H5T_CONV_FREE:
break;
case H5T_CONV_CONV:
if (NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(src->shared->size >= dst->shared->size || buf_stride > 0) {
sp = dp = (uint8_t*)_buf;
direction = 1;
} else {
sp = (uint8_t*)_buf + (nelmts - 1) *
(buf_stride ? buf_stride : src->shared->size);
dp = (uint8_t*)_buf + (nelmts - 1) *
(buf_stride ? buf_stride : dst->shared->size);
direction = -1;
}
H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t);
H5_CHECK_OVERFLOW(src->shared->size, size_t, ssize_t);
H5_CHECK_OVERFLOW(dst->shared->size, size_t, ssize_t);
src_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : src->shared->size);
dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst->shared->size);
if(NULL == (tpath = H5T_path_find(src->shared->parent, dst->shared->parent))) {
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest datatypes")
} else if (!H5T_path_noop(tpath)) {
if((tsrc_id = H5I_register(H5I_DATATYPE, H5T_copy(src->shared->parent, H5T_COPY_ALL), FALSE)) < 0 ||
(tdst_id = H5I_register(H5I_DATATYPE, H5T_copy(dst->shared->parent, H5T_COPY_ALL), FALSE)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
}
if(tpath->cdata.need_bkg) {
size_t bkg_buf_size;
bkg_buf_size = src->shared->u.array.nelem * MAX(src->shared->size, dst->shared->size);
if(NULL == (bkg_buf = H5FL_BLK_CALLOC(array_seq, bkg_buf_size)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for type conversion")
}
for(elmtno = 0; elmtno < nelmts; elmtno++) {
HDmemmove(dp, sp, src->shared->size);
if(H5T_convert(tpath, tsrc_id, tdst_id, src->shared->u.array.nelem, (size_t)0, bkg_stride, dp, bkg_buf) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "datatype conversion failed")
sp += src_delta;
dp += dst_delta;
}
if(tsrc_id >= 0)
H5I_dec_ref(tsrc_id);
if(tdst_id >= 0)
H5I_dec_ref(tdst_id);
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
}
done:
if(bkg_buf)
bkg_buf = H5FL_BLK_FREE(array_seq, bkg_buf);
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5T__conv_i_i(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_t *src = NULL;
H5T_t *dst = NULL;
ssize_t src_delta, dst_delta;
int direction;
size_t elmtno;
size_t half_size;
size_t olap;
uint8_t *s, *sp, *d, *dp;
uint8_t *src_rev=NULL;
uint8_t dbuf[64];
size_t first;
ssize_t sfirst;
size_t i;
H5T_conv_cb_t cb_struct={NULL, NULL};
H5T_conv_ret_t except_ret;
hbool_t reverse;
herr_t ret_value=SUCCEED;
FUNC_ENTER_PACKAGE
switch(cdata->command) {
case H5T_CONV_INIT:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(H5T_ORDER_LE != src->shared->u.atomic.order && H5T_ORDER_BE != src->shared->u.atomic.order)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
if(H5T_ORDER_LE != dst->shared->u.atomic.order && H5T_ORDER_BE != dst->shared->u.atomic.order)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
if(dst->shared->size > sizeof dbuf)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination size is too large")
cdata->need_bkg = H5T_BKG_NO;
break;
case H5T_CONV_FREE:
break;
case H5T_CONV_CONV:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if (src->shared->size==dst->shared->size || buf_stride) {
sp = dp = (uint8_t*)buf;
direction = 1;
olap = nelmts;
} else if (src->shared->size>=dst->shared->size) {
double olap_d = HDceil((double)(dst->shared->size)/
(double)(src->shared->size-dst->shared->size));
olap = (size_t)olap_d;
sp = dp = (uint8_t*)buf;
direction = 1;
} else {
double olap_d = HDceil((double)(src->shared->size)/
(double)(dst->shared->size-src->shared->size));
olap = (size_t)olap_d;
sp = (uint8_t*)buf + (nelmts - 1) * src->shared->size;
dp = (uint8_t*)buf + (nelmts - 1) * dst->shared->size;
direction = -1;
}
H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t);
H5_CHECK_OVERFLOW(src->shared->size, size_t, ssize_t);
H5_CHECK_OVERFLOW(dst->shared->size, size_t, ssize_t);
src_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : src->shared->size);
dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst->shared->size);
if(H5CX_get_dt_conv_cb(&cb_struct) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "unable to get conversion exception callback")
src_rev = (uint8_t*)H5MM_calloc(src->shared->size);
for(elmtno = 0; elmtno < nelmts; elmtno++) {
if(direction > 0) {
s = sp;
d = elmtno < olap ? dbuf : dp;
} else {
s = sp;
d = elmtno + olap >= nelmts ? dbuf : dp;
}
#ifndef NDEBUG
if (d==dbuf) {
HDassert((dp>=sp && dp<sp+src->shared->size) || (sp>=dp && sp<dp+dst->shared->size));
} else {
HDassert((dp<sp && dp+dst->shared->size<=sp) || (sp<dp && sp+src->shared->size<=dp));
}
#endif
if (H5T_ORDER_BE==src->shared->u.atomic.order) {
half_size = src->shared->size/2;
for (i=0; i<half_size; i++) {
uint8_t tmp = s[src->shared->size-(i+1)];
s[src->shared->size-(i+1)] = s[i];
s[i] = tmp;
}
}
sfirst = H5T__bit_find (s, src->shared->u.atomic.offset, src->shared->u.atomic.prec,
H5T_BIT_MSB, TRUE);
first = (size_t)sfirst;
except_ret = H5T_CONV_UNHANDLED;
reverse = TRUE;
if (sfirst<0) {
H5T__bit_set (d, dst->shared->u.atomic.offset, dst->shared->u.atomic.prec, FALSE);
} else if (H5T_SGN_NONE==src->shared->u.atomic.u.i.sign &&
H5T_SGN_NONE==dst->shared->u.atomic.u.i.sign) {
if (src->shared->u.atomic.prec <= dst->shared->u.atomic.prec) {
H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
src->shared->u.atomic.prec);
H5T__bit_set (d, dst->shared->u.atomic.offset+src->shared->u.atomic.prec,
dst->shared->u.atomic.prec-src->shared->u.atomic.prec, FALSE);
} else if (first>=dst->shared->u.atomic.prec) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src->shared->size, src->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
H5T__bit_set (d, dst->shared->u.atomic.offset, dst->shared->u.atomic.prec, TRUE);
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED)
reverse = FALSE;
} else {
H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
dst->shared->u.atomic.prec);
}
} else if (H5T_SGN_2==src->shared->u.atomic.u.i.sign &&
H5T_SGN_NONE==dst->shared->u.atomic.u.i.sign) {
if (first+1 == src->shared->u.atomic.prec) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src->shared->size, src->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW, src_id, dst_id,
src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
H5T__bit_set (d, dst->shared->u.atomic.offset, dst->shared->u.atomic.prec, FALSE);
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED)
reverse = FALSE;
} else if (src->shared->u.atomic.prec < dst->shared->u.atomic.prec) {
H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
src->shared->u.atomic.prec-1);
H5T__bit_set (d, dst->shared->u.atomic.offset+src->shared->u.atomic.prec-1,
(dst->shared->u.atomic.prec-src->shared->u.atomic.prec)+1, FALSE);
} else if (first>=dst->shared->u.atomic.prec) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src->shared->size, src->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED)
H5T__bit_set (d, dst->shared->u.atomic.offset, dst->shared->u.atomic.prec, TRUE);
else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED)
reverse = FALSE;
} else {
H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
dst->shared->u.atomic.prec);
}
} else if (H5T_SGN_NONE==src->shared->u.atomic.u.i.sign &&
H5T_SGN_2==dst->shared->u.atomic.u.i.sign) {
if (first+1 >= dst->shared->u.atomic.prec) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src->shared->size, src->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
H5T__bit_set(d, dst->shared->u.atomic.offset, dst->shared->u.atomic.prec-1, TRUE);
H5T__bit_set(d, (dst->shared->u.atomic.offset + dst->shared->u.atomic.prec-1), (size_t)1, FALSE);
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED)
reverse = FALSE;
} else if (src->shared->u.atomic.prec<dst->shared->u.atomic.prec) {
H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
src->shared->u.atomic.prec);
H5T__bit_set (d, dst->shared->u.atomic.offset+src->shared->u.atomic.prec,
dst->shared->u.atomic.prec-src->shared->u.atomic.prec, FALSE);
} else {
H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
dst->shared->u.atomic.prec);
}
} else if (first+1 == src->shared->u.atomic.prec) {
ssize_t sfz = H5T__bit_find (s, src->shared->u.atomic.offset,
src->shared->u.atomic.prec-1, H5T_BIT_MSB, FALSE);
size_t fz = (size_t)sfz;
if (sfz>=0 && fz+1>=dst->shared->u.atomic.prec) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src->shared->size, src->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW, src_id, dst_id,
src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
H5T__bit_set(d, dst->shared->u.atomic.offset, dst->shared->u.atomic.prec-1, FALSE);
H5T__bit_set(d, (dst->shared->u.atomic.offset + dst->shared->u.atomic.prec-1), (size_t)1, TRUE);
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED)
reverse = FALSE;
} else if (src->shared->u.atomic.prec<dst->shared->u.atomic.prec) {
H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset, src->shared->u.atomic.prec);
H5T__bit_set (d, dst->shared->u.atomic.offset+src->shared->u.atomic.prec, dst->shared->u.atomic.prec-src->shared->u.atomic.prec, TRUE);
} else {
H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset, dst->shared->u.atomic.prec);
}
} else {
if (first+1>=dst->shared->u.atomic.prec) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src->shared->size, src->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id, src_rev, d,
cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
H5T__bit_set(d, dst->shared->u.atomic.offset, dst->shared->u.atomic.prec-1, TRUE);
H5T__bit_set(d, (dst->shared->u.atomic.offset + dst->shared->u.atomic.prec-1), (size_t)1, FALSE);
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED)
reverse = FALSE;
} else if (src->shared->u.atomic.prec<dst->shared->u.atomic.prec) {
H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
src->shared->u.atomic.prec);
H5T__bit_set (d, dst->shared->u.atomic.offset+src->shared->u.atomic.prec,
dst->shared->u.atomic.prec-src->shared->u.atomic.prec, FALSE);
} else {
H5T__bit_copy (d, dst->shared->u.atomic.offset, s, src->shared->u.atomic.offset,
dst->shared->u.atomic.prec);
}
}
if (dst->shared->u.atomic.offset>0) {
HDassert(H5T_PAD_ZERO==dst->shared->u.atomic.lsb_pad || H5T_PAD_ONE==dst->shared->u.atomic.lsb_pad);
H5T__bit_set(d, (size_t)0, dst->shared->u.atomic.offset, (hbool_t)(H5T_PAD_ONE==dst->shared->u.atomic.lsb_pad));
}
if (dst->shared->u.atomic.offset+dst->shared->u.atomic.prec!=8*dst->shared->size) {
HDassert(H5T_PAD_ZERO==dst->shared->u.atomic.msb_pad || H5T_PAD_ONE==dst->shared->u.atomic.msb_pad);
H5T__bit_set (d, dst->shared->u.atomic.offset+dst->shared->u.atomic.prec,
8*dst->shared->size - (dst->shared->u.atomic.offset+ dst->shared->u.atomic.prec),
(hbool_t)(H5T_PAD_ONE==dst->shared->u.atomic.msb_pad));
}
if (H5T_ORDER_BE==dst->shared->u.atomic.order && reverse) {
half_size = dst->shared->size/2;
for (i=0; i<half_size; i++) {
uint8_t tmp = d[dst->shared->size-(i+1)];
d[dst->shared->size-(i+1)] = d[i];
d[i] = tmp;
}
}
if(d==dbuf)
H5MM_memcpy(dp, d, dst->shared->size);
sp += src_delta;
dp += dst_delta;
}
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
}
done:
if(src_rev)
H5MM_free(src_rev);
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5T__conv_f_f(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_t *src_p;
H5T_t *dst_p;
H5T_atomic_t src;
H5T_atomic_t dst;
ssize_t src_delta, dst_delta;
int direction;
size_t elmtno;
size_t half_size;
size_t tsize;
size_t olap;
ssize_t bitno = 0;
uint8_t *s, *sp, *d, *dp;
uint8_t *src_rev = NULL;
uint8_t dbuf[64];
uint8_t tmp1, tmp2;
int64_t expo;
hssize_t expo_max;
size_t msize = 0;
size_t mpos;
uint64_t sign;
size_t mrsh;
hbool_t carry = FALSE;
size_t i;
size_t implied;
hbool_t denormalized = FALSE;
H5T_conv_cb_t cb_struct = {NULL, NULL};
H5T_conv_ret_t except_ret;
hbool_t reverse;
herr_t ret_value = SUCCEED;
FUNC_ENTER_PACKAGE
switch(cdata->command) {
case H5T_CONV_INIT:
if(NULL == (src_p = (H5T_t *)H5I_object(src_id)) || NULL == (dst_p = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
src = src_p->shared->u.atomic;
dst = dst_p->shared->u.atomic;
if(H5T_ORDER_LE != src.order && H5T_ORDER_BE != src.order && H5T_ORDER_VAX != src.order)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
if(H5T_ORDER_LE != dst.order && H5T_ORDER_BE != dst.order && H5T_ORDER_VAX != dst.order)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
if(dst_p->shared->size > sizeof(dbuf))
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination size is too large")
if(8 * sizeof(expo) - 1 < src.u.f.esize || 8 * sizeof(expo) - 1 < dst.u.f.esize)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large")
cdata->need_bkg = H5T_BKG_NO;
break;
case H5T_CONV_FREE:
break;
case H5T_CONV_CONV:
if(NULL == (src_p = (H5T_t *)H5I_object(src_id)) || NULL == (dst_p = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
src = src_p->shared->u.atomic;
dst = dst_p->shared->u.atomic;
expo_max = ((hssize_t)1 << dst.u.f.esize) - 1;
if (src_p->shared->size==dst_p->shared->size || buf_stride) {
sp = dp = (uint8_t*)buf;
direction = 1;
olap = nelmts;
}
else if (src_p->shared->size>=dst_p->shared->size) {
double olap_d = HDceil((double)(dst_p->shared->size)/
(double)(src_p->shared->size-dst_p->shared->size));
olap = (size_t)olap_d;
sp = dp = (uint8_t*)buf;
direction = 1;
}
else {
double olap_d = HDceil((double)(src_p->shared->size)/
(double)(dst_p->shared->size-src_p->shared->size));
olap = (size_t)olap_d;
sp = (uint8_t*)buf + (nelmts-1) * src_p->shared->size;
dp = (uint8_t*)buf + (nelmts-1) * dst_p->shared->size;
direction = -1;
}
H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t);
H5_CHECK_OVERFLOW(src_p->shared->size, size_t, ssize_t);
H5_CHECK_OVERFLOW(dst_p->shared->size, size_t, ssize_t);
src_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : src_p->shared->size);
dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst_p->shared->size);
if(H5CX_get_dt_conv_cb(&cb_struct) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "unable to get conversion exception callback")
src_rev = (uint8_t*)H5MM_calloc(src_p->shared->size);
for (elmtno=0; elmtno<nelmts; elmtno++) {
except_ret = H5T_CONV_UNHANDLED;
reverse = TRUE;
if (direction>0) {
s = sp;
d = elmtno<olap ? dbuf : dp;
}
else {
s = sp;
d = elmtno+olap >= nelmts ? dbuf : dp;
}
#ifndef NDEBUG
if (d==dbuf) {
HDassert((dp>=sp && dp<sp+src_p->shared->size) ||
(sp>=dp && sp<dp+dst_p->shared->size));
}
else {
HDassert((dp<sp && dp+dst_p->shared->size<=sp) ||
(sp<dp && sp+src_p->shared->size<=dp));
}
#endif
if (H5T_ORDER_BE==src.order) {
half_size = src_p->shared->size/2;
for (i=0; i<half_size; i++) {
tmp1 = s[src_p->shared->size-(i+1)];
s[src_p->shared->size-(i+1)] = s[i];
s[i] = tmp1;
}
}
else if (H5T_ORDER_VAX==src.order) {
tsize = src_p->shared->size;
HDassert(0 == tsize % 2);
for (i = 0; i < tsize; i += 4) {
tmp1 = s[i];
tmp2 = s[i+1];
s[i] = s[(tsize-2)-i];
s[i+1] = s[(tsize-1)-i];
s[(tsize-2)-i] = tmp1;
s[(tsize-1)-i] = tmp2;
}
}
sign = H5T__bit_get_d(s, src.u.f.sign, (size_t)1);
if (H5T__bit_find (s, src.u.f.mpos, src.u.f.msize,
H5T_BIT_LSB, TRUE)<0) {
if (H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
H5T_BIT_LSB, TRUE)<0) {
H5T__bit_copy (d, dst.u.f.sign, s, src.u.f.sign, (size_t)1);
H5T__bit_set (d, dst.u.f.epos, dst.u.f.esize, FALSE);
H5T__bit_set (d, dst.u.f.mpos, dst.u.f.msize, FALSE);
goto padding;
}
else if (H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
H5T_BIT_LSB, FALSE)<0) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
if(sign)
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_NINF,
src_id, dst_id, src_rev, d, cb_struct.user_data);
else
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_PINF,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
H5T__bit_copy (d, dst.u.f.sign, s, src.u.f.sign, (size_t)1);
H5T__bit_set (d, dst.u.f.epos, dst.u.f.esize, TRUE);
H5T__bit_set (d, dst.u.f.mpos, dst.u.f.msize, FALSE);
if (H5T_NORM_NONE==dst.u.f.norm)
H5T__bit_set (d, dst.u.f.mpos+dst.u.f.msize-1, (size_t)1, TRUE);
}
else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
}
else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
goto padding;
}
}
else if (H5T_NORM_NONE==src.u.f.norm && H5T__bit_find (s, src.u.f.mpos, src.u.f.msize-1,
H5T_BIT_LSB, TRUE)<0 && H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
H5T_BIT_LSB, FALSE)<0) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
if(sign)
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_NINF,
src_id, dst_id, src_rev, d, cb_struct.user_data);
else
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_PINF,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
H5T__bit_copy (d, dst.u.f.sign, s, src.u.f.sign, (size_t)1);
H5T__bit_set (d, dst.u.f.epos, dst.u.f.esize, TRUE);
H5T__bit_set (d, dst.u.f.mpos, dst.u.f.msize, FALSE);
if (H5T_NORM_NONE==dst.u.f.norm)
H5T__bit_set (d, dst.u.f.mpos+dst.u.f.msize-1, (size_t)1, TRUE);
}
else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
}
else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
goto padding;
}
else if (H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
H5T_BIT_LSB, FALSE)<0) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_NAN,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
H5T__bit_copy (d, dst.u.f.sign, s, src.u.f.sign, (size_t)1);
H5T__bit_set (d, dst.u.f.epos, dst.u.f.esize, TRUE);
H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, TRUE);
}
else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
}
else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
goto padding;
}
expo = (int64_t)H5T__bit_get_d(s, src.u.f.epos, src.u.f.esize);
if (expo==0)
denormalized=TRUE;
implied = 1;
mpos = src.u.f.mpos;
mrsh = 0;
if (0 == expo || H5T_NORM_NONE == src.u.f.norm) {
if ((bitno = H5T__bit_find(s, src.u.f.mpos, src.u.f.msize, H5T_BIT_MSB, TRUE)) > 0) {
msize = (size_t)bitno;
}
else if (0==bitno) {
msize = 1;
H5T__bit_set(s, src.u.f.mpos, (size_t)1, FALSE);
}
}
else if (H5T_NORM_IMPLIED==src.u.f.norm) {
msize = src.u.f.msize;
}
else {
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet")
}
H5T__bit_copy (d, dst.u.f.sign, s, src.u.f.sign, (size_t)1);
if (0==expo || H5T_NORM_NONE==src.u.f.norm) {
HDassert(bitno>=0);
expo -= (int64_t)((src.u.f.ebias - 1) + (src.u.f.msize - (size_t)bitno));
}
else if (H5T_NORM_IMPLIED==src.u.f.norm) {
expo -= (int64_t)src.u.f.ebias;
}
else {
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet")
}
if (H5T_NORM_NONE==dst.u.f.norm)
mrsh++;
expo += (int64_t)dst.u.f.ebias;
if (expo < -(hssize_t)(dst.u.f.msize)) {
expo = 0;
H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, FALSE);
msize = 0;
}
else if (expo<=0) {
mrsh += (size_t)(1 - expo);
expo = 0;
denormalized=TRUE;
}
else if (expo>=expo_max) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
expo = expo_max;
H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, FALSE);
msize = 0;
}
else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
}
}
if (msize>0 && mrsh<=dst.u.f.msize && mrsh+msize>dst.u.f.msize) {
bitno = (ssize_t)(mrsh + msize - dst.u.f.msize);
HDassert(bitno >= 0 && (size_t)bitno <= msize);
if(H5T__bit_get_d(s, (mpos + (size_t)bitno) - 1, (size_t)1) && !denormalized) {
if((H5T__bit_find(s, mpos + (size_t)bitno, msize - (size_t)bitno, H5T_BIT_LSB, FALSE) >= 0 || expo < expo_max - 1)) {
carry = H5T__bit_inc(s, mpos + (size_t)bitno - 1, 1 + msize - (size_t)bitno);
if(carry)
implied = 2;
}
}
else if(H5T__bit_get_d(s, (mpos + (size_t)bitno) - 1, (size_t)1) && denormalized)
H5T__bit_inc(s, mpos + (size_t)bitno - 1, 1 + msize - (size_t)bitno);
}
else
carry = FALSE;
if (mrsh>dst.u.f.msize+1) {
H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, FALSE);
}
else if (mrsh==dst.u.f.msize+1) {
H5T__bit_set(d, dst.u.f.mpos+1, dst.u.f.msize-1, FALSE);
H5T__bit_set(d, dst.u.f.mpos, (size_t)1, TRUE);
}
else if (mrsh==dst.u.f.msize) {
H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, FALSE);
H5T__bit_set_d(d, dst.u.f.mpos, MIN(2, dst.u.f.msize), (hsize_t)implied);
}
else {
if (mrsh>0) {
H5T__bit_set(d, dst.u.f.mpos+dst.u.f.msize-mrsh, mrsh,
FALSE);
H5T__bit_set_d(d, dst.u.f.mpos+dst.u.f.msize-mrsh, (size_t)2,
(hsize_t)implied);
}
if (mrsh+msize>=dst.u.f.msize) {
H5T__bit_copy(d, dst.u.f.mpos,
s, (mpos+msize+mrsh-dst.u.f.msize),
dst.u.f.msize-mrsh);
}
else {
H5T__bit_copy(d, dst.u.f.mpos+dst.u.f.msize-(mrsh+msize),
s, mpos, msize);
H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize-(mrsh+msize),
FALSE);
}
}
if (carry) {
expo++;
if (expo>=expo_max) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
expo = expo_max;
H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, FALSE);
}
else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
}
}
}
carry = FALSE;
H5_CHECK_OVERFLOW(expo,hssize_t,hsize_t);
H5T__bit_set_d(d, dst.u.f.epos, dst.u.f.esize, (hsize_t)expo);
padding:
if (dst.offset>0) {
HDassert(H5T_PAD_ZERO==dst.lsb_pad || H5T_PAD_ONE==dst.lsb_pad);
H5T__bit_set (d, (size_t)0, dst.offset, (hbool_t)(H5T_PAD_ONE==dst.lsb_pad));
}
if (dst.offset+dst.prec!=8*dst_p->shared->size) {
HDassert(H5T_PAD_ZERO==dst.msb_pad || H5T_PAD_ONE==dst.msb_pad);
H5T__bit_set (d, dst.offset+dst.prec, 8*dst_p->shared->size - (dst.offset+dst.prec),
(hbool_t)(H5T_PAD_ONE==dst.msb_pad));
}
if (H5T_ORDER_BE==dst.order && reverse) {
half_size = dst_p->shared->size/2;
for (i=0; i<half_size; i++) {
uint8_t tmp = d[dst_p->shared->size-(i+1)];
d[dst_p->shared->size-(i+1)] = d[i];
d[i] = tmp;
}
} else if (H5T_ORDER_VAX==dst.order && reverse) {
tsize = dst_p->shared->size;
HDassert(0 == tsize % 2);
for (i = 0; i < tsize; i += 4) {
tmp1 = d[i];
tmp2 = d[i+1];
d[i] = d[(tsize-2)-i];
d[i+1] = d[(tsize-1)-i];
d[(tsize-2)-i] = tmp1;
d[(tsize-1)-i] = tmp2;
}
}
next:
if(d == dbuf)
H5MM_memcpy(dp, d, dst_p->shared->size);
sp += src_delta;
dp += dst_delta;
}
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
}
done:
if(src_rev)
H5MM_free(src_rev);
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5T__conv_s_s(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf,
void H5_ATTR_UNUSED *bkg)
{
H5T_t *src=NULL;
H5T_t *dst=NULL;
ssize_t src_delta, dst_delta;
int direction;
size_t elmtno;
size_t olap;
size_t nchars=0;
uint8_t *s, *sp, *d, *dp;
uint8_t *dbuf=NULL;
herr_t ret_value=SUCCEED;
FUNC_ENTER_PACKAGE
switch(cdata->command) {
case H5T_CONV_INIT:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(8 * src->shared->size != src->shared->u.atomic.prec || 8 * dst->shared->size != dst->shared->u.atomic.prec)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad precision")
if(0 != src->shared->u.atomic.offset || 0 != dst->shared->u.atomic.offset)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad offset")
if(H5T_CSET_ASCII != src->shared->u.atomic.u.s.cset && H5T_CSET_UTF8 != src->shared->u.atomic.u.s.cset)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad source character set")
if(H5T_CSET_ASCII != dst->shared->u.atomic.u.s.cset && H5T_CSET_UTF8 != dst->shared->u.atomic.u.s.cset)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad destination character set")
if((H5T_CSET_ASCII == src->shared->u.atomic.u.s.cset && H5T_CSET_UTF8 == dst->shared->u.atomic.u.s.cset)
|| (H5T_CSET_ASCII == dst->shared->u.atomic.u.s.cset && H5T_CSET_UTF8 == src->shared->u.atomic.u.s.cset))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "The library doesn't convert between strings of ASCII and UTF")
if(src->shared->u.atomic.u.s.pad < 0 || src->shared->u.atomic.u.s.pad >= H5T_NSTR ||
dst->shared->u.atomic.u.s.pad < 0 || dst->shared->u.atomic.u.s.pad >= H5T_NSTR)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad character padding")
cdata->need_bkg = H5T_BKG_NO;
break;
case H5T_CONV_FREE:
break;
case H5T_CONV_CONV:
if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if (src->shared->size==dst->shared->size || buf_stride) {
sp = dp = (uint8_t*)buf;
direction = 1;
olap = 0;
} else if (src->shared->size>=dst->shared->size) {
double olapd = HDceil((double)(dst->shared->size)/
(double)(src->shared->size-dst->shared->size));
olap = (size_t)olapd;
sp = dp = (uint8_t*)buf;
direction = 1;
} else {
double olapd = HDceil((double)(src->shared->size)/
(double)(dst->shared->size-src->shared->size));
olap = (size_t)olapd;
sp = (uint8_t*)buf + (nelmts-1) * src->shared->size;
dp = (uint8_t*)buf + (nelmts-1) * dst->shared->size;
direction = -1;
}
H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t);
H5_CHECK_OVERFLOW(src->shared->size, size_t, ssize_t);
H5_CHECK_OVERFLOW(dst->shared->size, size_t, ssize_t);
src_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : src->shared->size);
dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst->shared->size);
if(NULL == (dbuf = (uint8_t *)H5MM_malloc(dst->shared->size)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for string conversion")
for(elmtno = 0; elmtno < nelmts; elmtno++) {
if(direction > 0) {
s = sp;
d = elmtno < olap ? dbuf : dp;
} else {
s = sp;
d = elmtno + olap >= nelmts ? dbuf : dp;
}
#ifndef NDEBUG
if (src->shared->size==dst->shared->size || buf_stride) {
HDassert(s==d);
} else if (d==dbuf) {
HDassert((dp>=sp && dp<sp+src->shared->size) ||
(sp>=dp && sp<dp+dst->shared->size));
} else {
HDassert((dp<sp && dp+dst->shared->size<=sp) ||
(sp<dp && sp+src->shared->size<=dp));
}
#endif
switch(src->shared->u.atomic.u.s.pad) {
case H5T_STR_NULLTERM:
for (nchars=0;
nchars<dst->shared->size && nchars<src->shared->size && s[nchars];
nchars++) {
d[nchars] = s[nchars];
}
break;
case H5T_STR_NULLPAD:
for (nchars=0;
nchars<dst->shared->size && nchars<src->shared->size && s[nchars];
nchars++) {
d[nchars] = s[nchars];
}
break;
case H5T_STR_SPACEPAD:
nchars = src->shared->size;
while (nchars>0 && ' '==s[nchars-1])
--nchars;
nchars = MIN(dst->shared->size, nchars);
if(d != s)
H5MM_memcpy(d, s, nchars);
break;
case H5T_STR_RESERVED_3:
case H5T_STR_RESERVED_4:
case H5T_STR_RESERVED_5:
case H5T_STR_RESERVED_6:
case H5T_STR_RESERVED_7:
case H5T_STR_RESERVED_8:
case H5T_STR_RESERVED_9:
case H5T_STR_RESERVED_10:
case H5T_STR_RESERVED_11:
case H5T_STR_RESERVED_12:
case H5T_STR_RESERVED_13:
case H5T_STR_RESERVED_14:
case H5T_STR_RESERVED_15:
case H5T_STR_ERROR:
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "source string padding method not supported")
}
switch(dst->shared->u.atomic.u.s.pad) {
case H5T_STR_NULLTERM:
while(nchars < dst->shared->size)
d[nchars++] = '\0';
d[dst->shared->size - 1] = '\0';
break;
case H5T_STR_NULLPAD:
while(nchars < dst->shared->size)
d[nchars++] = '\0';
break;
case H5T_STR_SPACEPAD:
while(nchars < dst->shared->size)
d[nchars++] = ' ';
break;
case H5T_STR_RESERVED_3:
case H5T_STR_RESERVED_4:
case H5T_STR_RESERVED_5:
case H5T_STR_RESERVED_6:
case H5T_STR_RESERVED_7:
case H5T_STR_RESERVED_8:
case H5T_STR_RESERVED_9:
case H5T_STR_RESERVED_10:
case H5T_STR_RESERVED_11:
case H5T_STR_RESERVED_12:
case H5T_STR_RESERVED_13:
case H5T_STR_RESERVED_14:
case H5T_STR_RESERVED_15:
case H5T_STR_ERROR:
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination string padding method not supported")
}
if(d == dbuf)
H5MM_memcpy(dp, d, dst->shared->size);
sp += src_delta;
dp += dst_delta;
}
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown converson command")
}
done:
H5MM_xfree(dbuf);
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5T__conv_schar_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_su(SCHAR, UCHAR, signed char, unsigned char, -, -);
}
herr_t
H5T__conv_uchar_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_us(UCHAR, SCHAR, unsigned char, signed char, -, SCHAR_MAX);
}
herr_t
H5T__conv_schar_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sS(SCHAR, SHORT, signed char, short, -, -);
}
herr_t
H5T__conv_schar_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sU(SCHAR, USHORT, signed char, unsigned short, -, -);
}
herr_t
H5T__conv_uchar_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uS(UCHAR, SHORT, unsigned char, short, -, SHRT_MAX);
}
herr_t
H5T__conv_uchar_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uU(UCHAR, USHORT, unsigned char, unsigned short, -, -);
}
herr_t
H5T__conv_schar_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sS(SCHAR, INT, signed char, int, -, -);
}
herr_t
H5T__conv_schar_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sU(SCHAR, UINT, signed char, unsigned, -, -);
}
herr_t
H5T__conv_uchar_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uS(UCHAR, INT, unsigned char, int, -, INT_MAX);
}
herr_t
H5T__conv_uchar_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uU(UCHAR, UINT, unsigned char, unsigned, -, -);
}
herr_t
H5T__conv_schar_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sS(SCHAR, LONG, signed char, long, -, -);
}
herr_t
H5T__conv_schar_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sU(SCHAR, ULONG, signed char, unsigned long, -, -);
}
herr_t
H5T__conv_uchar_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uS(UCHAR, LONG, unsigned char, long, -, LONG_MAX);
}
herr_t
H5T__conv_uchar_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uU(UCHAR, ULONG, unsigned char, unsigned long, -, -);
}
herr_t
H5T__conv_schar_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sS(SCHAR, LLONG, signed char, long long, -, -);
}
herr_t
H5T__conv_schar_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sU(SCHAR, ULLONG, signed char, unsigned long long, -, -);
}
herr_t
H5T__conv_uchar_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uS(UCHAR, LLONG, unsigned char, long long, -, LLONG_MAX);
}
herr_t
H5T__conv_uchar_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uU(UCHAR, ULLONG, unsigned char, unsigned long long, -, -);
}
herr_t
H5T__conv_short_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Ss(SHORT, SCHAR, short, signed char, SCHAR_MIN, SCHAR_MAX);
}
herr_t
H5T__conv_short_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Su(SHORT, UCHAR, short, unsigned char, -, UCHAR_MAX);
}
herr_t
H5T__conv_ushort_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Us(USHORT, SCHAR, unsigned short, signed char, -, SCHAR_MAX);
}
herr_t
H5T__conv_ushort_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Uu(USHORT, UCHAR, unsigned short, unsigned char, -, UCHAR_MAX);
}
herr_t
H5T__conv_short_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_su(SHORT, USHORT, short, unsigned short, -, -);
}
herr_t
H5T__conv_ushort_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_us(USHORT, SHORT, unsigned short, short, -, SHRT_MAX);
}
herr_t
H5T__conv_short_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sS(SHORT, INT, short, int, -, -);
}
herr_t
H5T__conv_short_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sU(SHORT, UINT, short, unsigned, -, -);
}
herr_t
H5T__conv_ushort_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uS(USHORT, INT, unsigned short, int, -, INT_MAX);
}
herr_t
H5T__conv_ushort_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uU(USHORT, UINT, unsigned short, unsigned, -, -);
}
herr_t
H5T__conv_short_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sS(SHORT, LONG, short, long, -, -);
}
herr_t
H5T__conv_short_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sU(SHORT, ULONG, short, unsigned long, -, -);
}
herr_t
H5T__conv_ushort_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uS(USHORT, LONG, unsigned short, long, -, LONG_MAX);
}
herr_t
H5T__conv_ushort_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uU(USHORT, ULONG, unsigned short, unsigned long, -, -);
}
herr_t
H5T__conv_short_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sS(SHORT, LLONG, short, long long, -, -);
}
herr_t
H5T__conv_short_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sU(SHORT, ULLONG, short, unsigned long long, -, -);
}
herr_t
H5T__conv_ushort_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uS(USHORT, LLONG, unsigned short, long long, -, LLONG_MAX);
}
herr_t
H5T__conv_ushort_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uU(USHORT, ULLONG, unsigned short, unsigned long long, -, -);
}
herr_t
H5T__conv_int_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Ss(INT, SCHAR, int, signed char, SCHAR_MIN, SCHAR_MAX);
}
herr_t
H5T__conv_int_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Su(INT, UCHAR, int, unsigned char, -, UCHAR_MAX);
}
herr_t
H5T__conv_uint_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Us(UINT, SCHAR, unsigned, signed char, -, SCHAR_MAX);
}
herr_t
H5T__conv_uint_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Uu(UINT, UCHAR, unsigned, unsigned char, -, UCHAR_MAX);
}
herr_t
H5T__conv_int_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Ss(INT, SHORT, int, short, SHRT_MIN, SHRT_MAX);
}
herr_t
H5T__conv_int_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Su(INT, USHORT, int, unsigned short, -, USHRT_MAX);
}
herr_t
H5T__conv_uint_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Us(UINT, SHORT, unsigned, short, -, SHRT_MAX);
}
herr_t
H5T__conv_uint_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Uu(UINT, USHORT, unsigned, unsigned short, -, USHRT_MAX);
}
herr_t
H5T__conv_int_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_su(INT, UINT, int, unsigned, -, -);
}
herr_t
H5T__conv_uint_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_us(UINT, INT, unsigned, int, -, INT_MAX);
}
herr_t
H5T__conv_int_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sS(INT, LONG, int, long, -, -);
}
herr_t
H5T__conv_int_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sU(INT, LONG, int, unsigned long, -, -);
}
herr_t
H5T__conv_uint_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uS(UINT, LONG, unsigned, long, -, LONG_MAX);
}
herr_t
H5T__conv_uint_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uU(UINT, ULONG, unsigned, unsigned long, -, -);
}
herr_t
H5T__conv_int_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sS(INT, LLONG, int, long long, -, -);
}
herr_t
H5T__conv_int_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sU(INT, ULLONG, int, unsigned long long, -, -);
}
herr_t
H5T__conv_uint_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uS(UINT, LLONG, unsigned, long long, -, LLONG_MAX);
}
herr_t
H5T__conv_uint_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uU(UINT, ULLONG, unsigned, unsigned long long, -, -);
}
herr_t
H5T__conv_long_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Ss(LONG, SCHAR, long, signed char, SCHAR_MIN, SCHAR_MAX);
}
herr_t
H5T__conv_long_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Su(LONG, UCHAR, long, unsigned char, -, UCHAR_MAX);
}
herr_t
H5T__conv_ulong_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Us(ULONG, SCHAR, unsigned long, signed char, -, SCHAR_MAX);
}
herr_t
H5T__conv_ulong_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Uu(ULONG, UCHAR, unsigned long, unsigned char, -, UCHAR_MAX);
}
herr_t
H5T__conv_long_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Ss(LONG, SHORT, long, short, SHRT_MIN, SHRT_MAX);
}
herr_t
H5T__conv_long_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Su(LONG, USHORT, long, unsigned short, -, USHRT_MAX);
}
herr_t
H5T__conv_ulong_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Us(ULONG, SHORT, unsigned long, short, -, SHRT_MAX);
}
herr_t
H5T__conv_ulong_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Uu(ULONG, USHORT, unsigned long, unsigned short, -, USHRT_MAX);
}
herr_t
H5T__conv_long_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Ss(LONG, INT, long, int, INT_MIN, INT_MAX);
}
herr_t
H5T__conv_long_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Su(LONG, UINT, long, unsigned, -, UINT_MAX);
}
herr_t
H5T__conv_ulong_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Us(ULONG, INT, unsigned long, int, -, INT_MAX);
}
herr_t
H5T__conv_ulong_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Uu(ULONG, UINT, unsigned long, unsigned, -, UINT_MAX);
}
herr_t
H5T__conv_long_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_su(LONG, ULONG, long, unsigned long, -, -);
}
herr_t
H5T__conv_ulong_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_us(ULONG, LONG, unsigned long, long, -, LONG_MAX);
}
herr_t
H5T__conv_long_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sS(LONG, LLONG, long, long long, -, -);
}
herr_t
H5T__conv_long_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_sU(LONG, ULLONG, long, unsigned long long, -, -);
}
herr_t
H5T__conv_ulong_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uS(ULONG, LLONG, unsigned long, long long, -, LLONG_MAX);
}
herr_t
H5T__conv_ulong_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_uU(ULONG, ULLONG, unsigned long, unsigned long long, -, -);
}
herr_t
H5T__conv_llong_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Ss(LLONG, SCHAR, long long, signed char, SCHAR_MIN, SCHAR_MAX);
}
herr_t
H5T__conv_llong_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Su(LLONG, UCHAR, long long, unsigned char, -, UCHAR_MAX);
}
herr_t
H5T__conv_ullong_schar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Us(ULLONG, SCHAR, unsigned long long, signed char, -, SCHAR_MAX);
}
herr_t
H5T__conv_ullong_uchar(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Uu(ULLONG, UCHAR, unsigned long long, unsigned char, -, UCHAR_MAX);
}
herr_t
H5T__conv_llong_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Ss(LLONG, SHORT, long long, short, SHRT_MIN, SHRT_MAX);
}
herr_t
H5T__conv_llong_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Su(LLONG, USHORT, long long, unsigned short, -, USHRT_MAX);
}
herr_t
H5T__conv_ullong_short(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Us(ULLONG, SHORT, unsigned long long, short, -, SHRT_MAX);
}
herr_t
H5T__conv_ullong_ushort(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Uu(ULLONG, USHORT, unsigned long long, unsigned short, -, USHRT_MAX);
}
herr_t
H5T__conv_llong_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Ss(LLONG, INT, long long, int, INT_MIN, INT_MAX);
}
herr_t
H5T__conv_llong_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Su(LLONG, UINT, long long, unsigned, -, UINT_MAX);
}
herr_t
H5T__conv_ullong_int(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Us(ULLONG, INT, unsigned long long, int, -, INT_MAX);
}
herr_t
H5T__conv_ullong_uint(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Uu(ULLONG, UINT, unsigned long long, unsigned, -, UINT_MAX);
}
herr_t
H5T__conv_llong_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Ss(LLONG, LONG, long long, long, LONG_MIN, LONG_MAX);
}
herr_t
H5T__conv_llong_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Su(LLONG, ULONG, long long, unsigned long, -, ULONG_MAX);
}
herr_t
H5T__conv_ullong_long(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Us(ULLONG, LONG, unsigned long long, long, -, LONG_MAX);
}
herr_t
H5T__conv_ullong_ulong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Uu(ULLONG, ULONG, unsigned long long, unsigned long, -, ULONG_MAX);
}
herr_t
H5T__conv_llong_ullong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_su(LLONG, ULLONG, long long, unsigned long long, -, -);
}
herr_t
H5T__conv_ullong_llong(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_us(ULLONG, LLONG, unsigned long long, long long, -, LLONG_MAX);
}
herr_t
H5T__conv_float_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_fF(FLOAT, DOUBLE, float, double, -, -);
}
#if H5_SIZEOF_LONG_DOUBLE != 0
herr_t
H5T__conv_float_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_fF(FLOAT, LDOUBLE, float, long double, -, -);
}
#endif
herr_t
H5T__conv_double_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Ff(DOUBLE, FLOAT, double, float, -FLT_MAX, FLT_MAX);
}
#if H5_SIZEOF_LONG_DOUBLE != 0
herr_t
H5T__conv_double_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_fF(DOUBLE, LDOUBLE, double, long double, -, -);
}
#endif
#if H5_SIZEOF_LONG_DOUBLE != 0
herr_t
H5T__conv_ldouble_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Ff(LDOUBLE, FLOAT, long double, float, -FLT_MAX, FLT_MAX);
}
#endif
#if H5_SIZEOF_LONG_DOUBLE != 0
herr_t
H5T__conv_ldouble_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_Ff(LDOUBLE, DOUBLE, long double, double, -DBL_MAX, DBL_MAX);
}
#endif
herr_t
H5T__conv_schar_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(SCHAR, FLOAT, signed char, float, -, -);
}
herr_t
H5T__conv_schar_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(SCHAR, DOUBLE, signed char, double, -, -);
}
herr_t
H5T__conv_schar_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(SCHAR, LDOUBLE, signed char, long double, -, -);
}
herr_t
H5T__conv_uchar_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(UCHAR, FLOAT, unsigned char, float, -, -);
}
herr_t
H5T__conv_uchar_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(UCHAR, DOUBLE, unsigned char, double, -, -);
}
herr_t
H5T__conv_uchar_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(UCHAR, LDOUBLE, unsigned char, long double, -, -);
}
herr_t
H5T__conv_short_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(SHORT, FLOAT, short, float, -, -);
}
herr_t
H5T__conv_short_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(SHORT, DOUBLE, short, double, -, -);
}
herr_t
H5T__conv_short_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(SHORT, LDOUBLE, short, long double, -, -);
}
herr_t
H5T__conv_ushort_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(USHORT, FLOAT, unsigned short, float, -, -);
}
herr_t
H5T__conv_ushort_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(USHORT, DOUBLE, unsigned short, double, -, -);
}
herr_t
H5T__conv_ushort_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(USHORT, LDOUBLE, unsigned short, long double, -, -);
}
herr_t
H5T__conv_int_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(INT, FLOAT, int, float, -, -);
}
herr_t
H5T__conv_int_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(INT, DOUBLE, int, double, -, -);
}
herr_t
H5T__conv_int_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(INT, LDOUBLE, int, long double, -, -);
}
herr_t
H5T__conv_uint_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(UINT, FLOAT, unsigned int, float, -, -);
}
herr_t
H5T__conv_uint_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(UINT, DOUBLE, unsigned int, double, -, -);
}
herr_t
H5T__conv_uint_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(UINT, LDOUBLE, unsigned int, long double, -, -);
}
herr_t
H5T__conv_long_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(LONG, FLOAT, long, float, -, -);
}
herr_t
H5T__conv_long_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(LONG, DOUBLE, long, double, -, -);
}
herr_t
H5T__conv_long_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(LONG, LDOUBLE, long, long double, -, -);
}
herr_t
H5T__conv_ulong_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(ULONG, FLOAT, unsigned long, float, -, -);
}
herr_t
H5T__conv_ulong_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(ULONG, DOUBLE, unsigned long, double, -, -);
}
herr_t
H5T__conv_ulong_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(ULONG, LDOUBLE, unsigned long, long double, -, -);
}
herr_t
H5T__conv_llong_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(LLONG, FLOAT, long long, float, -, -);
}
herr_t
H5T__conv_llong_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(LLONG, DOUBLE, long long, double, -, -);
}
#if H5T_CONV_INTERNAL_LLONG_LDOUBLE
herr_t
H5T__conv_llong_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(LLONG, LDOUBLE, long long, long double, -, -);
}
#endif
herr_t
H5T__conv_ullong_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(ULLONG, FLOAT, unsigned long long, float, -, -);
}
herr_t
H5T__conv_ullong_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(ULLONG, DOUBLE, unsigned long long, double, -, -);
}
#if H5T_CONV_INTERNAL_ULLONG_LDOUBLE
herr_t
H5T__conv_ullong_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_CONV_xF(ULLONG, LDOUBLE, unsigned long long, long double, -, -);
}
#endif
herr_t
H5T__conv_float_schar (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(FLOAT, SCHAR, float, signed char, SCHAR_MIN, SCHAR_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_float_uchar (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(FLOAT, UCHAR, float, unsigned char, 0, UCHAR_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_double_schar (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(DOUBLE, SCHAR, double, signed char, SCHAR_MIN, SCHAR_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_double_uchar (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(DOUBLE, UCHAR, double, unsigned char, 0, UCHAR_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_ldouble_schar (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(LDOUBLE, SCHAR, long double, signed char, SCHAR_MIN, SCHAR_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_ldouble_uchar (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(LDOUBLE, UCHAR, long double, unsigned char, 0, UCHAR_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_float_short (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(FLOAT, SHORT, float, short, SHRT_MIN, SHRT_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_float_ushort (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(FLOAT, USHORT, float, unsigned short, 0, USHRT_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_double_short (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(DOUBLE, SHORT, double, short, SHRT_MIN, SHRT_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_double_ushort (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(DOUBLE, USHORT, double, unsigned short, 0, USHRT_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_ldouble_short (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(LDOUBLE, SHORT, long double, short, SHRT_MIN, SHRT_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_ldouble_ushort (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(LDOUBLE, USHORT, long double, unsigned short, 0, USHRT_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_float_int (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(FLOAT, INT, float, int, INT_MIN, INT_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_float_uint (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(FLOAT, UINT, float, unsigned int, 0, UINT_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_double_int (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(DOUBLE, INT, double, int, INT_MIN, INT_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_double_uint (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(DOUBLE, UINT, double, unsigned int, 0, UINT_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_ldouble_int (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(LDOUBLE, INT, long double, int, INT_MIN, INT_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_ldouble_uint (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(LDOUBLE, UINT, long double, unsigned int, 0, UINT_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_float_long (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(FLOAT, LONG, float, long, LONG_MIN, LONG_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_float_ulong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(FLOAT, ULONG, float, unsigned long, 0, ULONG_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_double_long (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(DOUBLE, LONG, double, long, LONG_MIN, LONG_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_double_ulong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(DOUBLE, ULONG, double, unsigned long, 0, ULONG_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_ldouble_long (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(LDOUBLE, LONG, long double, long, LONG_MIN, LONG_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_ldouble_ulong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(LDOUBLE, ULONG, long double, unsigned long, 0, ULONG_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_float_llong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(FLOAT, LLONG, float, long long, LLONG_MIN, LLONG_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_float_ullong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(FLOAT, ULLONG, float, unsigned long long, 0, ULLONG_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_double_llong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(DOUBLE, LLONG, double, long long, LLONG_MIN, LLONG_MAX);
H5_GCC_DIAG_ON(float-equal)
}
herr_t
H5T__conv_double_ullong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(DOUBLE, ULLONG, double, unsigned long long, 0, ULLONG_MAX);
H5_GCC_DIAG_ON(float-equal)
}
#if H5T_CONV_INTERNAL_LDOUBLE_LLONG
herr_t
H5T__conv_ldouble_llong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(LDOUBLE, LLONG, long double, long long, LLONG_MIN, LLONG_MAX);
H5_GCC_DIAG_ON(float-equal)
}
#endif
#if H5T_CONV_INTERNAL_LDOUBLE_ULLONG
herr_t
H5T__conv_ldouble_ullong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
void *buf, void H5_ATTR_UNUSED *bkg)
{
H5_GCC_DIAG_OFF(float-equal)
H5T_CONV_Fx(LDOUBLE, ULLONG, long double, unsigned long long, 0, ULLONG_MAX);
H5_GCC_DIAG_ON(float-equal)
}
#endif
herr_t
H5T__conv_f_i(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_t *src_p;
H5T_t *dst_p;
H5T_atomic_t src;
H5T_atomic_t dst;
int direction;
size_t elmtno;
size_t half_size;
size_t tsize;
size_t olap;
uint8_t *s, *sp, *d, *dp;
uint8_t *src_rev=NULL;
uint8_t dbuf[64];
uint8_t tmp1, tmp2;
hssize_t expo;
hssize_t sign;
uint8_t *int_buf=NULL;
size_t buf_size;
size_t i;
size_t first;
ssize_t sfirst;
H5T_conv_cb_t cb_struct={NULL, NULL};
hbool_t truncated;
hbool_t reverse;
H5T_conv_ret_t except_ret;
herr_t ret_value=SUCCEED;
FUNC_ENTER_PACKAGE
switch(cdata->command) {
case H5T_CONV_INIT:
if(NULL == (src_p = (H5T_t*)H5I_object(src_id)) || NULL == (dst_p = (H5T_t*)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
src = src_p->shared->u.atomic;
dst = dst_p->shared->u.atomic;
if(H5T_ORDER_LE != src.order && H5T_ORDER_BE != src.order && H5T_ORDER_VAX != src.order)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
if(dst_p->shared->size > sizeof(dbuf))
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination size is too large")
if(8 * sizeof(expo) - 1 < src.u.f.esize)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large")
cdata->need_bkg = H5T_BKG_NO;
break;
case H5T_CONV_FREE:
break;
case H5T_CONV_CONV:
if(NULL == (src_p = (H5T_t*)H5I_object(src_id)) || NULL == (dst_p = (H5T_t*)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
src = src_p->shared->u.atomic;
dst = dst_p->shared->u.atomic;
if(src_p->shared->size==dst_p->shared->size || buf_stride) {
sp = dp = (uint8_t*)buf;
direction = 1;
olap = nelmts;
} else if (src_p->shared->size>=dst_p->shared->size) {
double olap_d = HDceil((double)(dst_p->shared->size)/
(double)(src_p->shared->size-dst_p->shared->size));
olap = (size_t)olap_d;
sp = dp = (uint8_t*)buf;
direction = 1;
} else {
double olap_d = HDceil((double)(src_p->shared->size)/
(double)(dst_p->shared->size-src_p->shared->size));
olap = (size_t)olap_d;
sp = (uint8_t*)buf + (nelmts-1) * src_p->shared->size;
dp = (uint8_t*)buf + (nelmts-1) * dst_p->shared->size;
direction = -1;
}
buf_size = (size_t) (HDpow((double)2.0f, (double)src.u.f.esize) / 8 + 1);
int_buf = (uint8_t*)H5MM_calloc(buf_size);
if(H5CX_get_dt_conv_cb(&cb_struct) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "unable to get conversion exception callback")
src_rev = (uint8_t*)H5MM_calloc(src_p->shared->size);
for(elmtno = 0; elmtno < nelmts; elmtno++) {
except_ret = H5T_CONV_UNHANDLED;
truncated = FALSE;
reverse = TRUE;
if(direction > 0) {
s = sp;
d = elmtno<olap ? dbuf : dp;
} else {
s = sp;
d = elmtno+olap >= nelmts ? dbuf : dp;
}
#ifndef NDEBUG
if (d==dbuf) {
HDassert((dp>=sp && dp<sp+src_p->shared->size) ||
(sp>=dp && sp<dp+dst_p->shared->size));
} else {
HDassert((dp<sp && dp+dst_p->shared->size<=sp) ||
(sp<dp && sp+src_p->shared->size<=dp));
}
#endif
if (H5T_ORDER_BE==src.order) {
half_size = src_p->shared->size/2;
for (i=0; i<half_size; i++) {
tmp1 = s[src_p->shared->size-(i+1)];
s[src_p->shared->size-(i+1)] = s[i];
s[i] = tmp1;
}
} else if (H5T_ORDER_VAX==src.order) {
tsize = src_p->shared->size;
HDassert(0 == tsize % 2);
for (i = 0; i < tsize; i += 4) {
tmp1 = s[i];
tmp2 = s[i+1];
s[i] = s[(tsize-2)-i];
s[i+1] = s[(tsize-1)-i];
s[(tsize-2)-i] = tmp1;
s[(tsize-1)-i] = tmp2;
}
}
H5T__bit_set (d, dst.offset, dst.prec, FALSE);
sign = (hssize_t) H5T__bit_get_d(s, src.u.f.sign, (size_t)1);
if (H5T__bit_find (s, src.u.f.mpos, src.u.f.msize,
H5T_BIT_LSB, TRUE)<0) {
if (H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
H5T_BIT_LSB, TRUE)<0) {
goto padding;
} else if (H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
H5T_BIT_LSB, FALSE)<0) {
if(sign) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_NINF,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
if (H5T_SGN_2==dst.u.i.sign)
H5T__bit_set (d, dst.prec-1, (size_t)1, TRUE);
} else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
} else {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_PINF,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
if (H5T_SGN_NONE==dst.u.i.sign)
H5T__bit_set (d, dst.offset, dst.prec, TRUE);
else if (H5T_SGN_2==dst.u.i.sign)
H5T__bit_set (d, dst.offset, dst.prec-1, TRUE);
} else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
}
goto padding;
}
} else if (H5T_NORM_NONE==src.u.f.norm && H5T__bit_find (s, src.u.f.mpos, src.u.f.msize-1,
H5T_BIT_LSB, TRUE)<0 && H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
H5T_BIT_LSB, FALSE)<0) {
if(sign) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_NINF,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
if (H5T_SGN_2==dst.u.i.sign)
H5T__bit_set (d, dst.prec-1, (size_t)1, TRUE);
} else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
} else {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_PINF,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
if (H5T_SGN_NONE==dst.u.i.sign)
H5T__bit_set (d, dst.offset, dst.prec, TRUE);
else if (H5T_SGN_2==dst.u.i.sign)
H5T__bit_set (d, dst.offset, dst.prec-1, TRUE);
} else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
}
goto padding;
} else if (H5T__bit_find (s, src.u.f.epos, src.u.f.esize,
H5T_BIT_LSB, FALSE)<0) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_NAN,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
goto padding;
} else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
goto padding;
}
expo = (hssize_t) H5T__bit_get_d(s, src.u.f.epos, src.u.f.esize);
if (0==expo || H5T_NORM_NONE==src.u.f.norm) {
expo -= (hssize_t) (src.u.f.ebias-1);
} else if (H5T_NORM_IMPLIED==src.u.f.norm) {
expo -= (hssize_t) src.u.f.ebias;
} else {
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet")
}
H5T__bit_copy(int_buf, (size_t)0, s, src.u.f.mpos, src.u.f.msize);
if(H5T_NORM_IMPLIED == src.u.f.norm)
H5T__bit_inc(int_buf, src.u.f.msize, 8 * buf_size - src.u.f.msize);
H5T__bit_shift(int_buf, expo - (ssize_t)src.u.f.msize, (size_t)0, buf_size * 8);
if ((size_t)expo < src.u.f.msize && cb_struct.func)
truncated = TRUE;
sfirst = H5T__bit_find(int_buf, (size_t)0, 8 * buf_size, H5T_BIT_MSB, TRUE);
first = (size_t)sfirst;
if(sfirst < 0) {
} else if (H5T_SGN_NONE==dst.u.i.sign) {
if(sign) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW,
src_id, dst_id, src_rev, d, cb_struct.user_data);
if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
}
}
} else {
if (first>=dst.prec) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED)
H5T__bit_set (d, dst.offset, dst.prec, TRUE);
else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
} else if (first <dst.prec) {
if(truncated && cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_TRUNCATE,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED)
H5T__bit_copy (d, dst.offset, int_buf, (size_t)0, first+1);
else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
}
}
} else if (H5T_SGN_2==dst.u.i.sign) {
if(sign) {
if(first < dst.prec-1) {
if(truncated && cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_TRUNCATE,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
H5T__bit_dec(int_buf, (size_t)0, 8 * buf_size);
H5T__bit_neg(int_buf, (size_t)0, 8 * buf_size);
H5T__bit_copy(d, dst.offset, int_buf, (size_t)0, dst.prec-1);
H5T__bit_set(d, (dst.offset + dst.prec-1), (size_t)1, TRUE);
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
}
} else {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED)
H5T__bit_set(d, (dst.offset + dst.prec-1), (size_t)1, TRUE);
else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
}
}
} else {
if (first >= dst.prec-1) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED)
H5T__bit_set(d, dst.offset, dst.prec-1, TRUE);
else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
}
} else if(first < dst.prec-1) {
if(truncated && cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_TRUNCATE,
src_id, dst_id, src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_UNHANDLED) {
H5T__bit_copy (d, dst.offset, int_buf, (size_t)0, first+1);
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto next;
}
}
}
}
padding:
if (dst.offset>0) {
HDassert(H5T_PAD_ZERO==dst.lsb_pad || H5T_PAD_ONE==dst.lsb_pad);
H5T__bit_set(d, (size_t)0, dst.offset, (hbool_t)(H5T_PAD_ONE==dst.lsb_pad));
}
if (dst.offset+dst.prec!=8*dst_p->shared->size) {
HDassert(H5T_PAD_ZERO==dst.msb_pad || H5T_PAD_ONE==dst.msb_pad);
H5T__bit_set(d, dst.offset+dst.prec,
8*dst_p->shared->size - (dst.offset+ dst.prec),
(hbool_t)(H5T_PAD_ONE==dst.msb_pad));
}
if (H5T_ORDER_BE==dst.order && reverse) {
half_size = dst_p->shared->size/2;
for (i=0; i<half_size; i++) {
tmp1 = d[dst_p->shared->size-(i+1)];
d[dst_p->shared->size-(i+1)] = d[i];
d[i] = tmp1;
}
}
next:
if (d==dbuf)
H5MM_memcpy (dp, d, dst_p->shared->size);
if (buf_stride) {
sp += direction * (ssize_t) buf_stride;
dp += direction * (ssize_t) buf_stride;
} else {
sp += direction * (ssize_t) src_p->shared->size;
dp += direction * (ssize_t) dst_p->shared->size;
}
HDmemset(int_buf, 0, buf_size);
}
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
}
done:
if(int_buf)
H5MM_xfree(int_buf);
if(src_rev)
H5MM_free(src_rev);
FUNC_LEAVE_NOAPI(ret_value)
}
herr_t
H5T__conv_i_f(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg)
{
H5T_t *src_p;
H5T_t *dst_p;
H5T_atomic_t src;
H5T_atomic_t dst;
int direction;
size_t elmtno;
size_t half_size;
size_t tsize;
size_t olap;
uint8_t *s, *sp, *d, *dp;
uint8_t *src_rev = NULL;
uint8_t dbuf[64];
uint8_t tmp1, tmp2;
hsize_t expo;
hsize_t expo_max;
size_t sign;
hbool_t is_max_neg;
hbool_t do_round;
uint8_t *int_buf = NULL;
size_t buf_size;
size_t i;
size_t first;
ssize_t sfirst;
H5T_conv_cb_t cb_struct = {NULL, NULL};
H5T_conv_ret_t except_ret;
hbool_t reverse;
herr_t ret_value = SUCCEED;
FUNC_ENTER_PACKAGE
switch(cdata->command) {
case H5T_CONV_INIT:
if(NULL == (src_p = (H5T_t *)H5I_object(src_id)) || NULL == (dst_p = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
src = src_p->shared->u.atomic;
dst = dst_p->shared->u.atomic;
if(H5T_ORDER_LE != dst.order && H5T_ORDER_BE != dst.order && H5T_ORDER_VAX != dst.order)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order")
if(dst_p->shared->size > sizeof(dbuf))
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination size is too large")
if(8 * sizeof(expo) - 1 < src.u.f.esize)
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large")
cdata->need_bkg = H5T_BKG_NO;
break;
case H5T_CONV_FREE:
break;
case H5T_CONV_CONV:
if(NULL == (src_p = (H5T_t *)H5I_object(src_id)) || NULL == (dst_p = (H5T_t *)H5I_object(dst_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
src = src_p->shared->u.atomic;
dst = dst_p->shared->u.atomic;
if (src_p->shared->size==dst_p->shared->size || buf_stride) {
sp = dp = (uint8_t*)buf;
direction = 1;
olap = nelmts;
} else if (src_p->shared->size>=dst_p->shared->size) {
double olap_d = HDceil((double)(dst_p->shared->size)/
(double)(src_p->shared->size-dst_p->shared->size));
olap = (size_t)olap_d;
sp = dp = (uint8_t*)buf;
direction = 1;
} else {
double olap_d = HDceil((double)(src_p->shared->size)/
(double)(dst_p->shared->size-src_p->shared->size));
olap = (size_t)olap_d;
sp = (uint8_t*)buf + (nelmts-1) * src_p->shared->size;
dp = (uint8_t*)buf + (nelmts-1) * dst_p->shared->size;
direction = -1;
}
buf_size = (src.prec > dst.u.f.msize ? src.prec : dst.u.f.msize)/8 + 1;
int_buf = (uint8_t*)H5MM_calloc(buf_size);
if(H5CX_get_dt_conv_cb(&cb_struct) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "unable to get conversion exception callback")
src_rev = (uint8_t*)H5MM_calloc(src_p->shared->size);
for (elmtno=0; elmtno<nelmts; elmtno++) {
except_ret = H5T_CONV_UNHANDLED;
reverse = TRUE;
sign = 0;
is_max_neg = 0;
do_round = 0;
sfirst = 0;
if (direction>0) {
s = sp;
d = elmtno<olap ? dbuf : dp;
} else {
s = sp;
d = elmtno+olap >= nelmts ? dbuf : dp;
}
#ifndef NDEBUG
if (d==dbuf) {
HDassert((dp>=sp && dp<sp+src_p->shared->size) ||
(sp>=dp && sp<dp+dst_p->shared->size));
} else {
HDassert((dp<sp && dp+dst_p->shared->size<=sp) ||
(sp<dp && sp+src_p->shared->size<=dp));
}
#endif
if (H5T_ORDER_BE==src.order) {
half_size = src_p->shared->size/2;
for (i=0; i<half_size; i++) {
tmp1 = s[src_p->shared->size-(i+1)];
s[src_p->shared->size-(i+1)] = s[i];
s[i] = tmp1;
}
}
H5T__bit_set (d, dst.offset, dst.prec, FALSE);
H5T__bit_copy(int_buf, (size_t)0, s, src.offset, src.prec);
if(H5T_SGN_2 == src.u.i.sign)
sign = (size_t)H5T__bit_get_d(int_buf, src.prec - 1, (size_t)1);
if(H5T_SGN_2 == src.u.i.sign) {
sfirst = H5T__bit_find(int_buf, (size_t)0, src.prec - 1, H5T_BIT_MSB, TRUE);
if(sign && sfirst < 0)
is_max_neg = 1;
} else if(H5T_SGN_NONE == src.u.i.sign)
sfirst = H5T__bit_find(int_buf, (size_t)0, src.prec, H5T_BIT_MSB, TRUE);
if(!sign && sfirst < 0)
goto padding;
if(H5T_SGN_2 == src.u.i.sign && sign) {
if(!is_max_neg) {
H5T__bit_dec(int_buf, (size_t)0, buf_size * 8);
H5T__bit_neg(int_buf, (size_t)0, buf_size * 8);
sfirst = H5T__bit_find(int_buf, (size_t)0, src.prec - 1, H5T_BIT_MSB, TRUE);
} else {
sfirst = (ssize_t)(src.prec - 1);
is_max_neg = 0;
}
if(sfirst < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "zero bit not found")
H5T__bit_set(int_buf, src.prec, (buf_size * 8) - src.prec, 0);
H5T__bit_set_d(d, dst.u.f.sign, (size_t)1, (hsize_t)sign);
}
first = (size_t)sfirst;
if (H5T_NORM_NONE==dst.u.f.norm || H5T_NORM_IMPLIED==dst.u.f.norm) {
expo = first + dst.u.f.ebias;
} else {
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet")
}
if (H5T_NORM_IMPLIED==dst.u.f.norm) {
H5T__bit_set(int_buf, first, (size_t)1, 0);
} else if (H5T_NORM_NONE==dst.u.f.norm) {
first++;
}
if(first > dst.u.f.msize) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_PRECISION, src_id, dst_id,
src_rev, d, cb_struct.user_data);
}
if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto padding;
} else if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
if(H5T__bit_get_d(int_buf, ((first - dst.u.f.msize) - 1), (size_t)1)) {
if(((first - dst.u.f.msize) - 1) > 0 && H5T__bit_get_d(int_buf, (size_t)0, ((first - dst.u.f.msize) - 1)))
do_round = 1;
else {
if(H5T__bit_get_d(int_buf, (first - dst.u.f.msize), (size_t)1))
do_round = 1;
}
}
H5T__bit_shift(int_buf, (ssize_t)(dst.u.f.msize - first), (size_t)0, buf_size * 8);
if(do_round) {
H5T__bit_inc(int_buf, (size_t)0, buf_size * 8);
do_round = 0;
if(H5T__bit_get_d(int_buf, dst.u.f.msize, (size_t)1)) {
if (H5T_NORM_IMPLIED==dst.u.f.norm) {
expo++;
} else if (H5T_NORM_NONE==dst.u.f.norm) {
H5T__bit_shift(int_buf, (ssize_t)-1, (size_t)0, buf_size * 8);
expo++;
}
}
}
} else {
H5T__bit_shift(int_buf, (ssize_t)(dst.u.f.msize - first), (size_t)0, dst.u.f.msize);
}
expo_max = (hsize_t) (HDpow((double)2.0f, (double)dst.u.f.esize) - 1);
if(expo > expo_max) {
if(cb_struct.func) {
H5T_reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order);
except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, src_id, dst_id,
src_rev, d, cb_struct.user_data);
if(except_ret == H5T_CONV_ABORT)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception")
else if(except_ret == H5T_CONV_HANDLED) {
reverse = FALSE;
goto padding;
}
} else {
expo = expo_max;
HDmemset(int_buf, 0, buf_size);
}
}
if(except_ret == H5T_CONV_UNHANDLED) {
H5T__bit_set_d(d, dst.u.f.epos, dst.u.f.esize, expo);
H5T__bit_copy(d, dst.u.f.mpos, int_buf, (size_t)0, (buf_size * 8) > dst.u.f.msize ? dst.u.f.msize : buf_size * 8);
}
padding:
if(dst.offset > 0) {
HDassert(H5T_PAD_ZERO == dst.lsb_pad || H5T_PAD_ONE == dst.lsb_pad);
H5T__bit_set(d, (size_t)0, dst.offset, (hbool_t)(H5T_PAD_ONE==dst.lsb_pad));
}
if(dst.offset + dst.prec != 8 * dst_p->shared->size) {
HDassert(H5T_PAD_ZERO == dst.msb_pad || H5T_PAD_ONE == dst.msb_pad);
H5T__bit_set(d, dst.offset + dst.prec,
8 * dst_p->shared->size - (dst.offset + dst.prec),
(hbool_t)(H5T_PAD_ONE == dst.msb_pad));
}
if (H5T_ORDER_BE==dst.order && reverse) {
half_size = dst_p->shared->size/2;
for (i=0; i<half_size; i++) {
uint8_t tmp = d[dst_p->shared->size-(i+1)];
d[dst_p->shared->size-(i+1)] = d[i];
d[i] = tmp;
}
} else if (H5T_ORDER_VAX==dst.order && reverse) {
tsize = dst_p->shared->size;
HDassert(0 == tsize % 2);
for (i = 0; i < tsize; i += 4) {
tmp1 = d[i];
tmp2 = d[i+1];
d[i] = d[(tsize-2)-i];
d[i+1] = d[(tsize-1)-i];
d[(tsize-2)-i] = tmp1;
d[(tsize-1)-i] = tmp2;
}
}
if (d==dbuf)
H5MM_memcpy (dp, d, dst_p->shared->size);
if (buf_stride) {
sp += direction * (ssize_t) buf_stride;
dp += direction * (ssize_t) buf_stride;
} else {
sp += direction * (ssize_t) src_p->shared->size;
dp += direction * (ssize_t) dst_p->shared->size;
}
HDmemset(int_buf, 0, buf_size);
}
break;
default:
HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
}
done:
if(int_buf)
H5MM_xfree(int_buf);
if(src_rev)
H5MM_free(src_rev);
FUNC_LEAVE_NOAPI(ret_value)
}
static herr_t
H5T_reverse_order(uint8_t *rev, uint8_t *s, size_t size, H5T_order_t order)
{
size_t i;
FUNC_ENTER_NOAPI_NOINIT_NOERR
HDassert(s);
HDassert(size);
if (H5T_ORDER_VAX == order) {
for (i = 0; i < size; i += 2) {
rev[i] = s[(size - 2) - i];
rev[i + 1] = s[(size - 1) - i];
}
} else if (H5T_ORDER_BE == order) {
for (i=0; i<size; i++)
rev[size-(i+1)] = s[i];
} else {
for (i=0; i<size; i++)
rev[i] = s[i];
}
FUNC_LEAVE_NOAPI(SUCCEED)
}