diff options
-rw-r--r-- | hl/src/H5DS.c | 410 | ||||
-rw-r--r-- | hl/src/H5DS.h | 10 | ||||
-rw-r--r-- | hl/test/test_ds.c | 53 |
3 files changed, 169 insertions, 304 deletions
diff --git a/hl/src/H5DS.c b/hl/src/H5DS.c index 3d147d2..0615a80 100644 --- a/hl/src/H5DS.c +++ b/hl/src/H5DS.c @@ -15,8 +15,6 @@ #include "H5LT.h" #include <stdlib.h> - - /*------------------------------------------------------------------------- * Function: H5DSset_scale * @@ -739,6 +737,127 @@ out: } +/*------------------------------------------------------------------------- + * Function: H5DSget_nscales + * + * Purpose: get the number of scales linked to the IDX dimension of DNAME + * + * Return: + * Success: SUCCESS: both the DS and the dataset exist + * Failure: FAIL: if either one of them does not exist + * + * Programmer: pvn@ncsa.uiuc.edu + * + * Date: January 13, 2005 + * + * Comments: + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +herr_t H5DSget_nscales(hid_t did, + unsigned int dim, + int *nscales) +{ + int has_dimlist; + hid_t sid; /* space ID */ + hid_t tid; /* attribute type ID */ + hid_t aid; /* attribute ID */ + int rank; /* rank of dataset */ + hvl_t *buf; /* VL buffer to store in the attribute */ + hobj_ref_t ref; /* reference to the DS */ + int i, n; + +/*------------------------------------------------------------------------- + * the attribute "DIMENSION_LIST" on the >>data<< dataset must exist + *------------------------------------------------------------------------- + */ + /* get dataset space */ + if ((sid = H5Dget_space(did))<0) + goto out; + + /* get rank */ + if ((rank=H5Sget_simple_extent_ndims(sid))<0) + goto out; + + /* close dataset space */ + if (H5Sclose(sid)<0) + goto out; + + /* DIM range checking */ + if (dim>=(unsigned int )rank) + goto out; + + /* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */ + if ((has_dimlist = H5LT_find_attribute(did,DIMENSION_LIST))<0) + return FAIL; + + /* it does not exist */ + if (has_dimlist == 0) + goto out; + +/*------------------------------------------------------------------------- + * the attribute exists, open it + *------------------------------------------------------------------------- + */ + + else if ( has_dimlist == 1 ) + { + if ((aid = H5Aopen_name(did,DIMENSION_LIST))<0) + goto out; + if ((tid = H5Aget_type(aid))<0) + goto out; + if ((sid = H5Aget_space(aid))<0) + goto out; + + /* allocate and initialize the VL */ + buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t)); + + if (buf == NULL) + goto out; + + /* read */ + if (H5Aread(aid,tid,buf)<0) + goto out; + + for(i=0,n=0; i<(int)buf[dim].len; i++) + { + ref = ((hobj_ref_t *)buf[dim].p)[i]; + if (ref) n++; + } + /* return value */ + *nscales =n; + + /* close */ + if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf)<0) + goto out; + if (H5Sclose(sid)<0) + goto out; + if (H5Tclose(tid)<0) + goto out; + if (H5Aclose(aid)<0) + goto out; + if (buf) + free(buf); + + } /* has_dimlist */ + + return SUCCESS; + +/* error zone, gracefully close */ +out: + H5E_BEGIN_TRY { + H5Dclose(did); + H5Sclose(sid); + H5Aclose(aid); + H5Tclose(tid); + } H5E_END_TRY; + return FAIL; + +} + /*------------------------------------------------------------------------- * Function: H5DSset_label @@ -1135,293 +1254,6 @@ out: } - - -/*------------------------------------------------------------------------- - * Function: H5DShas_scale - * - * Purpose: check if the dataset DID has associated - * valid dimension scales; valid means the dimension scales exist and they - * are as many as the dataset rank - * - * Return: 1, has, 0, not, FAIL, error - * - * Programmer: pvn@ncsa.uiuc.edu - * - * Date: January 04, 2005 - * - * Comments: - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -herr_t H5DShas_scale(hid_t did) -{ - int has_dimlist; /* do we have the "DIMENSION_LIST" attribute */ - hid_t sid; /* space ID */ - hid_t dsid; /* DS dataset ID */ - hid_t dssid; /* DS space ID */ - hid_t tid; /* attribute type ID */ - hid_t aid; /* attribute ID */ - hssize_t dsnelmts; /* size of a dimension scale array */ - herr_t has_ds; /* boolean return value */ - int rank; /* rank of dataset */ - hsize_t dims[H5S_MAX_RANK]; /* dimensions of dataset */ - hvl_t *buf; /* VL buffer stored in the attribute */ - hobj_ref_t ref; /* reference to the DS */ - int i; - - has_ds = 1; - - /* get dataset space */ - if ((sid = H5Dget_space(did))<0) - goto out; - - /* get rank */ - if ((rank=H5Sget_simple_extent_ndims(sid))<0) - goto out; - - /* get dimensions of dataset */ - if (H5Sget_simple_extent_dims(sid,dims,NULL)<0) - goto out; - - /* close the dataspace id */ - if (H5Sclose(sid)<0) - goto out; - - /* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */ - if ((has_dimlist = H5LT_find_attribute(did,DIMENSION_LIST))<0) - goto out; - - if (has_dimlist == 0) - has_ds = 0; - - else if (has_dimlist == 1 ) - { - if ((aid = H5Aopen_name(did,DIMENSION_LIST))<0) - goto out; - - if ((tid = H5Aget_type(aid))<0) - goto out; - - if ((sid = H5Aget_space(aid))<0) - goto out; - - /* allocate and initialize the VL */ - buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t)); - - if (buf == NULL) - goto out; - - /* read */ - if (H5Aread(aid,tid,buf)<0) - goto out; - -/*------------------------------------------------------------------------- - * check if we have at least one entry for each dimension - *------------------------------------------------------------------------- - */ - for(i=0; i<rank; i++) - { - if (buf[i].len == 0) - has_ds = 0; - } - -/*------------------------------------------------------------------------- - * check if the DSs are valid - *------------------------------------------------------------------------- - */ - - for(i=0; i<rank; i++) - { - if (buf[i].len) - { - /* get the reference */ - ref = ((hobj_ref_t *)buf[i].p)[0]; - - if (ref==0) - has_ds = 0; - - if (ref) - { - /* get the DS id */ - if ((dsid = H5Rdereference(did,H5R_OBJECT,&ref))<0) - goto out; - - /* check information in referenced dataset */ - if ((dssid = H5Dget_space(dsid))<0) - goto out; - - /* get size of the DS array */ - if ((dsnelmts = H5Sget_simple_extent_npoints(dssid))<0) - goto out; - - /* the size of the DS array must match the dimension of the dataset */ - if (dsnelmts != (hssize_t)dims[i]) - has_ds = 0; - - /* close the dereferenced dataset */ - if (H5Dclose(dsid)<0) - goto out; - if (H5Sclose(dssid)<0) - goto out; - } - } - } - - /* close */ - if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf)<0) - goto out; - if (H5Sclose(sid)<0) - goto out; - if (H5Tclose(tid)<0) - goto out; - if (H5Aclose(aid)<0) - goto out; - /* free the VL buffer */ - if (buf) - free(buf); - - } /* has_dimlist */ - - return has_ds; - -/* error zone, gracefully close */ -out: - H5E_BEGIN_TRY { - H5Sclose(sid); - H5Tclose(tid); - H5Aclose(aid); - } H5E_END_TRY; - return FAIL; - -} - - - -/*------------------------------------------------------------------------- - * Function: H5DSget_nscales - * - * Purpose: get the number of scales linked to the IDX dimension of DNAME - * - * Return: - * Success: SUCCESS: both the DS and the dataset exist - * Failure: FAIL: if either one of them does not exist - * - * Programmer: pvn@ncsa.uiuc.edu - * - * Date: January 13, 2005 - * - * Comments: - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -herr_t H5DSget_nscales(hid_t did, - unsigned int dim, - int *nscales) -{ - int has_dimlist; - hid_t sid; /* space ID */ - hid_t tid; /* attribute type ID */ - hid_t aid; /* attribute ID */ - int rank; /* rank of dataset */ - hvl_t *buf; /* VL buffer to store in the attribute */ - hobj_ref_t ref; /* reference to the DS */ - int i, n; - -/*------------------------------------------------------------------------- - * the attribute "DIMENSION_LIST" on the >>data<< dataset must exist - *------------------------------------------------------------------------- - */ - /* get dataset space */ - if ((sid = H5Dget_space(did))<0) - goto out; - - /* get rank */ - if ((rank=H5Sget_simple_extent_ndims(sid))<0) - goto out; - - /* close dataset space */ - if (H5Sclose(sid)<0) - goto out; - - /* DIM range checking */ - if (dim>=(unsigned int )rank) - goto out; - - /* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */ - if ((has_dimlist = H5LT_find_attribute(did,DIMENSION_LIST))<0) - return FAIL; - - /* it does not exist */ - if (has_dimlist == 0) - goto out; - -/*------------------------------------------------------------------------- - * the attribute exists, open it - *------------------------------------------------------------------------- - */ - - else if ( has_dimlist == 1 ) - { - if ((aid = H5Aopen_name(did,DIMENSION_LIST))<0) - goto out; - if ((tid = H5Aget_type(aid))<0) - goto out; - if ((sid = H5Aget_space(aid))<0) - goto out; - - /* allocate and initialize the VL */ - buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t)); - - if (buf == NULL) - goto out; - - /* read */ - if (H5Aread(aid,tid,buf)<0) - goto out; - - for(i=0,n=0; i<(int)buf[dim].len; i++) - { - ref = ((hobj_ref_t *)buf[dim].p)[i]; - if (ref) n++; - } - /* return value */ - *nscales =n; - - /* close */ - if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf)<0) - goto out; - if (H5Sclose(sid)<0) - goto out; - if (H5Tclose(tid)<0) - goto out; - if (H5Aclose(aid)<0) - goto out; - if (buf) - free(buf); - - } /* has_dimlist */ - - return SUCCESS; - -/* error zone, gracefully close */ -out: - H5E_BEGIN_TRY { - H5Dclose(did); - H5Sclose(sid); - H5Aclose(aid); - H5Tclose(tid); - } H5E_END_TRY; - return FAIL; - -} - /*------------------------------------------------------------------------- * Function: H5DSiterate_scales * diff --git a/hl/src/H5DS.h b/hl/src/H5DS.h index d75e707..95886db 100644 --- a/hl/src/H5DS.h +++ b/hl/src/H5DS.h @@ -51,6 +51,10 @@ herr_t H5DSdetach_scale(hid_t did, hid_t dsid, unsigned int idx); +herr_t H5DSget_nscales(hid_t did, + unsigned int dim, + int *nscales); + herr_t H5DSset_label(hid_t did, char *label, unsigned int idx); @@ -65,12 +69,6 @@ herr_t H5DSget_scale_name(hid_t did, herr_t H5DSis_scale(hid_t did); -herr_t H5DShas_scale(hid_t did); - -herr_t H5DSget_nscales(hid_t did, - unsigned int dim, - int *nscales); - herr_t H5DSiterate_scales(hid_t did, unsigned int dim, diff --git a/hl/test/test_ds.c b/hl/test/test_ds.c index 43f6429..f891889 100644 --- a/hl/test/test_ds.c +++ b/hl/test/test_ds.c @@ -86,7 +86,8 @@ static int test_simple(void) char s1_label[16]; /* read label for DS 1 */ char s2_label[16]; /* read label for DS 2 */ unsigned int dim; /* dataset dimension index */ - int scale_idx; + int scale_idx; /* scale index */ + int nscales; /* number of scales in DIM */ printf("Testing API functions\n"); @@ -277,11 +278,11 @@ static int test_simple(void) /*------------------------------------------------------------------------- - * test 2: has scales + * test 2: get number of scales *------------------------------------------------------------------------- */ - TESTING2("has scales"); + TESTING2("get number of scales"); /*------------------------------------------------------------------------- * verify that "dset_a" has dimension scales @@ -292,8 +293,18 @@ static int test_simple(void) if ((did = H5Dopen(fid,"dset_a"))<0) goto out; - /* verify that "dset_a" has dimension scales */ - if ((H5DShas_scale(did))==0) + /* verify that "dset_a" has 1 dimension scale at DIM 0 */ + dim=0; + if (H5DSget_nscales(did,dim,&nscales)<0) + goto out; + if (nscales!=1) + goto out; + + /* verify that "dset_a" has 3 dimension scales at DIM 1 */ + dim=1; + if (H5DSget_nscales(did,dim,&nscales)<0) + goto out; + if (nscales!=3) goto out; /* close dataset ID of "dset_a" */ @@ -310,8 +321,18 @@ static int test_simple(void) if ((did = H5Dopen(fid,"dset_b"))<0) goto out; - /* verify that "dset_b" does not have a complete definition of dimension scales */ - if ((H5DShas_scale(did))==1) + /* verify that "dset_b" has 1 dimension scale at DIM 0 */ + dim=0; + if (H5DSget_nscales(did,dim,&nscales)<0) + goto out; + if (nscales!=1) + goto out; + + /* verify that "dset_b" has 0 dimension scales at DIM 1 */ + dim=1; + if (H5DSget_nscales(did,dim,&nscales)<0) + goto out; + if (nscales!=0) goto out; /* close dataset ID of "dset_b" */ @@ -376,7 +397,17 @@ static int test_simple(void) if ((did = H5Dopen(fid,"dset_c"))<0) goto out; - if ((H5DShas_scale(did))==0) + /* verify that "dset_c" has 1 dimension scale at DIM 0 */ + dim=0; + if (H5DSget_nscales(did,dim,&nscales)<0) + goto out; + if (nscales!=1) + goto out; + /* verify that "dset_c" has 1 dimension scale at DIM 1 */ + dim=1; + if (H5DSget_nscales(did,dim,&nscales)<0) + goto out; + if (nscales!=1) goto out; if (H5Dclose(did)<0) goto out; @@ -413,7 +444,11 @@ static int test_simple(void) if ((did = H5Dopen(fid,"dset_c"))<0) goto out; - if ((H5DShas_scale(did))==1) + /* verify that "dset_c" has 0 dimension scale at DIM 0 */ + dim=0; + if (H5DSget_nscales(did,dim,&nscales)<0) + goto out; + if (nscales!=0) goto out; if (H5Dclose(did)<0) goto out; |