diff options
Diffstat (limited to 'src/H5Torder.c')
-rw-r--r-- | src/H5Torder.c | 82 |
1 files changed, 70 insertions, 12 deletions
diff --git a/src/H5Torder.c b/src/H5Torder.c index 6c0667b..86a725b 100644 --- a/src/H5Torder.c +++ b/src/H5Torder.c @@ -63,6 +63,7 @@ H5T_init_order_interface(void) * * Programmer: Robb Matzke * Wednesday, January 7, 1998 +s * *------------------------------------------------------------------------- */ @@ -136,6 +137,14 @@ done: * Robb Matzke, 22 Dec 1998 * Also works for derived datatypes. * + * Raymond Lu, 18 Aug 2010 + * Now it works for all data types with some restrictions: + * 1. For enum type, members shouldn't be defined yet. + * 2. H5T_ORDER_NONE only works for reference and fixed-length + * string. + * 3. For opaque type, the order will be ignored. + * 4. For compound type, all restrictions above apply to the + * members. *------------------------------------------------------------------------- */ herr_t @@ -150,23 +159,72 @@ H5Tset_order(hid_t type_id, H5T_order_t order) /* Check args */ if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype") - if (H5T_STATE_TRANSIENT!=dt->shared->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "datatype is read-only") if (order < H5T_ORDER_LE || order > H5T_ORDER_NONE) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal byte order") - if (H5T_ENUM==dt->shared->type && dt->shared->u.enumer.nmembs>0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined") - while (dt->shared->parent) - dt = dt->shared->parent; /*defer to parent*/ - if (order == H5T_ORDER_NONE && !(H5T_REFERENCE == dt->shared->type || H5T_IS_FIXED_STRING(dt->shared))) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal byte order") - if (!H5T_IS_ATOMIC(dt->shared)) - HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for specified datatype") + if (H5T_STATE_TRANSIENT!=dt->shared->state) + HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "datatype is read-only") - /* Commit */ - dt->shared->u.atomic.order = order; + if (H5T_set_order(dt, order) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "can't set order") done: FUNC_LEAVE_API(ret_value) } + +/*------------------------------------------------------------------------- + * Function: H5T_set_order + * + * Purpose: Private function to set the byte order for a datatype. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Raymond Lu + * 13 August 2010 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +herr_t +H5T_set_order(H5T_t *dtype, H5T_order_t order) +{ + H5T_t *memb_type; /* Datatype of compound members */ + int nmemb; /* Number of members in compound & enum types */ + int i; /* Local index variable */ + herr_t ret_value=SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5T_set_order, FAIL) + + if (H5T_ENUM==dtype->shared->type && dtype->shared->u.enumer.nmembs>0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after enum members are defined") + + /* For derived data type, defer to parent */ + while (dtype->shared->parent) + dtype = dtype->shared->parent; + + if (order == H5T_ORDER_NONE && !(H5T_REFERENCE == dtype->shared->type || + H5T_OPAQUE == dtype->shared->type || H5T_IS_FIXED_STRING(dtype->shared))) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal byte order") + + /* For atomic data type */ + if (H5T_IS_ATOMIC(dtype->shared)) { + dtype->shared->u.atomic.order = order; + HGOTO_DONE(ret_value) + } + + /* Loop through all fields of compound type */ + if(H5T_COMPOUND == dtype->shared->type) { + if((nmemb = H5T_get_nmembers(dtype)) < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get number of members from compound data type") + + /* Set order for each compound member type. */ + for(i=0; i<nmemb; i++) { + if(H5T_set_order(dtype->shared->u.compnd.memb[i].type, order) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "can't set order for compound member") + } + } + +done: + FUNC_LEAVE_NOAPI(ret_value) +} |