From 6d211545b6fc95bff4ac6e08c383df5fac44fc77 Mon Sep 17 00:00:00 2001 From: Raymond Lu Date: Thu, 11 Apr 2002 17:53:26 -0500 Subject: [svn-r5171] Purpose: New feature Description: Fill-value's behaviors for contiguous dataset have been redefined. Basicly, dataset won't allocate space until it's necessary. Full details are available at http://hdf.ncsa.uiuc.edu/RFC/Fill_Value, at this moment. These two file test backward compatibility with 1.4. Platforms tested: Linux 2.2. --- test/fill_old.h5 | Bin 0 -> 2560 bytes test/fillval.c | 868 ++++++++++++++++++++++++++++++++++++++++++++++------ test/gen_new_fill.c | 76 +++++ 3 files changed, 846 insertions(+), 98 deletions(-) create mode 100644 test/fill_old.h5 create mode 100644 test/gen_new_fill.c diff --git a/test/fill_old.h5 b/test/fill_old.h5 new file mode 100644 index 0000000..e77f519 Binary files /dev/null and b/test/fill_old.h5 differ diff --git a/test/fillval.c b/test/fillval.c index 693bdc6..c966005 100644 --- a/test/fillval.c +++ b/test/fillval.c @@ -25,10 +25,62 @@ const char *FILENAME[] = { NULL }; +typedef struct { + float a; + int x; + double y; + char z; +} comp_datatype; + +/* The fill_old.h5 is generated from gen_old_fill.c in HDF5 'test' directory + * for version 1.4(after 1.4.3). To get this data file, simply compile + * gen_old_fill.c with HDF5 library (before v1.5) and run it. */ +#define FILE_COMPATIBLE "fill_old.h5" #define FILE_NAME_RAW "fillval.raw" /*------------------------------------------------------------------------- + * Function: create_compound_type + * + * Purpose: create a compound datatype + * + * Return: Success: datatype ID + * + * Failure: -1 + * + * Programmer: Raymond Lu + * Monday, Jan 26, 2001 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static hid_t create_compound_type(void) +{ + hid_t ret_value=-1; + + if((ret_value = H5Tcreate(H5T_COMPOUND, sizeof(comp_datatype)))<0) + goto error; + if(H5Tinsert(ret_value, "a", HOFFSET(comp_datatype,a), H5T_NATIVE_FLOAT)<0) + goto error; + if(H5Tinsert(ret_value, "x", HOFFSET(comp_datatype,x), H5T_NATIVE_INT)<0) + goto error; + if(H5Tinsert(ret_value, "y", HOFFSET(comp_datatype,y), + H5T_NATIVE_DOUBLE)<0) goto error; + if(H5Tinsert(ret_value, "z", HOFFSET(comp_datatype,z), H5T_NATIVE_CHAR)<0) + goto error; + + return ret_value; + + error: + H5E_BEGIN_TRY { + H5Tclose(ret_value); + } H5E_END_TRY; + return -1; +} + + +/*------------------------------------------------------------------------- * Function: test_getset * * Purpose: Tests the H5Pget_fill_value() and H5Pset_fill_value() @@ -88,9 +140,9 @@ test_getset(void) H5E_BEGIN_TRY { status = H5Pget_fill_value(dcpl, H5T_NATIVE_INT, &fill_i); } H5E_END_TRY; - if (status>=0) { + if (fill_i != 0) { H5_FAILED(); - puts(" H5Pget_fill_value() should have been negative"); + puts(" H5Pget_fill_value() should return default 0"); goto error; } @@ -164,19 +216,27 @@ test_getset(void) * Thursday, October 1, 1998 * * Modifications: - * + * Many new cases have been added to this test since + * the fill value design has been modified. + * *------------------------------------------------------------------------- */ static int test_create(hid_t fapl, const char *base_name, H5D_layout_t layout) { - hid_t file=-1, space=-1, dcpl=-1, dset1=-1, dset2=-1, dset3=-1; + hid_t file=-1, space=-1, dcpl=-1, comp_type_id=-1; + hid_t dset1=-1, dset2=-1, dset3=-1, dset4=-1, dset5=-1, + dset6=-1, dset7=-1, dset8=-1, dset9=-1; hsize_t cur_size[5] = {32, 16, 8, 4, 2}; hsize_t ch_size[5] = {1, 1, 1, 4, 2}; short rd_s, fill_s = 0x1234; long rd_l, fill_l = 0x4321; char filename[1024]; - + H5D_space_status_t allocation; + H5D_space_time_t alloc_time; + H5D_fill_time_t fill_time; + comp_datatype rd_c, fill_ctype; + if (H5D_CHUNKED==layout) { TESTING("chunked dataset creation"); } else { @@ -184,9 +244,7 @@ test_create(hid_t fapl, const char *base_name, H5D_layout_t layout) } /* - * Create a file and three datasets. The three datasets test three fill - * conversion paths: small to large, large to small, and no conversion. - * They depend on `short' being smaller than `long'. + * Create a file. */ h5_fixname(base_name, fapl, filename, sizeof filename); if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) @@ -196,87 +254,297 @@ test_create(hid_t fapl, const char *base_name, H5D_layout_t layout) if (H5D_CHUNKED==layout) { if (H5Pset_chunk(dcpl, 5, ch_size)<0) goto error; } + /* Create a compound datatype */ + if((comp_type_id = create_compound_type())<0) goto error; - /* Small to large fill conversion */ + /* I. Test cases for late space allocation */ + if(H5Pset_space_time(dcpl, H5D_SPACE_ALLOC_LATE) < 0) goto error; + if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC) < 0) goto error; + + /* 1. Compound datatype test */ + if(H5Pget_fill_value(dcpl, comp_type_id, &fill_ctype)<0) goto error; + fill_ctype.y = 4444; + if(H5Pset_fill_value(dcpl, comp_type_id, &fill_ctype)<0) goto error; + if((dset9 = H5Dcreate(file, "dset9", comp_type_id, space, dcpl))<0) + goto error; + + /* The three datasets test three fill + * conversion paths: small to large, large to small, and no conversion. + * They depend on `short' being smaller than `long'. + */ + /* 2. Small to large fill conversion */ #ifndef NO_FILLING if (H5Pset_fill_value(dcpl, H5T_NATIVE_SHORT, &fill_s)<0) goto error; #endif if ((dset1=H5Dcreate(file, "dset1", H5T_NATIVE_LONG, space, dcpl))<0) goto error; - /* Large to small fill conversion */ + /* 3. Large to small fill conversion */ #ifndef NO_FILLING if (H5Pset_fill_value(dcpl, H5T_NATIVE_LONG, &fill_l)<0) goto error; #endif if ((dset2=H5Dcreate(file, "dset2", H5T_NATIVE_SHORT, space, dcpl))<0) goto error; - /* No conversion */ + /* 4. No conversion */ #ifndef NO_FILLING if (H5Pset_fill_value(dcpl, H5T_NATIVE_LONG, &fill_l)<0) goto error; #endif if ((dset3=H5Dcreate(file, "dset3", H5T_NATIVE_LONG, space, dcpl))<0) goto error; - + + /* 5. late space allocation and never write fill value */ + if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_NEVER) < 0) goto error; + if ((dset4=H5Dcreate(file, "dset4", H5T_NATIVE_LONG, space, dcpl))<0) + goto error; + + /* 6. fill value is undefined while fill write time is H5D_FILL_TIME_ALLOC. + * Supposed to fail. */ + if(H5Pset_fill_value(dcpl, -1, NULL)<0) goto error; + if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC) < 0) goto error; + H5E_BEGIN_TRY { + if((dset7 = H5Dcreate(file, "dset7", H5T_NATIVE_LONG, space, dcpl))!=FAIL) + goto error; + } H5E_END_TRY; + + + + + /* II. Test early space allocation cases */ + if (H5Pclose(dcpl)<0) goto error; + if ((dcpl=H5Pcreate(H5P_DATASET_CREATE))<0) goto error; + if (H5D_CHUNKED==layout) { + if (H5Pset_chunk(dcpl, 5, ch_size)<0) goto error; + } + if(H5Pset_space_time(dcpl, H5D_SPACE_ALLOC_EARLY) < 0) goto error; + + /* 1. Compound datatype test */ + if(H5Pget_fill_value(dcpl, comp_type_id, &fill_ctype)<0) goto error; + fill_ctype.y = 4444; + if(H5Pset_fill_value(dcpl, comp_type_id, &fill_ctype)<0) goto error; + if((dset8 = H5Dcreate(file, "dset8", comp_type_id, space, dcpl))<0) + goto error; + + + if(H5Pset_fill_value(dcpl, H5T_NATIVE_LONG, &fill_l)<0) goto error; + + /* 2. Never write fill value */ + if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_NEVER) < 0) goto error; + if((dset5 = H5Dcreate(file, "dset5", H5T_NATIVE_INT, space, dcpl))<0) + goto error; + + /* 3. Write fill value at space allocation time */ + if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC) < 0) goto error; + if((dset6 = H5Dcreate(file, "dset6", H5T_NATIVE_LONG, space, dcpl))<0) + goto error; + + /* 4. fill value is undefined while fill write time is H5D_FILL_TIME_ALLOC. + * Supposed to fail. */ + if(H5Pset_fill_value(dcpl, -1, NULL)<0) goto error; + H5E_BEGIN_TRY { + if((dset7 = H5Dcreate(file, "dset7", H5T_NATIVE_LONG, space, dcpl))!=FAIL) + goto error; + } H5E_END_TRY; + + /* Close everything */ if (H5Dclose(dset1)<0) goto error; if (H5Dclose(dset2)<0) goto error; if (H5Dclose(dset3)<0) goto error; + if (H5Dclose(dset4)<0) goto error; + if (H5Dclose(dset5)<0) goto error; + if (H5Dclose(dset6)<0) goto error; + if (H5Dclose(dset8)<0) goto error; + if (H5Dclose(dset9)<0) goto error; if (H5Sclose(space)<0) goto error; - if (H5Pclose(dcpl)<0) goto error; - if (H5Fclose(file)<0) goto error; + if (H5Pclose(dcpl)<0) goto error; + if (H5Fclose(file)<0) goto error; /* Open the file and get the dataset fill value from each dataset */ if ((file=H5Fopen(filename, H5F_ACC_RDONLY, fapl))<0) goto error; - /* Large to small conversion */ + /* I. Test cases for late space allocation */ + + /* 1. Large to small conversion */ if ((dset1=H5Dopen(file, "dset1"))<0) goto error; if ((dcpl=H5Dget_create_plist(dset1))<0) goto error; - if (H5Dclose(dset1)<0) goto error; #ifndef NO_FILLING if (H5Pget_fill_value(dcpl, H5T_NATIVE_SHORT, &rd_s)<0) goto error; if (rd_s!=fill_s) { H5_FAILED(); - puts(" Got a different fill value than what was set."); + printf(" %d: Got a different fill value than what was set.",__LINE__); printf(" Got %d, set %d\n", rd_s, fill_s); goto error; } #endif + if (H5Dclose(dset1)<0) goto error; if (H5Pclose(dcpl)<0) goto error; - /* Small to large conversion */ + /* 2. Small to large conversion */ if ((dset2=H5Dopen(file, "dset2"))<0) goto error; if ((dcpl=H5Dget_create_plist(dset2))<0) goto error; - if (H5Dclose(dset2)<0) goto error; #ifndef NO_FILLING if (H5Pget_fill_value(dcpl, H5T_NATIVE_LONG, &rd_l)<0) goto error; if (rd_l!=fill_l) { H5_FAILED(); - puts(" Got a different fill value than what was set."); + printf(" %d: Got a different fill value than what was set.",__LINE__); printf(" Got %ld, set %ld\n", rd_l, fill_l); goto error; } #endif + if (H5Dclose(dset2)<0) goto error; if (H5Pclose(dcpl)<0) goto error; - /* No conversion */ + /* 3. No conversion */ if ((dset3=H5Dopen(file, "dset3"))<0) goto error; if ((dcpl=H5Dget_create_plist(dset3))<0) goto error; - if (H5Dclose(dset3)<0) goto error; #ifndef NO_FILLING if (H5Pget_fill_value(dcpl, H5T_NATIVE_LONG, &rd_l)<0) goto error; if (rd_l!=fill_l) { H5_FAILED(); - puts(" Got a different fill value than what was set."); + printf(" %d: Got a different fill value than what was set.",__LINE__); printf(" Got %ld, set %ld\n", rd_l, fill_l); goto error; } #endif + if(H5Pget_space_time(dcpl, &alloc_time)<0) goto error; + if(H5Pget_fill_time(dcpl, &fill_time)<0) goto error; + if(alloc_time != H5D_SPACE_ALLOC_LATE) { + H5_FAILED(); + puts(" Got non-H5D_SPACE_ALLOC_LATE space allocation time."); + printf(" Got %d\n", alloc_time); + } + if(fill_time != H5D_FILL_TIME_ALLOC) { + H5_FAILED(); + puts(" Got non-H5D_FILL_TIME_ALLOC fill value write time."); + printf(" Got %d\n", fill_time); + } + if (H5Dclose(dset3)<0) goto error; if (H5Pclose(dcpl)<0) goto error; - - + /* 4. late space allocation and never write fill value */ + if ((dset4=H5Dopen(file, "dset4"))<0) goto error; + if (H5Dget_space_status(dset4, &allocation)<0) goto error; +#ifndef H5_HAVE_PARALLEL + if (layout == H5D_CONTIGUOUS && allocation != H5D_SPACE_STATUS_NOT_ALLOCATED) { + H5_FAILED(); + puts(" Got allocated space instead of unallocated."); + printf(" Got %d\n", allocation); + goto error; + } +#else + if (layout == H5D_CONTIGUOUS && allocation == H5D_SPACE_STATUS_NOT_ALLOCATED) { + H5_FAILED(); + printf(" %d: Got unallocated space instead of allocated.\n",__LINE__); + printf(" Got %d\n", allocation); + goto error; + } +#endif + if ((dcpl=H5Dget_create_plist(dset4))<0) goto error; + if(H5Pget_space_time(dcpl, &alloc_time)<0) goto error; + if(H5Pget_fill_time(dcpl, &fill_time)<0) goto error; + if(alloc_time != H5D_SPACE_ALLOC_LATE) { + H5_FAILED(); + puts(" Got non-H5D_SPACE_ALLOC_LATE space allocation time."); + printf(" Got %d\n", alloc_time); + } + if(fill_time != H5D_FILL_TIME_NEVER) { + H5_FAILED(); + puts(" Got non-H5D_FILL_TIME_NEVER fill value write time."); + printf(" Got %d\n", fill_time); + } + if (H5Dclose(dset4)<0) goto error; + if (H5Pclose(dcpl)<0) goto error; + + + /* II. Check early space allocation case */ + + /* 1. Never write fill value */ + if ((dset5=H5Dopen(file, "dset5"))<0) goto error; + if ((dcpl=H5Dget_create_plist(dset5))<0) goto error; + if (H5Dget_space_status(dset5, &allocation)<0) goto error; + if (layout == H5D_CONTIGUOUS && allocation != H5D_SPACE_STATUS_ALLOCATED) { + H5_FAILED(); + printf(" %d: Got unallocated space instead of allocated.\n",__LINE__); + printf(" Got %d\n", allocation); + goto error; + } + if(H5Pget_space_time(dcpl, &alloc_time)<0) goto error; + if(alloc_time != H5D_SPACE_ALLOC_EARLY) { + H5_FAILED(); + puts(" Got non-H5D_SPACE_ALLOC_EARLY space allocation time."); + printf(" Got %d\n", alloc_time); + } + if(H5Pget_fill_time(dcpl, &fill_time)<0) goto error; + if(fill_time != H5D_FILL_TIME_NEVER) { + H5_FAILED(); + puts(" Got non-H5D_FILL_TIME_NEVER fill value write time."); + printf(" Got %d\n", fill_time); + } + if (H5Dclose(dset5)<0) goto error; + if (H5Pclose(dcpl)<0) goto error; + + /* 2. test writing fill value at space allocation time */ + if ((dset6=H5Dopen(file, "dset6"))<0) goto error; + if ((dcpl=H5Dget_create_plist(dset6))<0) goto error; + if (H5Dget_space_status(dset6, &allocation)<0) goto error; + if (layout == H5D_CONTIGUOUS && allocation != H5D_SPACE_STATUS_ALLOCATED) { + H5_FAILED(); + printf(" %d: Got unallocated space instead of allocated.\n",__LINE__); + printf(" Got %d\n", allocation); + goto error; + } + if (H5Pget_fill_value(dcpl, H5T_NATIVE_LONG, &rd_l)<0) goto error; + if (rd_l!=fill_l) { + H5_FAILED(); + printf(" %d: Got a different fill value than what was set.",__LINE__); + printf(" Got %ld, set %ld\n", rd_l, fill_l); + goto error; + } + if(H5Pget_space_time(dcpl, &alloc_time)<0) goto error; + if(alloc_time != H5D_SPACE_ALLOC_EARLY) { + H5_FAILED(); + puts(" Got non-H5D_SPACE_ALLOC_EARLY space allocation time."); + printf(" Got %d\n", alloc_time); + } + if(H5Pget_fill_time(dcpl, &fill_time)<0) goto error; + if(fill_time != H5D_FILL_TIME_ALLOC) { + H5_FAILED(); + puts(" Got non-H5D_FILL_TIME_ALLOC fill value write time."); + printf(" Got %d\n", fill_time); + } + if (H5Dclose(dset6)<0) goto error; + if (H5Pclose(dcpl)<0) goto error; + + /* 3. Compound datatype test */ + if ((dset8=H5Dopen(file, "dset8"))<0) goto error; + if ((dcpl=H5Dget_create_plist(dset8))<0) goto error; + if (H5Pget_fill_value(dcpl, comp_type_id, &rd_c)<0) goto error; + if( rd_c.a != 0 || rd_c.y != fill_ctype.y || rd_c.x != 0 || rd_c.z!='\0') { + H5_FAILED(); + puts(" Got wrong fill value"); + printf(" Got rd_c.a=%f, rd_c.y=%f and rd_c.x=%d, rd_c.z=%c\n", + rd_c.a, rd_c.y, rd_c.x, rd_c.z); + } + if (H5Dclose(dset8)<0) goto error; + if (H5Pclose(dcpl)<0) goto error; + + /* 4. Compound datatype test */ + if ((dset9=H5Dopen(file, "dset9"))<0) goto error; + if ((dcpl=H5Dget_create_plist(dset9))<0) goto error; + if (H5Pget_fill_value(dcpl, comp_type_id, &rd_c)<0) goto error; + if( rd_c.a!=0 || rd_c.y != fill_ctype.y || rd_c.x != 0 || rd_c.z != '\0') { + H5_FAILED(); + puts(" Got wrong fill value"); + printf(" Got rd_c.a=%f, rd_c.y=%f and rd_c.x=%d, rd_c.z=%c\n", + rd_c.a, rd_c.y, rd_c.x, rd_c.z); + } + if (H5Dclose(dset9)<0) goto error; + if (H5Pclose(dcpl)<0) goto error; + + + if (H5Tclose(comp_type_id)<0) goto error; if (H5Fclose(file)<0) goto error; PASSED(); return 0; @@ -288,66 +556,65 @@ test_create(hid_t fapl, const char *base_name, H5D_layout_t layout) H5Dclose(dset1); H5Dclose(dset2); H5Dclose(dset3); + H5Dclose(dset4); + H5Dclose(dset5); + H5Dclose(dset6); + H5Dclose(dset8); + H5Dclose(dset9); H5Fclose(file); } H5E_END_TRY; return 1; } - /*------------------------------------------------------------------------- - * Function: test_rdwr + * Function: test_rdwr_cases * - * Purpose: Tests fill values for chunked datasets. + * Purpose: Tests fill values read and write for datasets. * * Return: Success: 0 * - * Failure: number of errors + * Failure: 1 * * Programmer: Robb Matzke * Thursday, October 1, 1998 * * Modifications: + * This function is called by test_rdwr to write and read + * dataset for different cases. * *------------------------------------------------------------------------- */ static int -test_rdwr(hid_t fapl, const char *base_name, H5D_layout_t layout) +test_rdwr_cases(hid_t file, hid_t dcpl, const char *dname, void *_fillval, + H5D_fill_time_t fill_time, H5D_layout_t layout, + H5T_class_t datatype, hid_t ctype_id) { - hid_t file=-1, fspace=-1, mspace=-1, dcpl=-1, dset=-1; + hid_t fspace=-1, mspace=-1, dset1=-1, dset2=-1; hsize_t cur_size[5] = {32, 16, 8, 4, 2}; - hsize_t ch_size[5] = {1, 16, 8, 4, 2}; hsize_t one[5] = {1, 1, 1, 1, 1}; hsize_t hs_size[5], hs_stride[5]; hssize_t hs_offset[5], nelmts; -#ifdef NO_FILLING - int fillval = 0; -#else - int fillval = 0x4c70f1cd; -#endif - int val_rd, should_be; + int fillval, val_rd, should_be; int i, j, *buf=NULL, odd; - char filename[1024]; + comp_datatype rd_c, fill_c, should_be_c; + comp_datatype *buf_c=NULL; + H5D_space_status_t allocation; - if (H5D_CHUNKED==layout) { - TESTING("chunked dataset I/O"); - } else { - TESTING("contiguous dataset I/O"); + if (datatype==H5T_INTEGER) + fillval = *(int*)_fillval; + else if(datatype==H5T_COMPOUND) { + fill_c.a=((comp_datatype*)_fillval)->a; + fill_c.x=((comp_datatype*)_fillval)->x; + fill_c.y=((comp_datatype*)_fillval)->y; + fill_c.z=((comp_datatype*)_fillval)->z; } - - /* Create a file and dataset */ - h5_fixname(base_name, fapl, filename, sizeof filename); - if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) - goto error; + + /* Create dataset */ if ((fspace=H5Screate_simple(5, cur_size, cur_size))<0) goto error; - if ((dcpl=H5Pcreate(H5P_DATASET_CREATE))<0) goto error; - if (H5D_CHUNKED==layout) { - if (H5Pset_chunk(dcpl, 5, ch_size)<0) goto error; - } -#ifndef NO_FILLING - if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval)<0) goto error; -#endif - if ((dset=H5Dcreate(file, "dset", H5T_NATIVE_INT, fspace, dcpl))<0) - goto error; + if (datatype==H5T_INTEGER && (dset1=H5Dcreate(file, dname, H5T_NATIVE_INT, + fspace, dcpl))<0) goto error; + if (datatype==H5T_COMPOUND && (dset2=H5Dcreate(file, dname, ctype_id, + fspace, dcpl))<0) goto error; /* Read some data and make sure it's the fill value */ if ((mspace=H5Screate_simple(5, one, NULL))<0) goto error; @@ -357,18 +624,38 @@ test_rdwr(hid_t fapl, const char *base_name, H5D_layout_t layout) } if (H5Sselect_hyperslab(fspace, H5S_SELECT_SET, hs_offset, NULL, one, NULL)<0) goto error; - if (H5Dread(dset, H5T_NATIVE_INT, mspace, fspace, H5P_DEFAULT, - &val_rd)<0) goto error; - if (val_rd!=fillval) { - H5_FAILED(); - puts(" Value read was not a fill value."); - printf(" Elmt={%ld,%ld,%ld,%ld,%ld}, read: %u, " - "Fill value: %u\n", - (long)hs_offset[0], (long)hs_offset[1], - (long)hs_offset[2], (long)hs_offset[3], - (long)hs_offset[4], val_rd, fillval); - goto error; - } + /* case for atomic datatype */ + if (datatype==H5T_INTEGER) { + if(H5Dread(dset1, H5T_NATIVE_INT, mspace, fspace, H5P_DEFAULT, + &val_rd)<0) goto error; + if (fill_time!=H5D_FILL_TIME_NEVER && val_rd!=fillval) { + H5_FAILED(); + puts(" Value read was not a fill value."); + printf(" Elmt={%ld,%ld,%ld,%ld,%ld}, read: %u, " + "Fill value: %u\n", + (long)hs_offset[0], (long)hs_offset[1], + (long)hs_offset[2], (long)hs_offset[3], + (long)hs_offset[4], val_rd, fillval); + goto error; + } + /* case for compound datatype */ + } else if(datatype==H5T_COMPOUND) { + if(H5Dread(dset2, ctype_id, mspace, fspace, H5P_DEFAULT, + &rd_c)<0) goto error; + if (fill_time!=H5D_FILL_TIME_NEVER && (rd_c.a!=fill_c.a || + rd_c.x!=fill_c.x || rd_c.y!=fill_c.y || + rd_c.z!=fill_c.z)) { + H5_FAILED(); + puts(" Value read was not a fill value."); + printf(" Elmt={%ld,%ld,%ld,%ld,%ld}, read: %f, %d, %f, %c" + "Fill value: %f, %d, %f, %c\n", + (long)hs_offset[0], (long)hs_offset[1], + (long)hs_offset[2], (long)hs_offset[3], + (long)hs_offset[4], rd_c.a, rd_c.x, rd_c.y, rd_c.z, + fill_c.a, fill_c.x, fill_c.y, fill_c.z); + goto error; + } + } } if (H5Sclose(mspace)<0) goto error; @@ -380,13 +667,44 @@ test_rdwr(hid_t fapl, const char *base_name, H5D_layout_t layout) nelmts *= hs_size[i]; } if ((mspace=H5Screate_simple(5, hs_size, hs_size))<0) goto error; - assert((nelmts*sizeof(int))==(hssize_t)((size_t)(nelmts*sizeof(int)))); /*check for overflow*/ - buf = malloc((size_t)(nelmts*sizeof(int))); - for (i=0; i + * Feb 27, 2002 + * + * Purpose: This program is run to generate a HDF5 data file with fill + * value property. A new fill value design has been put into + * library v1.5. To test compatibility between v1.4 and v1.5, + * compile and run this program, it will generate a file called + * fill_new.h5. You need to move it to the /test directory + * in HDF5 v1.4 source codes. The fillval.c program will read it. + * + */ + +#include "h5test.h" + +#define FILENAME "fill_new.h5" + +int main() +{ + hid_t file=-1, dcpl=-1, space=-1, dset1=-1, dset2=-1; + hsize_t cur_size[2]={8, 8}; + H5D_space_status_t allocation; + int fill_val1 = 4444, fill_val2=5555; + + if((file=H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) + <0) goto error; + if((space=H5Screate_simple(2, cur_size, cur_size))<0) goto error; + if((dcpl=H5Pcreate(H5P_DATASET_CREATE))<0) goto error; + + /* Create a dataset with space being allocated and fill value written */ + if(H5Pset_space_time(dcpl, H5D_EARLY) < 0) goto error; + if(H5Pset_fill_time(dcpl, H5D_ALLOC) < 0) goto error; + if(H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fill_val1)<0) goto error; + if((dset1 = H5Dcreate(file, "dset1", H5T_NATIVE_INT, space, dcpl))<0) + goto error; + if (H5Dget_space_status(dset1, &allocation)<0) goto error; + if (allocation == H5D_SPACE_STATUS_NOT_ALLOCATED) { + puts(" Got unallocated space instead of allocated."); + printf(" Got %d\n", allocation); + goto error; + } + if(H5Dclose(dset1)<0) goto error; + + /* Create a dataset with space allocation being delayed */ + if(H5Pset_space_time(dcpl, H5D_LATE) < 0) goto error; + if(H5Pset_fill_time(dcpl, H5D_ALLOC) < 0) goto error; + if(H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fill_val2)<0) goto error; + if((dset2 = H5Dcreate(file, "dset2", H5T_NATIVE_INT, space, dcpl))<0) + goto error; + if (H5Dget_space_status(dset2, &allocation)<0) goto error; + if (allocation != H5D_SPACE_STATUS_NOT_ALLOCATED) { + puts(" Got allocated space instead of unallocated."); + printf(" Got %d\n", allocation); + goto error; + } + if(H5Dclose(dset2)<0) goto error; + + if(H5Sclose(space)<0) goto error; + if(H5Pclose(dcpl)<0) goto error; + if(H5Fclose(file)<0) goto error; + + return 0; + + error: + H5E_BEGIN_TRY { + H5Pclose(dcpl); + H5Sclose(space); + H5Dclose(dset1); + H5Dclose(dset2); + H5Fclose(file); + } H5E_END_TRY; + return 1; +} -- cgit v0.12