summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRaymond Lu <songyulu@hdfgroup.org>2004-10-01 18:28:18 (GMT)
committerRaymond Lu <songyulu@hdfgroup.org>2004-10-01 18:28:18 (GMT)
commit753190f8c13f2ad1639f28aaa8682eeaa8ccca00 (patch)
tree0b11d242acd2b1edea600155a720342ad6887597 /src
parent5b1292e39b5d0bb25215fa9354a77f9a78dcf085 (diff)
downloadhdf5-753190f8c13f2ad1639f28aaa8682eeaa8ccca00.zip
hdf5-753190f8c13f2ad1639f28aaa8682eeaa8ccca00.tar.gz
hdf5-753190f8c13f2ad1639f28aaa8682eeaa8ccca00.tar.bz2
[svn-r9350] *** empty log message ***
Diffstat (limited to 'src')
-rw-r--r--src/H5T.c36
-rw-r--r--src/H5Tcompound.c3
-rw-r--r--src/H5Tpkg.h1
3 files changed, 31 insertions, 9 deletions
diff --git a/src/H5T.c b/src/H5T.c
index 21e43ed..c07a174 100644
--- a/src/H5T.c
+++ b/src/H5T.c
@@ -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