From 437dd9be23c86f8228bcb8b7090189a911cc00ef Mon Sep 17 00:00:00 2001 From: Raymond Lu Date: Mon, 2 Dec 2002 14:47:57 -0500 Subject: [svn-r6145] Purpose: New feature to H5Dget_offset Description: If user block is set, H5Dget_offset should be able to return the absolute offset from the beginning of file. Platforms tested: eirene, arabica --- src/H5D.c | 12 +++++- src/H5F.c | 18 ++++++++ src/H5Fprivate.h | 1 + test/dsets.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- test/ntypes.c | 2 +- test/tvlstr.c | 40 +++++++++++++---- 6 files changed, 186 insertions(+), 16 deletions(-) diff --git a/src/H5D.c b/src/H5D.c index fcc3013..7485d7e 100644 --- a/src/H5D.c +++ b/src/H5D.c @@ -3736,6 +3736,8 @@ haddr_t H5D_get_offset(H5D_t *dset) { haddr_t ret_value; + haddr_t base_addr; + H5F_t *f; FUNC_ENTER_NOAPI(H5D_get_offset, HADDR_UNDEF); @@ -3750,7 +3752,15 @@ H5D_get_offset(H5D_t *dset) case H5D_CONTIGUOUS: /* If dataspace hasn't been allocated or dataset is stored in * an external file, the value will be HADDR_UNDEF. */ - ret_value = dset->layout.addr; + f = H5D_get_file(dset); + base_addr = H5F_get_base_addr(f); + + /* If there's user block in file, returns the absolute dataset offset + * from the beginning of file. */ + if(base_addr!=HADDR_UNDEF) + ret_value = dset->layout.addr + base_addr; + else + ret_value = dset->layout.addr; break; default: diff --git a/src/H5F.c b/src/H5F.c index 1455709..26ac386 100644 --- a/src/H5F.c +++ b/src/H5F.c @@ -3509,6 +3509,24 @@ done: FUNC_LEAVE(ret_value); } /* end H5F_get_fileno() */ + +haddr_t +H5F_get_base_addr(const H5F_t *f) +{ + haddr_t ret_value; + + FUNC_ENTER_NOAPI(H5F_get_base_addr, FAIL); + + assert(f); + assert(f->shared); + + /* Retrieve the file's base address */ + ret_value = f->shared->base_addr; + +done: + FUNC_LEAVE(ret_value); +} + /*------------------------------------------------------------------------- * Function: H5F_block_read diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h index ed96763..42f174c 100644 --- a/src/H5Fprivate.h +++ b/src/H5Fprivate.h @@ -354,6 +354,7 @@ H5_DLL herr_t H5F_get_obj_count(H5F_t *f, unsigned types, unsigned *obj_id_count); H5_DLL herr_t H5F_get_obj_ids(H5F_t *f, unsigned types, hid_t *obj_id_list); H5_DLL herr_t H5F_get_vfd_handle(H5F_t *file, hid_t fapl, void** file_handle); +H5_DLL haddr_t H5F_get_base_addr(const H5F_t *f); /* Functions that operate on array storage */ H5_DLL herr_t H5F_arr_read (H5F_t *f, hid_t dxpl_id, diff --git a/test/dsets.c b/test/dsets.c index b9d900c..a4f4a76 100644 --- a/test/dsets.c +++ b/test/dsets.c @@ -14,6 +14,7 @@ const char *FILENAME[] = { "dataset", "compact_dataset", + "dset_offset", NULL }; @@ -32,6 +33,7 @@ const char *FILENAME[] = { #define DSET_MISSING_NAME "missing" #define DSET_ONEBYTE_SHUF_NAME "onebyte_shuffle" +#define USER_BLOCK 512 #define H5Z_BOGUS 305 /* Shared global arrays */ @@ -213,13 +215,16 @@ test_create(hid_t file) *------------------------------------------------------------------------- */ static herr_t -test_simple_io(hid_t file) +test_simple_io(hid_t file, char *fname) { hid_t dataset, space, xfer; int i, j, n; hsize_t dims[2]; void *tconv_buf = NULL; - + FILE *f; + haddr_t offset; + int rdata[100][200]; + TESTING("simple I/O"); /* Initialize the dataset */ @@ -251,9 +256,29 @@ test_simple_io(hid_t file) if (H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer, points)<0) goto error; - /* Test dataset address. Should be valid. */ - if(H5Dget_offset(dataset)==HADDR_UNDEF) goto error; + /* Test dataset address in file. Open the same file as a C file, seek + * the data position as H5Dget_offset points to, read the dataset, and + * compare it with the data written in.*/ + if((offset=H5Dget_offset(dataset))==HADDR_UNDEF) goto error; + + f = fopen(fname, "r"); + fseek(f, (long int)offset, SEEK_SET); + fread(rdata, sizeof(int), 100*200, f); + /* Check that the values read are the same as the values written */ + for (i = 0; i < 100; i++) { + for (j = 0; j < 200; j++) { + if (points[i][j] != rdata[i][j]) { + H5_FAILED(); + printf(" Read different values than written.\n"); + printf(" At index %d,%d\n", i, j); + goto error; + } + } + } + + fclose(f); + /* Read the dataset back */ if (H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer, check)<0) goto error; @@ -282,6 +307,97 @@ test_simple_io(hid_t file) /*------------------------------------------------------------------------- + * Function: test_userblock_offset + * + * Purpose: Tests H5Dget_offset when user block exists. + * + * Return: Success: 0 + * + * Failure: -1 + * + * Programmer: Raymond Lu + * Wednesday, November 27, 2002 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static herr_t +test_userblock_offset(hid_t fapl) +{ + char filename[32]; + hid_t file, fcpl, dataset, space; + int i, j, n; + hsize_t dims[2]; + FILE *f; + haddr_t offset; + int rdata[100][200]; + + TESTING("dataset offset with user block"); + + h5_fixname(FILENAME[2], fapl, filename, sizeof filename); + + if((fcpl=H5Pcreate(H5P_FILE_CREATE))<0) goto error; + if(H5Pset_userblock(fcpl, USER_BLOCK)<0) goto error; + + if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl))<0) { + goto error; + } + + /* Initialize the dataset */ + /*for (i = n = 0; i < 100; i++) { + for (j = 0; j < 200; j++) { + points[i][j] = n++; + } + }*/ + + /* Create the data space */ + dims[0] = 100; + dims[1] = 200; + if ((space = H5Screate_simple(2, dims, NULL))<0) goto error; + + /* Create the dataset */ + if ((dataset = H5Dcreate(file, DSET_SIMPLE_IO_NAME, H5T_NATIVE_INT, space, + H5P_DEFAULT))<0) goto error; + + /* Write the data to the dataset */ + if (H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, points)<0) + goto error; + + /* Test dataset address in file. Open the same file as a C file, seek + * the data position as H5Dget_offset points to, read the dataset, and + * compare it with the data written in.*/ + if((offset=H5Dget_offset(dataset))==HADDR_UNDEF) goto error; + + f = fopen(filename, "r"); + fseek(f, (long int)offset, SEEK_SET); + fread(rdata, sizeof(int), 100*200, f); + + /* Check that the values read are the same as the values written */ + for (i = 0; i < 100; i++) { + for (j = 0; j < 200; j++) { + if (points[i][j] != rdata[i][j]) { + H5_FAILED(); + printf(" Read different values than written.\n"); + printf(" At index %d,%d\n", i, j); + goto error; + } + } + } + + fclose(f); + + H5Dclose(dataset); + H5Fclose(file); + PASSED(); + return 0; + + error: + return -1; +} + + +/*------------------------------------------------------------------------- * Function: test_compact_io * * Purpose: Tests compact dataset I/O. That is, reading and writing a @@ -1421,7 +1537,7 @@ main(void) if (H5Gclose (grp)<0) goto error; nerrors += test_create(file)<0 ?1:0; - nerrors += test_simple_io(file)<0 ?1:0; + nerrors += test_simple_io(file, filename)<0 ?1:0; nerrors += test_compact_io(fapl)<0 ?1:0; nerrors += test_tconv(file)<0 ?1:0; nerrors += test_compression(file)<0 ?1:0; @@ -1429,7 +1545,8 @@ main(void) nerrors += test_onebyte_shuffle(file)<0 ?1:0; nerrors += test_multiopen (file)<0 ?1:0; nerrors += test_types(file)<0 ?1:0; - + nerrors += test_userblock_offset(fapl)<0 ?1:0; + if (H5Fclose(file)<0) goto error; if (nerrors) goto error; printf("All dataset tests passed.\n"); diff --git a/test/ntypes.c b/test/ntypes.c index 63cc396..13ec6bf 100644 --- a/test/ntypes.c +++ b/test/ntypes.c @@ -164,7 +164,7 @@ test_atomic_dtype(hid_t file) if(H5Tclose(dtype)<0) TEST_ERROR; - /* Create the dataset of H5T_IEEE_F64BE */ + /* Create the dataset of H5T_IEEE_F32BE */ if ((dataset = H5Dcreate(file, DSET_ATOMIC_NAME_4, H5T_IEEE_F32BE, space, H5P_DEFAULT))<0) TEST_ERROR; diff --git a/test/tvlstr.c b/test/tvlstr.c index af809d6..702c920 100644 --- a/test/tvlstr.c +++ b/test/tvlstr.c @@ -120,6 +120,8 @@ test_vlstrings_basic(void) "testing whether that nation or any nation so conceived and so dedicated can long endure." }; /* Information to write */ char *rdata[SPACE1_DIM1]; /* Information read in */ + char *wdata2; + hid_t dataspace, dataset2; hid_t fid1; /* HDF5 File IDs */ hid_t dataset; /* Dataset ID */ hid_t sid1; /* Dataspace ID */ @@ -158,6 +160,21 @@ test_vlstrings_basic(void) ret=H5Dwrite(dataset,tid1,H5S_ALL,H5S_ALL,H5P_DEFAULT,wdata); CHECK(ret, FAIL, "H5Dwrite"); + dataspace = H5Screate(H5S_SCALAR); + + dataset2=H5Dcreate(fid1,"Dataset2",tid1,dataspace,H5P_DEFAULT); + CHECK(dataset, FAIL, "H5Dcreate"); + + wdata2 = (char*)HDcalloc(65534, sizeof(char)); + memset(wdata2, 65, 65534); + + ret=H5Dwrite(dataset2,tid1,H5S_ALL,H5S_ALL,H5P_DEFAULT,&wdata2); + CHECK(ret, FAIL, "H5Dwrite"); + + H5Sclose(dataspace); + H5Dclose(dataset2); + HDfree(wdata2); + /* Change to the custom memory allocation routines for reading VL string */ xfer_pid=H5Pcreate(H5P_DATASET_XFER); CHECK(xfer_pid, FAIL, "H5Pcreate"); @@ -327,8 +344,10 @@ static void test_write_vl_string_attribute(void) hid_t type; herr_t ret; char *string_att_check; + char *string_att_write; - file = H5Fopen(DATAFILE, H5F_ACC_RDWR, H5P_DEFAULT); + /*file = H5Fopen(DATAFILE, H5F_ACC_RDWR, H5P_DEFAULT);*/ + file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(file, FAIL, "H5Fopen"); /* Create a datatype to refer to. */ @@ -347,18 +366,23 @@ static void test_write_vl_string_attribute(void) att = H5Acreate(root, "test_scalar", type, dataspace, H5P_DEFAULT); CHECK(att, FAIL, "H5Acreate"); - ret = H5Awrite(att, type, &string_att); + string_att_write = (char*)HDcalloc(8192, sizeof(char)); + memset(string_att_write, 65, 8192); +printf("string_att_write=%s\n", string_att_write); + + ret = H5Awrite(att, type, &string_att_write); CHECK(ret, FAIL, "H5Awrite"); ret = H5Aread(att, type, &string_att_check); CHECK(ret, FAIL, "H5Aread"); - if(HDstrcmp(string_att_check,string_att)!=0) { + if(HDstrcmp(string_att_check,string_att_write)!=0) { num_errs++; - printf("VL string attributes don't match!, string_att=%s, string_att_check=%s\n",string_att,string_att_check); + printf("VL string attributes don't match!, string_att=%s, string_att_check=%s\n",string_att_write,string_att_check); } /* end if */ free(string_att_check); + free(string_att_write); ret = H5Aclose(att); CHECK(ret, FAIL, "HAclose"); @@ -446,11 +470,11 @@ test_vlstrings(void) /* These next tests use the same file */ /* Test basic VL string datatype */ test_vlstrings_basic(); - test_vlstring_type(); - + /* test_vlstring_type(); + */ /*Test using VL strings in attributes */ - test_write_vl_string_attribute(); - test_read_vl_string_attribute(); + /* test_write_vl_string_attribute(); + test_read_vl_string_attribute();*/ } /* test_vlstrings() */ -- cgit v0.12