diff options
author | Raymond Lu <songyulu@hdfgroup.org> | 2004-10-01 18:28:18 (GMT) |
---|---|---|
committer | Raymond Lu <songyulu@hdfgroup.org> | 2004-10-01 18:28:18 (GMT) |
commit | 753190f8c13f2ad1639f28aaa8682eeaa8ccca00 (patch) | |
tree | 0b11d242acd2b1edea600155a720342ad6887597 /src | |
parent | 5b1292e39b5d0bb25215fa9354a77f9a78dcf085 (diff) | |
download | hdf5-753190f8c13f2ad1639f28aaa8682eeaa8ccca00.zip hdf5-753190f8c13f2ad1639f28aaa8682eeaa8ccca00.tar.gz hdf5-753190f8c13f2ad1639f28aaa8682eeaa8ccca00.tar.bz2 |
[svn-r9350] *** empty log message ***
Diffstat (limited to 'src')
-rw-r--r-- | src/H5T.c | 36 | ||||
-rw-r--r-- | src/H5Tcompound.c | 3 | ||||
-rw-r--r-- | src/H5Tpkg.h | 1 |
3 files changed, 31 insertions, 9 deletions
@@ -1453,8 +1453,8 @@ H5Tcreate(H5T_class_t type, size_t size) FUNC_ENTER_API(H5Tcreate, FAIL); H5TRACE2("i","Ttz",type,size); - /* check args */ - if (size == 0) + /* check args. We start to support size adjustment for compound type. */ + if (size == 0 && type != H5T_COMPOUND) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid size"); /* create the type */ @@ -2796,8 +2796,6 @@ H5T_create(H5T_class_t type, size_t size) FUNC_ENTER_NOAPI(H5T_create, NULL); - assert(size != 0); - switch (type) { case H5T_INTEGER: case H5T_FLOAT: @@ -3507,7 +3505,6 @@ H5T_set_size(H5T_t *dt, size_t size) assert(size!=0); assert(H5T_REFERENCE!=dt->shared->type); assert(!(H5T_ENUM==dt->shared->type && 0==dt->shared->u.enumer.nmembs)); - assert(!(H5T_COMPOUND==dt->shared->type && 0==dt->shared->u.compnd.nmembs)); if (dt->shared->parent) { if (H5T_set_size(dt->shared->parent, size)<0) @@ -3544,8 +3541,33 @@ H5T_set_size(H5T_t *dt, size_t size) break; case H5T_COMPOUND: - if(size<dt->shared->size) - HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, FAIL, "can't shrink compound datatype"); + /* If decreasing size, check the last member isn't being cut. */ + if(size<dt->shared->size) { + int num_membs; + unsigned i, max_index=0; + H5T_t *memb_type; + size_t memb_offset, max_offset=0; + size_t max_size; + + if((num_membs = H5T_get_nmembers(dt))<0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to get number of members"); + + for(i=0; i<num_membs; i++) { + memb_offset = H5T_get_member_offset(dt, i); + if(memb_offset > max_offset) { + max_offset = memb_offset; + max_index = i; + } + } + + if((memb_type = H5T_get_member_type(dt, max_index))==NULL) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to get type of member"); + + max_size = H5T_get_size(memb_type); + + if(size<(max_offset+max_size)) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "size shrinking will cut off last member "); + } break; case H5T_STRING: diff --git a/src/H5Tcompound.c b/src/H5Tcompound.c index 7abcafc..cbb269c 100644 --- a/src/H5Tcompound.c +++ b/src/H5Tcompound.c @@ -36,7 +36,6 @@ #define H5T_COMPND_INC 64 /*typical max numb of members per struct */ /* Static local functions */ -static size_t H5T_get_member_offset(const H5T_t *dt, unsigned membno); static herr_t H5T_pack(H5T_t *dt); @@ -134,7 +133,7 @@ done: * *------------------------------------------------------------------------- */ -static size_t +size_t H5T_get_member_offset(const H5T_t *dt, unsigned membno) { size_t ret_value; diff --git a/src/H5Tpkg.h b/src/H5Tpkg.h index 7e7203a..8999d6e 100644 --- a/src/H5Tpkg.h +++ b/src/H5Tpkg.h @@ -1090,6 +1090,7 @@ H5_DLL H5T_t * H5T_array_create(H5T_t *base, int ndims, /* Compound functions */ H5_DLL H5T_t *H5T_get_member_type(const H5T_t *dt, unsigned membno); +H5_DLL size_t H5T_get_member_offset(const H5T_t *dt, unsigned membno); H5_DLL htri_t H5T_is_packed(const H5T_t *dt); #endif |