diff options
author | Mohamad Chaarawi <chaarawi@hdfgroup.org> | 2012-07-05 22:11:13 (GMT) |
---|---|---|
committer | Mohamad Chaarawi <chaarawi@hdfgroup.org> | 2012-07-05 22:11:13 (GMT) |
commit | 7a070012c08c4ef16a6effc01e03c2ca7cd8fa00 (patch) | |
tree | 1e1b8f704b43c9695e10475ba7d5dbb970be1856 /src/H5VLnative.c | |
parent | e4a60d86caa7a76001dd4e09af246c4c0fad19ea (diff) | |
download | hdf5-7a070012c08c4ef16a6effc01e03c2ca7cd8fa00.zip hdf5-7a070012c08c4ef16a6effc01e03c2ca7cd8fa00.tar.gz hdf5-7a070012c08c4ef16a6effc01e03c2ca7cd8fa00.tar.bz2 |
[svn-r22519] - many bug fixes
- still some unresolved issues with named datatypes
Diffstat (limited to 'src/H5VLnative.c')
-rw-r--r-- | src/H5VLnative.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/H5VLnative.c b/src/H5VLnative.c index 9f79946..07d574d 100644 --- a/src/H5VLnative.c +++ b/src/H5VLnative.c @@ -781,8 +781,8 @@ H5VL_native_attr_get(void *obj, H5VL_attr_get_t get_type, hid_t UNUSED req, va_l /* Copy the name into the user's buffer, if given */ if(buf) { - HDstrncpy(buf, attr->shared->name, MIN((size_t)(ret_value + 1), buf_size)); - if((size_t)ret_value >= buf_size) + HDstrncpy(buf, attr->shared->name, MIN((size_t)(*ret_val + 1), buf_size)); + if((size_t)(*ret_val) >= buf_size) buf[buf_size - 1]='\0'; } /* end if */ @@ -907,12 +907,12 @@ H5VL_native_attr_remove(void *obj, H5VL_loc_params_t loc_params, const char *att if(H5G_loc_real(obj, loc_params.obj_type, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object") - if(loc_params.type == H5VL_OBJECT_BY_SELF) { /* H5Adelete */ + if(H5VL_OBJECT_BY_SELF == loc_params.type) { /* H5Adelete */ /* Delete the attribute from the location */ if(H5O_attr_remove(loc.oloc, attr_name, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute") } - else if(loc_params.type == H5VL_OBJECT_BY_NAME) { /* H5Adelete_by_name */ + else if(H5VL_OBJECT_BY_NAME == loc_params.type) { /* H5Adelete_by_name */ /* Set up opened group location to fill in */ obj_loc.oloc = &obj_oloc; obj_loc.path = &obj_path; @@ -928,7 +928,7 @@ H5VL_native_attr_remove(void *obj, H5VL_loc_params_t loc_params, const char *att if(H5O_attr_remove(obj_loc.oloc, attr_name, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute") } - if(loc_params.type == H5VL_OBJECT_BY_IDX) { /* H5Adelete_by_idx */ + else if(H5VL_OBJECT_BY_IDX == loc_params.type) { /* H5Adelete_by_idx */ /* Set up opened group location to fill in */ obj_loc.oloc = &obj_oloc; obj_loc.path = &obj_path; @@ -1018,6 +1018,20 @@ H5VL_native_datatype_commit(void *obj, H5VL_loc_params_t loc_params, const char if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a datatype") + /* + * Check arguments. We cannot commit an immutable type because H5Tclose() + * normally fails on such types (try H5Tclose(H5T_NATIVE_INT)) but closing + * a named type should always succeed. + */ + if(H5T_STATE_NAMED == dt->shared->state || H5T_STATE_OPEN == dt->shared->state) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "datatype is already committed") + if(H5T_STATE_IMMUTABLE == dt->shared->state) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "datatype is immutable") + + /* Check for a "sensible" datatype to store on disk */ + if(H5T_is_sensible(dt) <= 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "datatype is not sensible") + /* Copy the datatype - the copied one will be the type that is committed, and attached to original datatype above the VOL layer*/ |